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

    <tr>
        <th>Summary</th>
        <td>
            Clang - ARMv7 doesn't emit saturating subtraction
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Example on GodBolt: https://rust.godbolt.org/z/jGf667oxY

Given
```c++
auto f(u8 const x, u8 const y) -> u8 {
 return x <= y ? 0 : x - y;
}
```

LLVM does understand this as a saturating subtraction,
```
%3 = tail call i8 @llvm.usub.sat.i8(i8 %0, i8 %1), !dbg !19
ret i8 %3, !dbg !20
```

Yet does not emit the appropriate instruction for doing so: `uqsub8` (https://developer.arm.com/documentation/dui0473/m/arm-and-thumb-instructions/uqsub8)

I'm not sure of why this is the case for clang, as rustc does emit to for the same target.

(Feel free to correct me as to why it shouldn't be emit, given the information provided to the compiler)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx9VE1vnDAQ_TXmMlrEGhaWA4ckm40qJVLVQ6UeDR7AEeCtPzab_vqOzardVFElA_Z4PO-9mTGtlu_N40XMpwlBL_Ck5b2eHMvvYHTuZGnC-JGG8dalg5Yt7abaDGT6Rc_rU1-Wlb78YNmBZXfr-0mdcbkaymwdHeP3YUSr8E5Dz_je76HTi3VwYfwB_qzeGa9hw_LHYGLV9RQYdN4scAGWP7D8AO80OUIGge0FNnQsv7qy6vAP_i2_5-fvLyA1WvCLRGOdWCS4UVkQNMAKghFOLQNY3zojOqf0QgQ_D8l3OQQ2TqgJOjFNoIh0kU3TeU49RUgpYKr2JDds8F0WtK7TLQkNK8a3sh3CZ1uvYUnr1Sf_6MCz_yj7QaeisEU7wFk5koUgTiejT0YJh6Aov8ZHRdBrQ95Rpw45pGD-JxHe04Sg9h87QOIZJ31Ckwozp52eg013fsbFiTVDR-lVVlTE-Bh2yW9Dqd240c_t5gbZ0uYVide3_L8wXs2RvPWGGrKHt_F9LQ2NoKUTFiPxbhLLEFJDNQvN2a3CV9E6ugR_K2ak0pgBXXqLRPKOiBP0BjH4d9oY7ByQNwUkQwCmUHbUfpKkrXLQYgwfQIfQ4hFALQQ1xwQApfmsJMpwPpLV80lNaEhlIptc1nktEqfchM1DoE89e_ft5VxF6itG5P95BybeTM3HmgyKctteixEa7vrZEJNXkkNLZa3HkPBdWdRVMjacl9tSypJjtqt7mQvsMl7VVbvv67LHfTKJFifbsB1dWL7gG8QQNGe7Q6IannGeVVu-rQte8DTLRdHt6NkWe14XGXU-znQV0tj_9KdITBMptX6w4Voo6-zfTWGtGhbECEfx6dcwatN8HbU1IonITWT-GxzAbvU">