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

    <tr>
        <th>Summary</th>
        <td>
            -fassociative-math optimization issue with clang 13+
        </td>
    </tr>

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

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

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

<pre>
    I ran into optimizer issue (clang 13 and above) where `else` branch partially gets optimized out when compiling with `-fassociative-math -O2` compiler options.

This code

```cpp
                if (bits == 0)
                {
                        c0  = 1.0f;
                        c6  = 2.0f;
                        c8  = 3.0f;
                        c10 = 4.0f;
                }
                else
                {
                        c0  = _a;
                        c6  = 5.0f;
                        c8  = 6.0f;
                        c10 = 7.0f;
                }
```

Optimizer turns into:

```cpp
                c6  = 2.0f;
                c8  = 3.0f;
                c10 = 4.0f;

                if (bits == 0)
                {
                        c0  = 1.0f;
                }
                else
                {
                        c0  = _a;
                }
```

The issue occurs with clang 13 and above (tested with 13, 14, 15, 16), but not in clang 12.

Compiler options: `-fassociative-math -O2`

Compiler Explorer: https://godbolt.org/z/9zvfYo3xa

```cpp
        float test(float _a)
        {
                int bits = int(_a);

                float c0, c6, c8, c10;

                if (bits == 0)
                {
                        c0  = 1.0f;
                        c6  = 2.0f;
                        c8  = 3.0f;
                        c10 = 4.0f;
                }
                else
                {
                        c0  = _a;
                        c6  = 5.0f;
                        c8  = 6.0f;
                        c10 = 7.0f;
                }

                float tmp0   = c10  * _a + c8;
                float tmp1   = tmp0 * _a + c6;
                float result = tmp1 * c0;

                return result;
    }
```

Output for clang 12.0.1:

```asm
.LCPI0_0:
        .long   0x3f800000                      # float 1
.LCPI0_1:
        .long   0x40000000                      # float 2
.LCPI0_2:
        .long   0x40400000                      # float 3
.LCPI0_3:
        .long   0x40800000                      # float 4
.LCPI0_4:
        .long   0x40a00000                      # float 5
.LCPI0_5:
        .long   0x40c00000                      # float 6
.LCPI0_6:
        .long   0x40e00000                      # float 7
test(float):                               # @test(float)
        cvttss2si       eax, xmm0
        test    eax, eax
        je      .LBB0_1
        movss   xmm2, dword ptr [rip + .LCPI0_4] # xmm2 = mem[0],zero,zero,zero
        movss   xmm4, dword ptr [rip + .LCPI0_5] # xmm4 = mem[0],zero,zero,zero
        movss   xmm1, dword ptr [rip + .LCPI0_6] # xmm1 = mem[0],zero,zero,zero
        movaps  xmm3, xmm0
        jmp     .LBB0_3
.LBB0_1:
        movss   xmm3, dword ptr [rip + .LCPI0_0] # xmm3 = mem[0],zero,zero,zero
        movss   xmm2, dword ptr [rip + .LCPI0_1] # xmm2 = mem[0],zero,zero,zero
        movss   xmm4, dword ptr [rip + .LCPI0_2] # xmm4 = mem[0],zero,zero,zero
        movss   xmm1, dword ptr [rip + .LCPI0_3] # xmm1 = mem[0],zero,zero,zero
.LBB0_3:
        mulss   xmm1, xmm0
        addss   xmm1, xmm4
        mulss   xmm1, xmm0
        addss   xmm1, xmm2
        mulss   xmm1, xmm3
        movaps  xmm0, xmm1
        ret
```

Output for clang 14.0.0

