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

Reply via email to