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

    <tr>
        <th>Summary</th>
        <td>
            AArch64 backend miscompilation related to sshl.sat
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            llvm:codegen,
            miscompilation
      </td>
    </tr>

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

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

<pre>
    here's a function:
```llvm
declare i64 @llvm.sshl.sat.i64(i64, i64) #0

define i64 @f(i64 %0, i64 %1, i64 %2) {
  %4 = or i64 %0, 1
 %5 = add i64 %4, %0
  %6 = sub nsw i64 %1, %5
  %7 = call i64 @llvm.sshl.sat.i64(i64 %6, i64 1)
  ret i64 %7
}

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
```
let's invoke it using this driver:
```c
#include <stdio.h>

// i64 %#0 = #x5dbdff5f99a88000 (6754835802190544896)
// i64 %#1 = #x0000000000000000 (0)
// i64 %#2 = #x0000000000000000 (0)

unsigned long f(unsigned long, unsigned long, unsigned long);

int main(void) {
  printf("%lx\n", f(6754835802190544896ULL, 0, 0));
}
```
the result is:
```
Johns-MacBook-Pro:reduce regehr$ ~/llvm-project/for-alive/bin/llc reduced.ll
Johns-MacBook-Pro:reduce regehr$ clang driver.c reduced.s
Johns-MacBook-Pro:reduce regehr$ ./a.out 
8000000000000000
Johns-MacBook-Pro:reduce regehr$ 
```
but it looks like the answer should be LONG_MAX instead. here I'll just give Alive's work, which appears correct:
```
i64 %#4 = #x5dbdff5f99a88001 (6754835802190544897)
i64 %#5 = #xbb7bfebf33510001 (13509671604381089793, -4937072469328461823)
i64 %#6 = #x44840140ccaeffff (4937072469328461823)
i64 %#7 = #x7fffffffffffffff (9223372036854775807)
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUlc2O4zYMgJ9GuRATyPqx7EMOmZmmaLHb9lKgt0KW5Fg7ihRI8szupc9eSPEkmT_srhE4tkx-FEmRlCnZvTdmg_gt4vcrOecpxE00ezPF1RD0t81kokFEJJAwzl5lGzyiW4TvEd6iFp9-zj0eTkvaKCejAdsyQKx-WKc0uXWSeW1bhkhX73dQ_3pAhOKFtgBG68_640keEOF4USrPzdUzqRRxe1KHssQA0XsIEa5Vm0UAEc7rd6n1s0DdUBW8QNoqlOYBfHp6YbgQrgRFFVTSue94XanPO28Q6Z8h0eRnA2KJhbi_DorMOdphzibVeFWDSNyCD8XsINUD-DBGY8CH9M0r8GH2T9ZrSEejZiezHJyBJ-tcNHmOHg7mEOI3RDofvDlF8P5VUk-vzuSafusfw4MBm2FO1u8hTzaBjvbRxLfnQS3vhFqv3KwNIHqXsrZhPSH6y7VriOwQ2T27f_GO0K9cD3oc-dj3suswxoBI1wrOOso7TJoec8a6vj0H8g2qOaPwq6ug8MeK5EcV6332tYo0uOD3UI7si5WS8e8t9IjeXiOtz3CQ1iPSPQarXx3xY7Q-FzuIEES4-4r4na_Pd9X8O0H6-9On8hUvt_6FyQ9SnycD0aTZZbDpbZJPr7-Hyaebz1LdhvBw81cMiG6j0bMquqWNIMLgP0R2pShujjF8MSojshtDvJHOPhpEdkNxdOecgpOmXjv3E3TlpN8vZ3F9YaSfQKwR2cl1mDOclLpXaf8J1LtRGuZcSseF8JDA2QcDJbjSpycTIU1hdhoGA5_-_OPXfz9v_wHrUzZSr6G0X_gNEeEcfJlThr19NLA9BU4keArxoeT0abJqAnk8GhkTqBBjCfMHObscdPZRsTXvF5s4H_0Lg58ZwyCG0QwjpbzBC6OhHPetaFrMaNfgrhc9LRu-YT0VWBDW9pR0rG06Qt-Bt2c4Yx3DDcNKSTOO41jgP8YQZ4YYX16F0RNCqSCYth1nQvAOX5x8FbeV3lDd016uzKYRDSV9Q7lYTRtmhBg11prxtu9U3xAlW8ypak3PuCIruyGYMMyatukazsVaskaPnWS9loNmrUEMm4O0bl1nR4j7lU1pNpuu6zleOTkYl-qUJqS0e-M1otvtNqqpTJdS-YiQOobpVgVt9saflw82qXA4Wifr9CakjPq4qQU5zPtUJpZNOV1sZ5ud2Sx4WAzCSw5E42Q2GnKA51m3mqPbTDkfa7uoXXVv8zQPaxUOSw942wqqpwmRXXX2_wAAAP__V9daxA">