diff options
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/store_merge_pair_offset.ll | 12 |
2 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp index dcb05601e5f..8a76c42b589 100644 --- a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp +++ b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp @@ -1470,6 +1470,9 @@ bool AArch64LoadStoreOpt::tryToPairLdStInst(MachineBasicBlock::iterator &MBBI) { bool IsUnscaled = TII->isUnscaledLdSt(MI); int Offset = getLdStOffsetOp(MI).getImm(); int OffsetStride = IsUnscaled ? getMemScale(MI) : 1; + // Allow one more for offset. + if (Offset > 0) + Offset -= OffsetStride; if (!inBoundsForPair(IsUnscaled, Offset, OffsetStride)) return false; diff --git a/llvm/test/CodeGen/AArch64/store_merge_pair_offset.ll b/llvm/test/CodeGen/AArch64/store_merge_pair_offset.ll new file mode 100644 index 00000000000..a091f0fd911 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/store_merge_pair_offset.ll @@ -0,0 +1,12 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-enable-atomic-cfg-tidy=0 -disable-lsr -verify-machineinstrs -enable-misched=false -enable-post-misched=false -o - %s | FileCheck %s + +define i64 @test(i64* %a) nounwind { + ; CHECK: ldp x{{[0-9]+}}, x{{[0-9]+}} + ; CHECK-NOT: ldr + %p1 = getelementptr inbounds i64, i64* %a, i32 64 + %tmp1 = load i64, i64* %p1, align 2 + %p2 = getelementptr inbounds i64, i64* %a, i32 63 + %tmp2 = load i64, i64* %p2, align 2 + %tmp3 = add i64 %tmp1, %tmp2 + ret i64 %tmp3 +} |

