Issue |
95954
|
Summary |
AArch64 backend miscompiling a non-byte-sized rotate
|
Labels |
backend:AArch64,
llvm:codegen,
miscompilation
|
Assignees |
|
Reporter |
regehr
|
I believe we're miscompiling this:
```llvm
@a = external global i31
declare i31 @llvm.fshr.i31 (i31 %a, i31 %b, i31 %c)
define i31 @f() {
%1 = load i31, ptr @a, align 1
%r = call i31 @llvm.fshr.i31(i31 %1, i31 %1, i31 1)
ret i31 %r
}
```
the result is:
```
_f:
adrp x8, _a@GOTPAGE
ldr x8, [x8, _a@GOTPAGEOFF]
ldr w8, [x8]
lsr w9, w8, #1
orr w0, w9, w8, lsl #30
ret
```
but that `orr` seems to be bringing in some garbage, I'll illustrate with this driver:
```c
#include <stdio.h>
extern "C" unsigned f();
unsigned a = 3;
int main() {
printf("%x\n", f() & 0x7fffffff);
}
```
running it, we get:
```
Johns-MacBook-Pro:iN-stress regehr$ ~/llvm-project/for-alive/bin/llc test_31.aarch64.ll
Johns-MacBook-Pro:iN-stress regehr$ clang++ driver.cpp test_31.aarch64.s
Johns-MacBook-Pro:iN-stress regehr$ ./a.out
40000001
Johns-MacBook-Pro:iN-stress regehr$
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs