<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/90532>90532</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
miscompile of non-canonical IR by AArch64 global isel backend
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
llvm:codegen,
miscompilation,
llvm:globalisel
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
regehr
</td>
</tr>
</table>
<pre>
here's an odd-looking little fellow:
```llvm
define i1 @f(i1 %V) {
%C1 = fcmp false double 0.000000e+00, 0.000000e+00
%brmerge = select i1 %C1, i1 true, i1 %V
br i1 %brmerge, label %common.ret, label %SW_C
common.ret:
%common.ret.op = phi i1 [ %C, %SW_C ], [ false, %0 ]
ret i1 %common.ret.op
SW_C:
%Y = icmp ult i1 false, false
%C = icmp ule i1 %Y, false
br label %common.ret
}
```
the SDAG backend (correctly) compiles it to this:
```
_f:
mov w8, w0
mov w0, wzr
cbnz wzr, LBB0_3
tbnz w8, #0, LBB0_3
mov w0, #1
LBB0_3:
ret
```
but global isel gives:
```
_f:
movi d0, #0000000000000000
fcmp d0, #0.0
b.nv LBB0_3
tbnz w0, #0, LBB0_3
mov w0, #1
ret
LBB0_3:
mov w0, wzr
ret
```
which I believe is incorrect. to see this, I'll give Alive's work showing why the function should return 1 when invoked as `f(0)`:
```
i1 %C1 = #x0 (0)
i1 %brmerge = #x0 (0)
>> Jump to %SW_C
i1 %Y = #x0 (0)
i1 %C = #x1 (1)
>> Jump to %common.ret
i1 %common.ret.op = #x1 (1)
```
but on the other hand, if we use this driver:
```c
#include <stdio.h>
unsigned f(unsigned);
int main(void) {
printf("%x\n", f(0));
}
```
then we get:
```
Johns-MacBook-Pro:reduce regehr$ ~/llvm-project/for-alive/bin/llc foo.ll
Johns-MacBook-Pro:reduce regehr$ clang foo.s driver.c && ./a.out
1
Johns-MacBook-Pro:reduce regehr$ ~/llvm-project/for-alive/bin/llc foo.ll -global-isel
Johns-MacBook-Pro:reduce regehr$ clang foo.s driver.c && ./a.out
0
Johns-MacBook-Pro:reduce regehr$
```
cc @DataCorrupted
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vk2P2zgP_jXKhYghS3ESH3LIR_OixbvAYgvsoqfClmhbO7IUyHLS6WF_-0KyJ-PMJF300GAwsEiKeviQIlV0naoN4oZkO5IdZkXvG-s2Dmts3Ky08nnToEPCVh0UBqyUc23tkzI1aOW9RqhQa3shfEvogdAtWdLhT-tzO4gkVsogqBTIglaErcMXy_4kLAey2g1GEET7FAg_QCXaE1SF7hCk7UuNQBMaf0jYjlLC9m8lrz5K16KrMTrqUKPwMJy3T8M-lYJ3PY6fEca4t3SjZPQQTHRRog4yYdvWmsShvxF__uvrfow7_p-Y8S0AwATYqy6xpwjv1Kh4ZLaL-ILn0SeQ7BCX2W4gYtTRqBh9OnwJ7cb1FE_ENyC5BfMlAlCB6F5HN9djho9JUqamOJ745Z1l6e6yNYBZHd5Ux7D0DcLnw_Z_UBbiCY0EwtbCOofC6-dQHsK2J6WxA-XBW_CN6t5X2rD8Wr0GOomW0Ly1Z0LzyzpAvtC34lhNl-_uKhel-R4U313Q_H-3o1_5VelH5XpICKd3bKaOCePpiGS0usKn-Ss_t6GUvYda27LQoDrUUKsz_kfc08MVobl8OZ2--V0NwyW7MUxedWViQggPYqc_H_s02Pc8PMrEI34ujRINfIQStcIzgupAmbFuklAnHeJQK2wPHwlb6YFD2Gp1HnrZxbon6Bp7CZ3s0jxDKMWqN8Ira4Ki1zJcsN4ZSOHSoAFlzvYJJRQdkGXsY5SwPIB6kJmXthPvD2H8G4WXTRP9tF_dMQIg_APhH-BT355CbDddZ7yMPz5hf1WH5Tr9oe-3V_dOg3nk7k4VWxOJtb5BB01hZOy7FVwQ-m7IEUinzujekyjGNePKCN3LQNG-81LZpAm4J22uN3GKSQhZeVkEXHw3NVPGQ1soQ9j6bJW8nT8np4wP-wljhGXfSLY38XMP11xPPT5uaSaEV8cRcNfkk21MN_-tEDtrn-a_O0v41qHsBcIwdwlbwD-EHcMInZ-c_RuFJ-xYWTcvhgo-liGKo9YCKmsTrX_Cs9CFqeO2F-4TAYQtCVtCQtixSGw_Jj_9dYBhPnS4eehwvwb9z9B9N1HjTBfh3XIofLG3zvUnjxJmcsNlzvNihpt0lS4WnK5SPms2GeNMCCqyoszXvOIZLrK1XK8ynhdpzuRMbRhlC7pgOWOLLOWJWC5X-QpZvpDlWlJOFhTbQukkkJlYV89U1_W4yWnG2SyO2C6-1hgbpybh2-3WiWa5GOqVMBYfX3wrrMQazVXcqm6YqEVoc2-th4TEfDAWHoNuExNa9nVHFlSrznevqLzyGjdXjwi2AmPNXBTGGiUKDR__gPIZRmg3A20EPuud3jTen-JwY0fCjrXyTV8mwrZjOb2vqkhHR9gxMvJvAAAA__-x5_-0">