```asm
.LCPI0_0:
        .long   0x3f800000                      # float 1
.LCPI0_1:
        .long   0x40e00000                      # float 7
        .long   0x40800000                      # float 4
.LCPI0_2:
        .long   0x40c00000                      # float 6
        .long   0x40400000                      # float 3
.LCPI0_3:
        .long   0x40a00000                      # float 5
        .long   0x40000000                      # float 2
test(float):                               # @test(float)
        cvttss2si       ecx, xmm0
        xor     eax, eax
        test    ecx, ecx
        sete    cl
        je      .LBB0_1
        movaps  xmm2, xmm0
        jmp     .LBB0_3
.LBB0_1:
        movss   xmm2, dword ptr [rip + .LCPI0_0] # xmm2 = mem[0],zero,zero,zero
.LBB0_3:
        mov     al, cl
        movss   xmm1, dword ptr [4*rax + .LCPI0_1] # xmm1 = mem[0],zero,zero,zero
        mulss   xmm1, xmm0
        addss   xmm1, dword ptr [4*rax + .LCPI0_2]
        mulss   xmm1, xmm0
        addss   xmm1, dword ptr [4*rax + .LCPI0_3]
        mulss   xmm1, xmm2
        movaps  xmm0, xmm1
        ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWE-PmzoQ_zTkYm1kMLDJgUOy-ypVqtR36OWdKgMm8T4TI9tk0_30b2ySFBIgf7pd9fAQi2Nm5jfjGc8M61TmP5LPSNEN4hsjkawML_kbU4hrXTPkBbNM0M0K-QTRTY5oKrfMC-bodc0UkGPMhGYwoBQwsjWqqDKcCvEDrZjRR7wcydpYoQ3KZFlxwQHzlZu1hXgoqNYy49TwLXsoKbx9-BpY0IYXrLE4cqOnHn728KJ5fltzDRw5a78EqebOqurwfg43L-xaUg42eeQZboRhGW0O73HZmeJ5hpFlRv4UFx45o8YNNeinzhoq6af62FHDHurjc3vq3HuVld_psI3RqI3xqI2PYzYevN0OwdfjHjK12mi3sTyyuCZKIz4dceiAN39f8N8vRKOO_LZm-zSUWVYr3STMeT7axRmmDWSZ4_CJFzwhP3TPyD1ju174kUIWbqSBmBxwgk5OPZ0kHMRtNEN7Zf_aVUIqpqzw2pjKonjBJ7hXMk-lMFOpVjB7g7_527b4R5Idvbg9CiGpQXadsNxmAv5sh7Hrd9h26BByuwdBquHv2yENXoatj7LYPWfu6eMP2VH_l5P-iJiyAnucoAUApy_AMhiWNkBdmKOEv5dwwm2JuFdCMV0Lc5DwnUTWH3bFbEnbSxw5kNU3XhJrU0HmFVL9TDs89YeqItVl82b65envz_g7PjKi_TUVElAQwjtSzLC9UO_lBQQ1q_Q7iP4IYojxVYhBBzEYRQyvQiQdRDKKeN2qww5iOIpIr0KMOojRKGJ2FWLcQYxHEdlViI8NQLtWusK36BfsIHghPpXrWJNtjdE60Hw_Z3RnC-WuLHGX0aK0GOzQob-w_fK-LJd2Q3aIpdxqDSPABlY6f5UqR5VRyIuWilcun49RjZ6d6ZbZpXHJSmDD8B5k4UNEngxDqsJLqqKWqvCXVPmXVMUtVf5dqmilnSrSH5-Xsmr5_5h6TTBO92DLcnLJctyynPySky6G3v-40AcfF3pyX-gPgTyLXS06qs-3As3zU47wHTCCixhkcNPiPcdJXYAGfFObhS-iaYflj-mxN1XyPoB7GuB4k76pXfUBvH-Xv6kn9wHc9CnzMQ0zG2iYO9i2jmGgYR4bagNghw5dM-NaaiZua7SHlAvet09cLN74vuI9WObk1o1UuH_cxKBh5_UXiv9C0d1QZ7mn_d5cLy8ZZPvP79ZBrtFxWtXvqNkTlvhxjP2QxFEwyROSz8mcTgw3giU9Zw37U0RqjyT2JyKdoxBYwqRWIjk5bACWOp1msoSJENvD8FAp-cIyyNRPDkvDj-gRR2SyToqcsiwNcgK24TSkWRFGNGU0LoCOwUYBM6ET8B_4asKTAAcBnvnYjzAms-nMh5IT5bMYRjKbhVAcWEm5mFrF9thjohJnQ1qvNBAF10b_JMLK-WrD2AGf1mYtVZL-SxXN33g2cQYnztr_AMrmdKI">