<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/83661>83661</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [codegen] x86 MXCSR load/restore reordered with respect to the operations they should be measuring
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          thiagomacieira
      </td>
    </tr>
</table>

<pre>
    Testcase:
```c++
#include <immintrin.h>

inline bool cvtsd2ss(double v, float *value)
{
 _mm_setcsr(_MM_MASK_MASK);      // clear stored exception indicators
 __m128d mv = _mm_set_sd(v);

    __m128 mf = _mm_cvtsd_ss(_mm_setzero_ps(), mv);
    *value = _mm_cvtss_f32(mf);

    // any exceptions?
    constexpr unsigned Unwanted = _MM_EXCEPT_OVERFLOW | _MM_EXCEPT_UNDERFLOW;
    unsigned csr = _mm_getcsr();
    return (csr & Unwanted) == 0;
}

double toDouble(const char *str);
float toFloat(const char *str, bool *ok)
{
    float result;
    bool b = cvtsd2ss(toDouble(str), &result);
    if (ok)
        *ok = b;
    return result;
}
```

The `_mm_getcsr()` at the end of `cvtss2sd` is meant to check if the conversions above produced an exception or not. GCC generates the proper code:
```asm
        call    toDouble(char const*)@PLT
        movl    $8064, 12(%rsp)
        vldmxcsr 12(%rsp)
        vmovq   %xmm0, %xmm1
        vxorps  %xmm0, %xmm0, %xmm0
        vcvtsd2ss       %xmm1, %xmm0, %xmm0
        testq   %rbx, %rbx
        je      .L1
        vstmxcsr        12(%rsp)
 testb   $24, 12(%rsp)
        sete    (%rbx)
```

Clang, however, reordered the `vstmxcsr` up, above the conversion:
```asm
        callq toDouble(char const*)@PLT
        movl    $8064, 12(%rsp) # imm = 0x1F80
        vldmxcsr        12(%rsp)
        vstmxcsr 8(%rsp)
        testq   %rbx, %rbx
        je      .LBB0_2
 movl    8(%rsp), %eax
        testb   $24, %al
        sete (%rbx)
.LBB0_2:
        vmovq   %xmm0, %xmm0                    # xmm0 = xmm0[0],zero
        vxorps  %xmm1, %xmm1, %xmm1
        vcvtsd2ss %xmm0, %xmm1, %xmm0
```
Godbolt test: https://gcc.godbolt.org/z/fj7KoacrM

