-
Notifications
You must be signed in to change notification settings - Fork 15.4k
Description
The rust frontend ran into a bug when running tests on ppc64le with pgo enabled on centos. The compilation of the compiler's rustc_errors crate with -mcpu=power9 created a bug where a boolean value is clobbered, resulting in incorrect json values.
I was able to extract the llvm input from rust, and run llvm-reduce to produce a reasonably sized reproducer using the upstream llvm repo.
The following codegen is suspect:
andi. 3, 4, 1
setb 3, 2
cmpldi 4, 0
std 28, 80(1) # 8-byte Folded Spill
stw 3, 60(1)
Notably, cr2 in the setb above has no live value (I am assuming this is following the ELFv2 ABI).
After the machine-cp pass, a copy from cr0gt to cr2lt goes missing. Likewise, the other bits of cr2 appear to be undefined. Furthermore, setb potentially examines all bits of the input cr, so moving one bit is not sufficient for well-defined behavior.
Attached is the reduced llvm input reduced.ll.txt. Likewise, I assembled it via:
llc -march=ppc64le -mcpu=pwr9 reduced.ll.txt