Skip to content

Commit 75a9ed4

Browse files
committed
[RISCV][GISel] Add simplest case of folding add with immediate into load/store address.
This covers the simm12 offset case.
1 parent 564ff80 commit 75a9ed4

File tree

5 files changed

+235
-0
lines changed

5 files changed

+235
-0
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,25 @@ RISCVInstructionSelector::selectAddrRegImm(MachineOperand &Root) const {
307307
}};
308308
}
309309

310+
if (isBaseWithConstantOffset(Root, MRI)) {
311+
MachineOperand &LHS = RootDef->getOperand(1);
312+
MachineOperand &RHS = RootDef->getOperand(2);
313+
MachineInstr *LHSDef = MRI.getVRegDef(LHS.getReg());
314+
MachineInstr *RHSDef = MRI.getVRegDef(RHS.getReg());
315+
316+
int64_t RHSC = RHSDef->getOperand(1).getCImm()->getSExtValue();
317+
if (isInt<12>(RHSC)) {
318+
if (LHSDef->getOpcode() == TargetOpcode::G_FRAME_INDEX)
319+
return {{
320+
[=](MachineInstrBuilder &MIB) { MIB.add(LHSDef->getOperand(1)); },
321+
[=](MachineInstrBuilder &MIB) { MIB.addImm(RHSC); },
322+
}};
323+
324+
return {{[=](MachineInstrBuilder &MIB) { MIB.add(LHS); },
325+
[=](MachineInstrBuilder &MIB) { MIB.addImm(RHSC); }}};
326+
}
327+
}
328+
310329
// TODO: Need to get the immediate from a G_PTR_ADD. Should this be done in
311330
// the combiner?
312331
return {{[=](MachineInstrBuilder &MIB) { MIB.addReg(Root.getReg()); },

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/load-rv32.mir

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
%ptr0 = alloca i32
1616
ret void
1717
}
18+
define void @load_fi_gep_i32() {
19+
%ptr0 = alloca [2 x i32]
20+
ret void
21+
}
22+
define void @load_gep_i32(ptr %addr) { ret void }
1823
...
1924
---
2025
name: load_i8
@@ -213,3 +218,50 @@ body: |
213218
PseudoRET implicit $x10
214219
215220
...
221+
---
222+
name: load_fi_gep_i32
223+
legalized: true
224+
regBankSelected: true
225+
tracksRegLiveness: true
226+
227+
stack:
228+
- { id: 0, name: ptr0, offset: 0, size: 8, alignment: 4 }
229+
230+
body: |
231+
bb.0:
232+
; CHECK-LABEL: name: load_fi_gep_i32
233+
; CHECK: [[LW:%[0-9]+]]:gpr = LW %stack.0.ptr0, 4 :: (load (s32))
234+
; CHECK-NEXT: $x10 = COPY [[LW]]
235+
; CHECK-NEXT: PseudoRET implicit $x10
236+
%0:gprb(p0) = G_FRAME_INDEX %stack.0.ptr0
237+
%1:gprb(s32) = G_CONSTANT i32 4
238+
%2:gprb(p0) = G_PTR_ADD %0(p0), %1(s32)
239+
%3:gprb(s32) = G_LOAD %2(p0) :: (load (s32))
240+
$x10 = COPY %3(s32)
241+
PseudoRET implicit $x10
242+
243+
...
244+
---
245+
name: load_gep_i32
246+
legalized: true
247+
regBankSelected: true
248+
tracksRegLiveness: true
249+
body: |
250+
bb.0:
251+
liveins: $x10
252+
253+
; CHECK-LABEL: name: load_gep_i32
254+
; CHECK: liveins: $x10
255+
; CHECK-NEXT: {{ $}}
256+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
257+
; CHECK-NEXT: [[LW:%[0-9]+]]:gpr = LW [[COPY]], 4 :: (load (s32))
258+
; CHECK-NEXT: $x10 = COPY [[LW]]
259+
; CHECK-NEXT: PseudoRET implicit $x10
260+
%0:gprb(p0) = COPY $x10
261+
%1:gprb(s32) = G_CONSTANT i32 4
262+
%2:gprb(p0) = G_PTR_ADD %0(p0), %1(s32)
263+
%3:gprb(s32) = G_LOAD %2(p0) :: (load (s32))
264+
$x10 = COPY %3(s32)
265+
PseudoRET implicit $x10
266+
267+
...

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/load-rv64.mir

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
%ptr0 = alloca i64
2626
ret void
2727
}
28+
define void @load_fi_gep_i64_i64() {
29+
%ptr0 = alloca [2 x i64]
30+
ret void
31+
}
32+
define void @load_gep_i64_i64(ptr %addr) { ret void }
2833
...
2934
---
3035
name: load_i8_i64
@@ -478,3 +483,50 @@ body: |
478483
PseudoRET implicit $x10
479484
480485
...
486+
---
487+
name: load_fi_gep_i64_i64
488+
legalized: true
489+
regBankSelected: true
490+
tracksRegLiveness: true
491+
492+
stack:
493+
- { id: 0, name: ptr0, offset: 0, size: 16, alignment: 8 }
494+
495+
body: |
496+
bb.0:
497+
; CHECK-LABEL: name: load_fi_gep_i64_i64
498+
; CHECK: [[LD:%[0-9]+]]:gpr = LD %stack.0.ptr0, 8 :: (load (s64))
499+
; CHECK-NEXT: $x10 = COPY [[LD]]
500+
; CHECK-NEXT: PseudoRET implicit $x10
501+
%0:gprb(p0) = G_FRAME_INDEX %stack.0.ptr0
502+
%1:gprb(s64) = G_CONSTANT i64 8
503+
%2:gprb(p0) = G_PTR_ADD %0(p0), %1(s64)
504+
%3:gprb(s64) = G_LOAD %2(p0) :: (load (s64))
505+
$x10 = COPY %3(s64)
506+
PseudoRET implicit $x10
507+
508+
...
509+
---
510+
name: load_gep_i64_i64
511+
legalized: true
512+
regBankSelected: true
513+
tracksRegLiveness: true
514+
body: |
515+
bb.0:
516+
liveins: $x10
517+
518+
; CHECK-LABEL: name: load_gep_i64_i64
519+
; CHECK: liveins: $x10
520+
; CHECK-NEXT: {{ $}}
521+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
522+
; CHECK-NEXT: [[LD:%[0-9]+]]:gpr = LD [[COPY]], 8 :: (load (s64))
523+
; CHECK-NEXT: $x10 = COPY [[LD]]
524+
; CHECK-NEXT: PseudoRET implicit $x10
525+
%0:gprb(p0) = COPY $x10
526+
%1:gprb(s64) = G_CONSTANT i64 8
527+
%2:gprb(p0) = G_PTR_ADD %0(p0), %1(s64)
528+
%3:gprb(s64) = G_LOAD %2(p0) :: (load (s64))
529+
$x10 = COPY %3(s64)
530+
PseudoRET implicit $x10
531+
532+
...

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/store-rv32.mir

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
%ptr0 = alloca i32
1212
ret void
1313
}
14+
define void @store_fi_gep_i32(ptr %val) {
15+
%ptr0 = alloca [2 x i32]
16+
ret void
17+
}
18+
define void @store_gep_i32(i32 %val, ptr %addr) { ret void }
1419
...
1520
---
1621
name: store_i8
@@ -125,3 +130,54 @@ body: |
125130
PseudoRET
126131
127132
...
133+
---
134+
name: store_fi_gep_i32
135+
legalized: true
136+
regBankSelected: true
137+
tracksRegLiveness: true
138+
139+
stack:
140+
- { id: 0, name: ptr0, offset: 0, size: 8, alignment: 4 }
141+
142+
body: |
143+
bb.0:
144+
liveins: $x10
145+
146+
; CHECK-LABEL: name: store_fi_gep_i32
147+
; CHECK: liveins: $x10
148+
; CHECK-NEXT: {{ $}}
149+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
150+
; CHECK-NEXT: SW [[COPY]], %stack.0.ptr0, 4 :: (store (s32))
151+
; CHECK-NEXT: PseudoRET
152+
%0:gprb(s32) = COPY $x10
153+
%1:gprb(p0) = G_FRAME_INDEX %stack.0.ptr0
154+
%2:gprb(s32) = G_CONSTANT i32 4
155+
%3:gprb(p0) = G_PTR_ADD %1(p0), %2(s32)
156+
G_STORE %0(s32), %3(p0) :: (store (s32))
157+
PseudoRET
158+
159+
...
160+
---
161+
name: store_gep_i32
162+
legalized: true
163+
regBankSelected: true
164+
tracksRegLiveness: true
165+
body: |
166+
bb.0:
167+
liveins: $x10, $x11
168+
169+
; CHECK-LABEL: name: store_gep_i32
170+
; CHECK: liveins: $x10, $x11
171+
; CHECK-NEXT: {{ $}}
172+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
173+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11
174+
; CHECK-NEXT: SW [[COPY]], [[COPY1]], 4 :: (store (s32))
175+
; CHECK-NEXT: PseudoRET
176+
%0:gprb(s32) = COPY $x10
177+
%1:gprb(p0) = COPY $x11
178+
%2:gprb(s32) = G_CONSTANT i32 4
179+
%3:gprb(p0) = G_PTR_ADD %1(p0), %2(s32)
180+
G_STORE %0(s32), %3(p0) :: (store (s32))
181+
PseudoRET
182+
183+
...

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/store-rv64.mir

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
%ptr0 = alloca i64
1616
ret void
1717
}
18+
define void @store_fi_gep_i64_i64(ptr %val) {
19+
%ptr0 = alloca [2 x i64]
20+
ret void
21+
}
22+
define void @store_gep_i64_i64(i32 %val, ptr %addr) { ret void }
1823
...
1924
---
2025
name: store_i8_i64
@@ -247,3 +252,54 @@ body: |
247252
PseudoRET
248253
249254
...
255+
---
256+
name: store_fi_gep_i64_i64
257+
legalized: true
258+
regBankSelected: true
259+
tracksRegLiveness: true
260+
261+
stack:
262+
- { id: 0, name: ptr0, offset: 0, size: 16, alignment: 8 }
263+
264+
body: |
265+
bb.0:
266+
liveins: $x10
267+
268+
; CHECK-LABEL: name: store_fi_gep_i64_i64
269+
; CHECK: liveins: $x10
270+
; CHECK-NEXT: {{ $}}
271+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
272+
; CHECK-NEXT: SD [[COPY]], %stack.0.ptr0, 8 :: (store (s64))
273+
; CHECK-NEXT: PseudoRET
274+
%0:gprb(s64) = COPY $x10
275+
%1:gprb(p0) = G_FRAME_INDEX %stack.0.ptr0
276+
%2:gprb(s64) = G_CONSTANT i64 8
277+
%3:gprb(p0) = G_PTR_ADD %1(p0), %2(s64)
278+
G_STORE %0(s64), %3(p0) :: (store (s64))
279+
PseudoRET
280+
281+
...
282+
---
283+
name: store_gep_i64_i64
284+
legalized: true
285+
regBankSelected: true
286+
tracksRegLiveness: true
287+
body: |
288+
bb.0:
289+
liveins: $x10, $x11
290+
291+
; CHECK-LABEL: name: store_gep_i64_i64
292+
; CHECK: liveins: $x10, $x11
293+
; CHECK-NEXT: {{ $}}
294+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
295+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11
296+
; CHECK-NEXT: SD [[COPY]], [[COPY1]], 8 :: (store (s64))
297+
; CHECK-NEXT: PseudoRET
298+
%0:gprb(s64) = COPY $x10
299+
%1:gprb(p0) = COPY $x11
300+
%2:gprb(s64) = G_CONSTANT i64 8
301+
%3:gprb(p0) = G_PTR_ADD %1(p0), %2(s64)
302+
G_STORE %0(s64), %3(p0) :: (store (s64))
303+
PseudoRET
304+
305+
...

0 commit comments

Comments
 (0)