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

    <tr>
        <th>Summary</th>
        <td>
            miscompile of @llvm.sshl.sat.i32 for AArch64
        </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'a function:
```llvm
define i32 @f(i32 %0, i32 %1) {
  %3 = or i32 1, %1
  %4 = add i32 %3, %0
  %5 = add i32 %4, %0
  %6 = call i32 @llvm.sshl.sat.i32(i32 %5, i32 1)
  ret i32 %6
}

declare i32 @llvm.sshl.sat.i32(i32, i32) #0
```

let's call it with `f(0x00000009, 0x7ffffff8)`. this gives:
```
%3 = 7ffffff9
%4 = 80000002
%5 = 8000000b
%6 = 80000000
```

on the other hand, llc for AArch64 gives us:
```
_f:
        orr     w8, w1, #0x1
        add     w9, w0, w0
        adds    w8, w8, w9
        mov     w10, #-2147483648    
        lsl     w9, w8, #1
        cinv    w10, w10, ge
        cmp     w8, w9, asr #1
        csel    w0, w10, w9, ne
        ret
```

I didn't hand-execute these instructions but running them on my M1 Mac with the inputs above gives `7fffffff` as the output. I also see the obvious i64 version of this function getting miscompiled.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVNGyoygQ_Rp86boWgtH44ENmb6VqHuYbtlBaZRchBZh75--3QBJTd2dnrZSS7sPhcKBbeK9mg9iT0zdyei_EFhbreoczLq4YrPzZL-iQsFbAtJkxKGsIvxD6TuiFNHT_aX1f95DESRkExRmQmk6EndOQnShhf0AeV4R1QNpv-xSIIQ6Ev4N1CVJFbMIdgDoBhJQPEp5B9AV0-gqqfwFqEmgUWj9kRvml94suvQil4uyQfXrIjpofJA7DY4EmO9G-50F2YdTC4f_wZ-pkBuP0i6evfBoDYa3PogN8qLAAaZK_9JPuTxf56Gc7pecc9Ta0hLAoD7O6o__3ueW_D_vz1O4Z3k0_7_zsGT69hodnuHkN_2471kBYEGxY0MEijIzKtR5hsg4uFzcuTb1Lhu0_Vf85HRnaWecI7T7Okekj3x9OP6snQEgZAcmkD5rfL0l_TN_f3TO72ntMVjTTvrGqbuszb-ozAMATp70-ljhn8KFgVOaFJ39mPPLr7dCQSIR3Xyg8piVeGXaoOXgcht94_x2kkoawNiTn3_ATxy1gPBCPoIwPbktV7mHYArjNGGXmmF7BGlh_wo8Kfohxv4PxGJW5bcGDGOwd86mRhua7NJGGgvD7eW_htoUSvoPQ3oJH3MPDXdnNg2pquKPzyhqw035vHy0HZgwh6liVH-16UxplWciey453osC-ainlTcsbXiw9O4mhRdo1XUNriS0fcBRVNfHqXAvWyUL1jDJeVVVH66qhvGyFqHA6SS4r0YqBkpriKpQuU-laNxfK-w37lrVtW2gxoPapZTI2iPFvNJLwS765hMXKJoylrsgvo5U4o3mGn1sQqZkyFvuu6yP6bdhmHxuG8sEfawcVNPbH1qM9v2orr_VTbE73Swi3VEDsSth1VmHZhnK0K2HXJG7_vN2c_QvHQNg17dITdk0b_ScAAP__vZOs-A">