diff options
Diffstat (limited to 'test/CodeGen/AArch64/arm64-sitofp-combine-chains.ll')
-rw-r--r-- | test/CodeGen/AArch64/arm64-sitofp-combine-chains.ll | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/test/CodeGen/AArch64/arm64-sitofp-combine-chains.ll b/test/CodeGen/AArch64/arm64-sitofp-combine-chains.ll new file mode 100644 index 0000000000..10b433b977 --- /dev/null +++ b/test/CodeGen/AArch64/arm64-sitofp-combine-chains.ll @@ -0,0 +1,22 @@ +; RUN: llc -march=arm64 -o - %s | FileCheck %s + +; ARM64ISelLowering.cpp was creating a new (floating-point) load for efficiency +; but not updating chain-successors of the old one. As a result, the two memory +; operations in this function both ended up direct successors to the EntryToken +; and could be reordered. + +@var = global i32 0, align 4 + +define float @foo() { +; CHECK-LABEL: foo: + ; Load must come before we clobber @var +; CHECK: adrp x[[VARBASE:[0-9]+]], {{_?var}} +; CHECK: ldr [[SREG:s[0-9]+]], [x[[VARBASE]], +; CHECK: str wzr, [x[[VARBASE]], + + %val = load i32* @var, align 4 + store i32 0, i32* @var, align 4 + + %fltval = sitofp i32 %val to float + ret float %fltval +} |