Skip to content

Commit bd7c55b

Browse files
committed
fix wrong Imm
1 parent ec880b1 commit bd7c55b

File tree

3 files changed

+73
-3
lines changed

3 files changed

+73
-3
lines changed

llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,11 +2315,12 @@ MachineBasicBlock::iterator AArch64LoadStoreOpt::doFoldSymmetryConstantLoad(
23152315
const MachineOperand MO = AArch64InstrInfo::getLdStBaseOp(MI);
23162316
Register DstRegW = TRI->getSubReg(BaseReg, AArch64::sub_32);
23172317
unsigned DstRegState = getRegState(MI.getOperand(0));
2318+
int Offset = AArch64InstrInfo::getLdStOffsetOp(MI).getImm();
23182319
BuildMI(*MBB, MI, MI.getDebugLoc(), TII->get(AArch64::STPWi))
23192320
.addReg(DstRegW, DstRegState)
23202321
.addReg(DstRegW, DstRegState)
23212322
.addReg(MO.getReg(), getRegState(MO))
2322-
.add(AArch64InstrInfo::getLdStOffsetOp(MI))
2323+
.addImm(Offset * 2)
23232324
.setMemRefs(MI.memoperands())
23242325
.setMIFlags(MI.getFlags());
23252326
I->eraseFromParent();
@@ -2337,6 +2338,19 @@ bool AArch64LoadStoreOpt::tryFoldSymmetryConstantLoad(
23372338
if (MBBI == B)
23382339
return false;
23392340

2341+
TypeSize Scale(0U, false), Width(0U, false);
2342+
int64_t MinOffset, MaxOffset;
2343+
if (!AArch64InstrInfo::getMemOpInfo(AArch64::STPWi, Scale, Width, MinOffset,
2344+
MaxOffset))
2345+
return false;
2346+
2347+
// We replace the STRX instruction, which stores 64 bits, with the STPW
2348+
// instruction, which stores two consecutive 32 bits. therefore, we compare
2349+
// the offset range with multiplied by two.
2350+
int Offset = AArch64InstrInfo::getLdStOffsetOp(MI).getImm();
2351+
if (Offset * 2 < MinOffset || Offset * 2 > MaxOffset)
2352+
return false;
2353+
23402354
Register BaseReg = getLdStRegOp(MI).getReg();
23412355
unsigned Count = 0, UpperLoadIdx = 0;
23422356
uint64_t Accumulated = 0, Mask = 0xFFFFUL;
@@ -2675,7 +2689,8 @@ bool AArch64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB,
26752689
// STPWi killed renamable $w8, killed renamable $w8, killed renamable $x0, 0
26762690
for (MachineBasicBlock::iterator MBBI = MBB.begin(), E = MBB.end();
26772691
MBBI != E;) {
2678-
if (tryFoldSymmetryConstantLoad(MBBI, UpdateLimit))
2692+
if (isMergeableLdStUpdate(*MBBI) &&
2693+
tryFoldSymmetryConstantLoad(MBBI, UpdateLimit))
26792694
Modified = true;
26802695
else
26812696
++MBBI;

llvm/test/CodeGen/AArch64/movimm-expand-ldst.ll

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,24 +226,49 @@ define void @test_store_uu0xf555f555f555f555(ptr %x) {
226226
}
227227

228228
define void @test_store_0x1234567812345678_offset_range(ptr %x) {
229+
; CHECK-LABEL: test_store_0x1234567812345678_offset_range:
230+
; CHECK: // %bb.0:
231+
; CHECK-NEXT: mov x8, #22136 // =0x5678
232+
; CHECK-NEXT: movk x8, #4660, lsl #16
233+
; CHECK-NEXT: stp w8, w8, [x0, #32]
234+
; CHECK-NEXT: ret
229235
%g = getelementptr i64, ptr %x, i64 4
230236
store i64 u0x1234567812345678, ptr %g
231237
ret void
232238
}
233239

234240
define void @test_store_0x1234567812345678_offset_min(ptr %x) {
241+
; CHECK-LABEL: test_store_0x1234567812345678_offset_min:
242+
; CHECK: // %bb.0:
243+
; CHECK-NEXT: mov x8, #22136 // =0x5678
244+
; CHECK-NEXT: movk x8, #4660, lsl #16
245+
; CHECK-NEXT: stp w8, w8, [x0]
246+
; CHECK-NEXT: ret
235247
%g = getelementptr i1, ptr %x, i32 0
236248
store i64 u0x1234567812345678, ptr %g
237249
ret void
238250
}
239251

240252
define void @test_store_0x1234567812345678_offset_max(ptr %x) {
253+
; CHECK-LABEL: test_store_0x1234567812345678_offset_max:
254+
; CHECK: // %bb.0:
255+
; CHECK-NEXT: mov x8, #22136 // =0x5678
256+
; CHECK-NEXT: movk x8, #4660, lsl #16
257+
; CHECK-NEXT: stp w8, w8, [x0, #248]
258+
; CHECK-NEXT: ret
241259
%g = getelementptr i1, ptr %x, i32 248
242260
store i64 u0x1234567812345678, ptr %g
243261
ret void
244262
}
245263

246264
define void @test_store_0x1234567812345678_offset_max_over(ptr %x) {
265+
; CHECK-LABEL: test_store_0x1234567812345678_offset_max_over:
266+
; CHECK: // %bb.0:
267+
; CHECK-NEXT: mov x8, #22136 // =0x5678
268+
; CHECK-NEXT: movk x8, #4660, lsl #16
269+
; CHECK-NEXT: orr x8, x8, x8, lsl #32
270+
; CHECK-NEXT: stur x8, [x0, #249]
271+
; CHECK-NEXT: ret
247272
%g = getelementptr i1, ptr %x, i32 249
248273
store i64 u0x1234567812345678, ptr %g
249274
ret void

llvm/test/CodeGen/AArch64/movimm-expand-ldst.mir

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,13 @@ tracksRegLiveness: true
9090
body: |
9191
bb.0:
9292
liveins: $x0
93+
; CHECK-LABEL: name: test_fold_repeating_constant_store_offset_min
94+
; CHECK: liveins: $x0
95+
; CHECK-NEXT: {{ $}}
96+
; CHECK-NEXT: renamable $x8 = MOVZXi 22136, 0
97+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 4660, 16
98+
; CHECK-NEXT: STPWi killed renamable $w8, killed renamable $w8, killed renamable $x0, -64
99+
; CHECK-NEXT: RET undef $lr
93100
renamable $x8 = MOVZXi 22136, 0
94101
renamable $x8 = MOVKXi $x8, 4660, 16
95102
renamable $x8 = ORRXrs $x8, $x8, 32
@@ -102,6 +109,13 @@ tracksRegLiveness: true
102109
body: |
103110
bb.0:
104111
liveins: $x0
112+
; CHECK-LABEL: name: test_fold_repeating_constant_store_offset_max
113+
; CHECK: liveins: $x0
114+
; CHECK-NEXT: {{ $}}
115+
; CHECK-NEXT: renamable $x8 = MOVZXi 22136, 0
116+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 4660, 16
117+
; CHECK-NEXT: STPWi killed renamable $w8, killed renamable $w8, killed renamable $x0, 62
118+
; CHECK-NEXT: RET undef $lr
105119
renamable $x8 = MOVZXi 22136, 0
106120
renamable $x8 = MOVKXi $x8, 4660, 16
107121
renamable $x8 = ORRXrs $x8, $x8, 32
@@ -114,18 +128,34 @@ tracksRegLiveness: true
114128
body: |
115129
bb.0:
116130
liveins: $x0
131+
; CHECK-LABEL: name: test_fold_repeating_constant_store_offset_min_lower
132+
; CHECK: liveins: $x0
133+
; CHECK-NEXT: {{ $}}
134+
; CHECK-NEXT: renamable $x8 = MOVZXi 22136, 0
135+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 4660, 16
136+
; CHECK-NEXT: renamable $x8 = ORRXrs $x8, $x8, 32
137+
; CHECK-NEXT: STRXui killed renamable $x8, killed renamable $x0, -33
138+
; CHECK-NEXT: RET undef $lr
117139
renamable $x8 = MOVZXi 22136, 0
118140
renamable $x8 = MOVKXi $x8, 4660, 16
119141
renamable $x8 = ORRXrs $x8, $x8, 32
120142
STRXui killed renamable $x8, killed renamable $x0, -33
121143
RET undef $lr
122144
...
123-
---
145+
---
124146
name: test_fold_repeating_constant_store_offset_max_over
125147
tracksRegLiveness: true
126148
body: |
127149
bb.0:
128150
liveins: $x0
151+
; CHECK-LABEL: name: test_fold_repeating_constant_store_offset_max_over
152+
; CHECK: liveins: $x0
153+
; CHECK-NEXT: {{ $}}
154+
; CHECK-NEXT: renamable $x8 = MOVZXi 22136, 0
155+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 4660, 16
156+
; CHECK-NEXT: renamable $x8 = ORRXrs $x8, $x8, 32
157+
; CHECK-NEXT: STRXui killed renamable $x8, killed renamable $x0, 32
158+
; CHECK-NEXT: RET undef $lr
129159
renamable $x8 = MOVZXi 22136, 0
130160
renamable $x8 = MOVKXi $x8, 4660, 16
131161
renamable $x8 = ORRXrs $x8, $x8, 32

0 commit comments

Comments
 (0)