Skip to content

Commit 1f54ef7

Browse files
authored
[AArch64] Only clear kill flags if necessary when merging str (#69680)
Previously the kill flags of the source register were unconditionally cleared when a `str` pair was merged, which results in suboptimal register allocation and inhibits some renaming opportunities which may allow further merging `str`.
1 parent 946f923 commit 1f54ef7

File tree

7 files changed

+19
-11
lines changed

7 files changed

+19
-11
lines changed

llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,15 +1017,23 @@ AArch64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
10171017
MachineBasicBlock *MBB = I->getParent();
10181018
MachineOperand RegOp0 = getLdStRegOp(*RtMI);
10191019
MachineOperand RegOp1 = getLdStRegOp(*Rt2MI);
1020+
MachineOperand &PairedRegOp = RtMI == &*Paired ? RegOp0 : RegOp1;
10201021
// Kill flags may become invalid when moving stores for pairing.
10211022
if (RegOp0.isUse()) {
10221023
if (!MergeForward) {
10231024
// Clear kill flags on store if moving upwards. Example:
1024-
// STRWui %w0, ...
1025+
// STRWui kill %w0, ...
10251026
// USE %w1
10261027
// STRWui kill %w1 ; need to clear kill flag when moving STRWui upwards
1027-
RegOp0.setIsKill(false);
1028-
RegOp1.setIsKill(false);
1028+
// We are about to move the store of w1, so its kill flag may become
1029+
// invalid; not the case for w0.
1030+
// Since w1 is used between the stores, the kill flag on w1 is cleared
1031+
// after merging.
1032+
// STPWi kill %w0, %w1, ...
1033+
// USE %w1
1034+
for (auto It = std::next(I); It != Paired && PairedRegOp.isKill(); ++It)
1035+
if (It->readsRegister(PairedRegOp.getReg(), TRI))
1036+
PairedRegOp.setIsKill(false);
10291037
} else {
10301038
// Clear kill flags of the first stores register. Example:
10311039
// STRWui %w1, ...

llvm/test/CodeGen/AArch64/irg-nomem.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ body: |
6262
$w9 = MOVZWi 1, 0, implicit-def $x9
6363
6464
; Check that stores are merged across IRG.
65-
; CHECK: STPXi renamable $x9, renamable $x9, renamable $x0, 0
65+
; CHECK: STPXi renamable $x9, killed renamable $x9, renamable $x0, 0
6666
6767
STRXui renamable $x9, renamable $x0, 0 :: (store (s64) into %ir.x)
6868
dead renamable $x10 = IRG renamable $x8, $xzr

llvm/test/CodeGen/AArch64/ldrpre-ldr-merge.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ body: |
1717
; CHECK: liveins: $w0, $w1, $x1
1818
; CHECK-NEXT: {{ $}}
1919
; CHECK-NEXT: early-clobber $x1, renamable $w0, renamable $w2 = LDPWpre renamable $x1, 5 :: (load (s32))
20-
; CHECK-NEXT: STPWi renamable $w0, renamable $w2, renamable $x1, 0 :: (store (s32))
20+
; CHECK-NEXT: STPWi renamable $w0, killed renamable $w2, renamable $x1, 0 :: (store (s32))
2121
; CHECK-NEXT: RET undef $lr
2222
early-clobber renamable $x1, renamable $w0 = LDRWpre killed renamable $x1, 20 :: (load (s32))
2323
renamable $w2 = LDRWui renamable $x1, 1 :: (load (s32))

llvm/test/CodeGen/AArch64/ldst-opt-aa.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
---
1616
# CHECK-LABEL: name: ldr_str_aa
1717
# CHECK: $w8, $w9 = LDPWi $x1, 0
18-
# CHECK: STPWi $w8, $w9, $x0, 0
18+
# CHECK: STPWi killed $w8, killed $w9, $x0, 0
1919
name: ldr_str_aa
2020
tracksRegLiveness: true
2121
body: |

llvm/test/CodeGen/AArch64/stp-opt-with-renaming-debug.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ body: |
6161
# CHECK-NEXT: DBG_VALUE $x0, $noreg,
6262
# CHECK-NEXT: STRXui killed renamable $x8, renamable $x19, 2 :: (store (s64))
6363
# CHECK-NEXT: $x8 = ADDXrs renamable $x0, killed renamable $x20, 0
64-
# CHECK-NEXT: STPXi $xzr, renamable $x8, renamable $x19, 0 :: (store (s64))
64+
# CHECK-NEXT: STPXi $xzr, killed renamable $x8, renamable $x19, 0 :: (store (s64))
6565
# CHECK-NEXT: RET undef $lr, implicit $x0
6666
name: test_dbg_value2
6767
alignment: 4

llvm/test/CodeGen/AArch64/sve-fixed-length-fp128.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ define void @fcvt_v4f64_v4f128(ptr %a, ptr %b) vscale_range(2,0) #0 {
3838
; CHECK-NEXT: fmov d0, d1
3939
; CHECK-NEXT: bl __extenddftf2
4040
; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
41-
; CHECK-NEXT: ldr q2, [sp, #16] // 16-byte Folded Reload
4241
; CHECK-NEXT: stp q1, q0, [x19]
42+
; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
4343
; CHECK-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
44-
; CHECK-NEXT: stp q0, q2, [x19, #32]
44+
; CHECK-NEXT: stp q0, q1, [x19, #32]
4545
; CHECK-NEXT: addvl sp, sp, #2
4646
; CHECK-NEXT: add sp, sp, #48
4747
; CHECK-NEXT: ldp x30, x19, [sp, #16] // 16-byte Folded Reload

llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/aarch64_generated_funcs.ll.generated.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
133133
; CHECK-LABEL: OUTLINED_FUNCTION_0:
134134
; CHECK: // %bb.0:
135135
; CHECK-NEXT: mov w9, #2 // =0x2
136-
; CHECK-NEXT: mov w10, #3 // =0x3
137136
; CHECK-NEXT: stp w9, w8, [x29, #-12]
137+
; CHECK-NEXT: mov w9, #3 // =0x3
138138
; CHECK-NEXT: mov w8, #4 // =0x4
139-
; CHECK-NEXT: stp w8, w10, [sp, #12]
139+
; CHECK-NEXT: stp w8, w9, [sp, #12]
140140
; CHECK-NEXT: ret

0 commit comments

Comments
 (0)