[llvm] [AArch64] Merge scaled and unscaled narrow zero stores (PR #136705)
Guy David via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 22 07:45:49 PDT 2025
https://github.com/guy-david created https://github.com/llvm/llvm-project/pull/136705
None
>From ceea41e5547a9b7505caa961a1e1df39aa6953dd Mon Sep 17 00:00:00 2001
From: Guy David <guyda96 at gmail.com>
Date: Tue, 22 Apr 2025 17:39:01 +0300
Subject: [PATCH 1/2] [NFC] [AArch64] Simplify offset scaling in ldst-opt
---
llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
index 7c47492cf1a8e..0e26005f6e6be 100644
--- a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
+++ b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
@@ -892,11 +892,10 @@ AArch64LoadStoreOpt::mergeNarrowZeroStores(MachineBasicBlock::iterator I,
OffsetImm = IOffsetInBytes;
int NewOpcode = getMatchingWideOpcode(Opc);
- bool FinalIsScaled = !TII->hasUnscaledLdStOffset(NewOpcode);
-
- // Adjust final offset if the result opcode is a scaled store.
- if (FinalIsScaled) {
- int NewOffsetStride = FinalIsScaled ? TII->getMemScale(NewOpcode) : 1;
+ // Adjust final offset on scaled stores because the new instruction
+ // has a different scale.
+ if (!TII->hasUnscaledLdStOffset(NewOpcode)) {
+ int NewOffsetStride = TII->getMemScale(NewOpcode);
assert(((OffsetImm % NewOffsetStride) == 0) &&
"Offset should be a multiple of the store memory scale");
OffsetImm = OffsetImm / NewOffsetStride;
@@ -906,7 +905,7 @@ AArch64LoadStoreOpt::mergeNarrowZeroStores(MachineBasicBlock::iterator I,
DebugLoc DL = I->getDebugLoc();
MachineBasicBlock *MBB = I->getParent();
MachineInstrBuilder MIB;
- MIB = BuildMI(*MBB, InsertionPoint, DL, TII->get(getMatchingWideOpcode(Opc)))
+ MIB = BuildMI(*MBB, InsertionPoint, DL, TII->get(NewOpcode))
.addReg(isNarrowStore(Opc) ? AArch64::WZR : AArch64::XZR)
.add(BaseRegOp)
.addImm(OffsetImm)
>From 07592e0b79d51ee9c046a699bfd05b5d0301094b Mon Sep 17 00:00:00 2001
From: Guy David <guyda96 at gmail.com>
Date: Tue, 22 Apr 2025 17:39:24 +0300
Subject: [PATCH 2/2] [AArch64] Support merging of narrow zero stores
---
.../lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp | 8 +++++---
llvm/test/CodeGen/AArch64/str-narrow-zero-merge.mir | 12 ++++--------
2 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
index 0e26005f6e6be..57540eeb5ef92 100644
--- a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
+++ b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
@@ -1538,10 +1538,12 @@ static bool areCandidatesToMergeOrPair(MachineInstr &FirstMI, MachineInstr &MI,
if (!PairIsValidLdStrOpc)
return false;
- // FIXME: We don't support merging narrow stores with mixed scaled/unscaled
- // offsets.
+ // Narrow stores do not have pair-wise opcodes, so constraint their merging
+ // iff they are zero stores.
if (isNarrowStore(OpcA) || isNarrowStore(OpcB))
- return false;
+ return getLdStRegOp(FirstMI).getReg() == AArch64::WZR &&
+ getLdStRegOp(MI).getReg() == AArch64::WZR &&
+ TII->getMemScale(FirstMI) == TII->getMemScale(MI);
// The STR<S,D,Q,W,X>pre - STR<S,D,Q,W,X>ui and
// LDR<S,D,Q,W,X,SW>pre-LDR<S,D,Q,W,X,SW>ui
diff --git a/llvm/test/CodeGen/AArch64/str-narrow-zero-merge.mir b/llvm/test/CodeGen/AArch64/str-narrow-zero-merge.mir
index e995c402c50a8..8ba7c1bcf305f 100644
--- a/llvm/test/CodeGen/AArch64/str-narrow-zero-merge.mir
+++ b/llvm/test/CodeGen/AArch64/str-narrow-zero-merge.mir
@@ -29,8 +29,7 @@ name: merge_scaled_str_with_unscaled_8
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_8
- ; CHECK: STRBBui $wzr, $x0, 4 :: (store (s8))
- ; CHECK-NEXT: STURBBi $wzr, $x0, 5 :: (store (s8))
+ ; CHECK: STRHHui $wzr, $x0, 2 :: (store (s8))
; CHECK-NEXT: RET undef $lr
STRBBui $wzr, $x0, 4 :: (store (s8))
STURBBi $wzr, $x0, 5 :: (store (s8))
@@ -41,8 +40,7 @@ name: merge_unscaled_str_with_scaled_8
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_8
- ; CHECK: STURBBi $wzr, $x0, 4 :: (store (s8))
- ; CHECK-NEXT: STRBBui $wzr, $x0, 5 :: (store (s8))
+ ; CHECK: STURHHi $wzr, $x0, 4 :: (store (s8))
; CHECK-NEXT: RET undef $lr
STURBBi $wzr, $x0, 4 :: (store (s8))
STRBBui $wzr, $x0, 5 :: (store (s8))
@@ -75,8 +73,7 @@ name: merge_scaled_str_with_unscaled_16
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_16
- ; CHECK: STRHHui $wzr, $x0, 2 :: (store (s16))
- ; CHECK-NEXT: STURHHi $wzr, $x0, 6 :: (store (s16))
+ ; CHECK: STRWui $wzr, $x0, 1 :: (store (s16))
; CHECK-NEXT: RET undef $lr
STRHHui $wzr, $x0, 2 :: (store (s16))
STURHHi $wzr, $x0, 6 :: (store (s16))
@@ -87,8 +84,7 @@ name: merge_unscaled_str_with_scaled_16
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_16
- ; CHECK: STURHHi $wzr, $x0, 4 :: (store (s16))
- ; CHECK-NEXT: STRHHui $wzr, $x0, 3 :: (store (s16))
+ ; CHECK: STURWi $wzr, $x0, 4 :: (store (s16))
; CHECK-NEXT: RET undef $lr
STURHHi $wzr, $x0, 4 :: (store (s16))
STRHHui $wzr, $x0, 3 :: (store (s16))
More information about the llvm-commits
mailing list