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

    <tr>
        <th>Summary</th>
        <td>
            [clang++] LLVM 18 Possible Optimization Bug: Ignored Float Comparison
        </td>
    </tr>

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

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

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

<pre>
    ## Summary
There appears to be a change in behavior in LLVM 18 where a float comparison is ignored during optimization with specific compiler flags. This issue is not present in LLVM 17. I've encountered this issue while debugging wrong sigmoid calculation in Eigen library.

## Environment
- LLVM Version: 18
- Architecture: aarch64
- Compiler Options: `-O3 -ffast-math -fno-exceptions`

## Reproduction Code
The following code demonstrates the issue:

```cpp
#include <cstring>

namespace 
{
    inline float
    my_ptrue( const float & a ) 
    {
        float b;
        std::memset( static_cast< void * >( &b ), 0xff, sizeof( float ) );
        return b;
    }
}

int foo( float const & x )
{
    const float cutoff_lower{ -9.0f };

    // Reproduces the error
    float const lt_mask = x < cutoff_lower ? my_ptrue( x ) : 0.0f; 

    // Does not reproduce the error
    // float const lt_mask = x < cutoff_lower ? 1.0f : 0.0f; 

    bool const any_small = lt_mask != 0.f;

    if ( any_small )
    {
        // Good
        return 0;
    }
 else 
    {
        // Bad
        return 1;
 }
}
```

LLVM 17 generates the following assembly code, which correctly includes the float comparison:
```
foo(float const&):
 fmov    s0, #-9.00000000
        ldr     s1, [x0]
        fcmp s1, s0
        cset    w0, ge
        ret
```

LLVM 18 generates the following assembly code, which omits the float comparison:
```
foo(float const&):
        mov     w0, #1
 ret
```

Godbolt link: https://godbolt.org/z/x7z13W8b6

This behavior when used with the new compiler and `-ffast-math`:
https://godbolt.org/z/v3qj6vd3W

Is this new behavior expected when the code is compiled with `-ffast-math` ?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVluv2jgQ_jXmZQRKbAjwwAOXUlXqqqvdqn08cpxJ4taxs7bD5fz6lXMhHMq2qrQROsmx5_J9M-MZc-dkoRE3ZLEji8OEN740dqOqQlXFJDXZdUMoI5TB301VcXsl0YFE288lWgRe18itA28gReAgSq4LBKkhxZKfpLHh--PHL39AvIJzpwO5MtyDMFXNrXRGg3QgC20sZpA1VuoCTO1lJV-5l0bDWfoSXI1C5lK0elKhhVzxws3gcxnUnWsw2NHGQ23Rofaj6-UMPhC6PCGgFqbRHoMrPyqeS6kQMkybogjuz9boApwsKiMzEFyJRnVYpIZ3skANSqaW2-usC0f_twvUO32S1ugKte_Wpx2OL2idNJqwLcSrYWdrRSk9Ct9YDDucW1Em82F7P7D9VAf_LoiQJJp-YjDNc-78tOK-hGmuzRQvAnupJHqC6y-srcka0RLZmwxvqYTcKGXOgbowWYhEZbTzlnt04EvswkTY9o3VJOp-oq5vfqQWqskQCNsL50MuCXt3r6V5ha7mAqFfXe66DwAAqZXU2BXIuFpdX2pvGyR0BSLg6iuI0AQ4ELqGUfaNufB0oilhD-vOZ4EP21ZYOfTBtvPcS_EiuPOE7eEUck_oFgIDugru0uCN0D1ElzwPbydf0eRhd4C0bkUevVn0jdUPMMjyMMTgcB8iqT3kxoxWO9KB7qW1_mPg7sMiGm_y_EWZM1qy3MF0PYvy1tng_A4CPRJ6vFVGn2201thR6B6E8i8Vd9-BsEMAw_Zv3AFhxzfpunQRYVuIZlFO2A7-A8HBYHd47QDlGZJe-DcBxS3_n2BIjVG9Oa6vL67iSrUGb8ZpHP6NZvmTGMocAtU7zSFFTwuy5_DemOxpjUTPawRQOfxZofd2d_y52Xg0-6TuhqN8z63vnVCgxrETjJ2CO4dVqq5tywiH4VxKUYIw1qLw6gp9L-j1Hpr-2Eze-u4K_y7DhCbtiRoinlfm1B7gKPgklIX67p-3zFVmu6Met5KL3SUii8NDexBV3Qu4B3Xh0If3uXVU4A9h_WXsVr8bO1NJ_z-Hq3_6oPVkCGVxv_9zHu9NlhrlQUn9PZyg0vs6zKCu2Ipud2ZsQejxldDjZfkas6-rNLk30k7o24XgXKKGxmHWzfVAVuN5HOtcZ-2EG6dbwDTw-RWAE_vnW3LK2Nd7AB9cN-yDnxsOvNQofIARAAUY7eiTboDSA_wBS-gpk2zDsjVb8wlu4iVdJYskSaJJuZmnUZYvV4s1FyhEtMy4EDxepcucJsuE0Ync0IjO4yiO4zmdx8ksn0dZlIs5MpzP1xkn8wgrLtVMqVMVmE3a4buJYxpFdKJ4isq1tzVKheK6IJSGi5vdBIVp2hSOzCMlnXejCS-9aq94vcYu_BaH29XsT-OcTBW214zbxWvXFCHpH_q72bGtsv2tJieNVZuHhEhfNulMmIrQY_Dev6a1Nd9QeEKPLRtH6LEndNrQfwMAAP__fFwUcg">