LLVM:
```
define dso_local noundef float @toFloat(char const*, bool*)(ptr noundef %0, ptr noundef writeonly %1) local_unnamed_addr #0 !dbg !272 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  tail call void @llvm.dbg.value(metadata ptr %0, metadata !279, metadata !DIExpression()), !dbg !283
  tail call void @llvm.dbg.value(metadata ptr %1, metadata !280, metadata !DIExpression()), !dbg !283
  %5 = tail call noundef double @toDouble(char const*)(ptr noundef %0) #3, !dbg !284
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3), !dbg !285
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4), !dbg !285
  tail call void @llvm.dbg.value(metadata double %5, metadata !291, metadata !DIExpression()), !dbg !300
  tail call void @llvm.dbg.value(metadata ptr undef, metadata !292, metadata !DIExpression()), !dbg !300
  store i32 8064, ptr %3, align 4, !dbg !285
  call void @llvm.x86.sse.ldmxcsr(ptr nonnull %3), !dbg !285
  tail call void @llvm.dbg.value(metadata <2 x double> poison, metadata !293, metadata !DIExpression()), !dbg !300
  tail call void @llvm.dbg.value(metadata <4 x float> poison, metadata !295, metadata !DIExpression()), !dbg !300
  tail call void @llvm.dbg.value(metadata float poison, metadata !281, metadata !DIExpression()), !dbg !283
  tail call void @llvm.dbg.value(metadata i32 24, metadata !296, metadata !DIExpression()), !dbg !300
  call void @llvm.x86.sse.stmxcsr(ptr nonnull %4), !dbg !301
  %6 = load i32, ptr %4, align 4, !dbg !301
  tail call void @llvm.dbg.value(metadata i32 %6, metadata !298, metadata !DIExpression()), !dbg !300
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3), !dbg !302
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4), !dbg !302
  tail call void @llvm.dbg.value(metadata i32 %6, metadata !282, metadata !DIExpression(DW_OP_constu, 24, DW_OP_and, DW_OP_constu, 0, DW_OP_eq, DW_OP_LLVM_convert, 1, DW_ATE_unsigned, DW_OP_LLVM_convert, 8, DW_ATE_unsigned, DW_OP_stack_value)), !dbg !283
 %7 = icmp eq ptr %1, null, !dbg !303
  br i1 %7, label %12, label %8, !dbg !305

8:
  %9 = and i32 %6, 24, !dbg !306
  tail call void @llvm.dbg.value(metadata i32 %9, metadata !282, metadata !DIExpression(DW_OP_constu, 0, DW_OP_eq, DW_OP_LLVM_convert, 1, DW_ATE_unsigned, DW_OP_LLVM_convert, 8, DW_ATE_unsigned, DW_OP_stack_value)), !dbg !283
  %10 = icmp eq i32 %9, 0, !dbg !307
  tail call void @llvm.dbg.value(metadata i1 %10, metadata !282, metadata !DIExpression(DW_OP_LLVM_convert, 1, DW_ATE_unsigned, DW_OP_LLVM_convert, 8, DW_ATE_unsigned, DW_OP_stack_value)), !dbg !283
  %11 = zext i1 %10 to i8, !dbg !308
  tail call void @llvm.dbg.value(metadata i8 %11, metadata !282, metadata !DIExpression()), !dbg !283
  store i8 %11, ptr %1, align 1, !dbg !309
  br label %12, !dbg !314

12:
  %13 = insertelement <2 x double> <double poison, double 0.000000e+00>, double %5, i64 0, !dbg !315
 tail call void @llvm.dbg.value(metadata <2 x double> %13, metadata !293, metadata !DIExpression()), !dbg !300
  %14 = call noundef <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float> zeroinitializer, <2 x double> %13), !dbg !316
  tail call void @llvm.dbg.value(metadata <4 x float> %14, metadata !295, metadata !DIExpression()), !dbg !300
  %15 = extractelement <4 x float> %14, i64 0, !dbg !317
  tail call void @llvm.dbg.value(metadata float %15, metadata !281, metadata !DIExpression()), !dbg !283
  ret float %15, !dbg !318
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWVtz4jjT_jXKjWopW7bBXHBBIGx9tck3U7vZw51LWA1oxpYYSWaY_Pq3JNngA2Ryet9aKhUbu9Xq5-mnpbahWvOtAJih5BYlyxtamZ1UM7PjdCtLmnPgit6sJfsxewRtcqoBRXMULFEwR-PA_-WI3No_f5VEXORFxQCjaMHLkgujuBjtUHRXW7j_XBRcAF5LWeD8YDQjWiOSMlmtC8AHRBZ4U0hqMCLzAy0qQGRaj5_UU-GsLDMNJtcKkTR7eMge5n_85v5Z4-gWuw8iK0RWOC-AKqyNVMAwHHPYGy4F5oLxnBqpdOM0K0OSMlweMIqWzRyZZoikB--3jcPO4IfgcnMa4RBlDlHt4AmUzPb2gvVBFrjsOPOBeqQdLzrbRASRtNxcnrtGR8WPMyiNotXZIpdCGzjuFa6EyzbDf4rvVBhgfqaHh-zun8Xd58fs0193v6_uP_2N0WTRvv7n_y_9jU68J3e5VqeYt00--ugUmEoJjEjqzMn4FAUiUzvcegjOCCfLNtRaF0Yu3Yn1YmHhfEets7k2qj2hl46RK3u8bLzw2kNkLr9e0BbGtf4U6KowHShu4NpBbkm3FVsdDVlYnLWDHh18Y6loTY1xI9e5_Op8ry_x1wvnTFNTjW3WHneA0TgY5GUcYEvPDjAIhuXGGjmxEc3sTa5xCVRYBnG-g_yrDdea51IcQGmrMUzX8gB4rySrcmCYilZVSYWFNCP862KBtyBAUQPaedgruQeFc8kurCRUl10ycloU9tjOu02iyycicwsmDj7fP3aHlfJQeC7jNBjHNhEhcdgTpfcDyg8FK49Wlc8alfLwzflMjmUZ-OTa07Bnd5Rqry_YdU67QxoVnSTg_b5gqAFt6qjU-lib2bOO1Rfwx9F9P1htPPL6c5EAO8fas0l-yqUGAx5D2sQ0fUahi4KKrfW5k9_hAK4uFUjFwC7Txuu3idJKs9pbE6-9riJfKKdvHy4mjEiEeVm6og2O4Srt57fR13Ms9zOSXrd5bdJvb4OM1DcbNF333gXQ43CiTuYRSWhxIeHDbDezRvMXllGAL3wss-6epdbZJ7cBSpaILOyG-lzlhe0KvVqsp8q7UNb9musJ-FfJ1rIwjiQUzfHOmL22eN2OvM3z0dZbjKTaIrJ6QmS1-TL5TdJcPbRr4P7-r4eheOt9Dza2TWJaZoXMaYGFrASDTdMcxUFrk-uK2W9wta5JujfqNBiRxCFtX_uuuAEpih_2bmhl7SbMKiFoCSyjjNnNMwowIiFbb-2BTAhubZmIJJHLFC3sWMxt57LAtOBbgeOWVfxzK0N54Zf_g-TMAi2KQzli6-2obgfTEgxl1FAHo4F0uujCm_YvLf_v7rhXoN2CUfditfxPoNLoHUGEgyDSQVyvCwKRJHF8naNpclZ3RU4F19e0S7l3i1bUn_PE_hBzwTdgeAkjbagyo32ASMrHMY7POhKiKgonggtwko9xHT_n-jXpaqgjSTLI2HSQxBdkLAqCt8rGJWYYBXlfFO5Rx1YXbratWqJRu9xenqZjOh5pDaN6MzvJ6mVpfw0nKFoQfKxThKI7vJdcW8h9hqL_XZ5QtIjx0S-7z4U0UNN_LyS_BVwJJH2Lht-49FmN-f6gy8X4fVxcl2DTDw4kOFweoiBsLaRjt5AWkrJm26lrIr5aEy0Hr-XETjhkJf1oVk7rJwj22oU5CshHOL7EO_lQ2tKfrYbLv7NPnzO371XW1AvSX6WCnb-cTYLzRfh2Prf9WOafK4zr9utb88e7rHnncd06fdZaG5p_zU4vtK4XICLJxImV5-Uew7dOf2Fp79N9qty1wjx0461JQdfgUhSSzte0Pz5pt6Rpq29HJJn6fk2wTn7IoFLG70j5oFV7fcr_zfl0KQg6GW0DD_pUTt5EZeineSuV_x6mQsfUExzNCRQ2EvOBbNM38ZT6SV7P009Cr3uulvt22fr9JexDmLYqt1euLbMwbhdoSLoVGvoHLy40KAMFlCDMsI9C0aLue89dQ30hGAXuA4jcBgGK7lr3mibZrv59oYZNh_euBs8h-PD-znr1j5qdp6Z-K9frLsio9VK3b_sESnLBDacFf_Kvq66B6ccVvml1HARrMX1422m9-odMOBpF87aELk9_UQtvWrSan3mScPgk9t4uVoHp-2_Hm157iX7DZhGbRlN6A7NwEkyjcRglyc1uNo3TIIWYJMkmphTWIYlyFk-ifL2Jg3Cc3vAZCUgcRAEJxlGSJCPINzlh-SaicR6HdILiAErKi5FjRKrtDde6glkajcfhjat_3fwcp2bW6Jd1tdWWQq6NPg8z3BTuh7tcMtiCQMkSH9Mxfvhn8cfvrsdFZKXAL0nnd6rfudlhBXoPuXu_b3aA5R4Udb8c2a8_sN7JqmB4DbgEqivFxfamUsWs94qLm121HuWyRGRlw6oPv-yV_AK5QWTloGlEVg7dfwIAAP__ljMXPg">