Skip to content

Commit 2b0f29f

Browse files
committed
[RISCV] Enable rematerialization for scalar loads
1 parent bc86a8f commit 2b0f29f

File tree

6 files changed

+76
-87
lines changed

6 files changed

+76
-87
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ def BGE : BranchCC_rri<0b101, "bge">;
768768
def BLTU : BranchCC_rri<0b110, "bltu">;
769769
def BGEU : BranchCC_rri<0b111, "bgeu">;
770770

771-
let IsSignExtendingOpW = 1, canFoldAsLoad = 1 in {
771+
let IsSignExtendingOpW = 1, canFoldAsLoad = 1, isReMaterializable = 1 in {
772772
def LB : Load_ri<0b000, "lb">, Sched<[WriteLDB, ReadMemBase]>;
773773
def LH : Load_ri<0b001, "lh">, Sched<[WriteLDH, ReadMemBase]>;
774774
def LW : Load_ri<0b010, "lw">, Sched<[WriteLDW, ReadMemBase]>;
@@ -889,7 +889,7 @@ def CSRRCI : CSR_ii<0b111, "csrrci">;
889889
/// RV64I instructions
890890

891891
let Predicates = [IsRV64] in {
892-
let canFoldAsLoad = 1 in {
892+
let canFoldAsLoad = 1, isReMaterializable = 1 in {
893893
def LWU : Load_ri<0b110, "lwu">, Sched<[WriteLDW, ReadMemBase]>;
894894
def LD : Load_ri<0b011, "ld">, Sched<[WriteLDD, ReadMemBase]>;
895895
}

llvm/lib/Target/RISCV/RISCVInstrInfoD.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ defvar DExtsRV64 = [DExt, ZdinxExt];
7171
//===----------------------------------------------------------------------===//
7272

7373
let Predicates = [HasStdExtD] in {
74-
let canFoldAsLoad = 1 in
74+
let canFoldAsLoad = 1, isReMaterializable = 1 in
7575
def FLD : FPLoad_r<0b011, "fld", FPR64, WriteFLD64>;
7676

7777
// Operands for stores are in the order srcreg, base, offset rather than

llvm/lib/Target/RISCV/RISCVInstrInfoF.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ class PseudoFROUND<DAGOperand Ty, ValueType vt, ValueType intvt = XLenVT>
330330
//===----------------------------------------------------------------------===//
331331

332332
let Predicates = [HasStdExtF] in {
333-
let canFoldAsLoad = 1 in
333+
let canFoldAsLoad = 1, isReMaterializable = 1 in
334334
def FLW : FPLoad_r<0b010, "flw", FPR32, WriteFLD32>;
335335

336336
// Operands for stores are in the order srcreg, base, offset rather than

llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ defvar ZfhminDExts = [ZfhminDExt, ZhinxminZdinxExt, ZhinxminZdinx32Ext];
9090
//===----------------------------------------------------------------------===//
9191

9292
let Predicates = [HasHalfFPLoadStoreMove] in {
93-
let canFoldAsLoad = 1 in
93+
let canFoldAsLoad = 1, isReMaterializable = 1 in
9494
def FLH : FPLoad_r<0b001, "flh", FPR16, WriteFLD16>;
9595

9696
// Operands for stores are in the order srcreg, base, offset rather than

llvm/test/CodeGen/RISCV/remat.ll

Lines changed: 70 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -204,50 +204,41 @@ declare i32 @foo(i32, i32, i32, i32, i32, i32)
204204
define void @remat_load(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15, i8 %stackarg0, i16 %stackarg1, i32 %stackarg2, i64 %stackarg3, half %stackarg4, bfloat %stackarg5, float %stackarg6, double %stackarg7, ptr %p) nounwind {
205205
; CHECK-LABEL: remat_load:
206206
; CHECK: # %bb.0: # %entry
207-
; CHECK-NEXT: addi sp, sp, -256
208-
; CHECK-NEXT: sd ra, 248(sp) # 8-byte Folded Spill
209-
; CHECK-NEXT: sd s0, 240(sp) # 8-byte Folded Spill
210-
; CHECK-NEXT: sd s1, 232(sp) # 8-byte Folded Spill
211-
; CHECK-NEXT: sd s2, 224(sp) # 8-byte Folded Spill
212-
; CHECK-NEXT: sd s3, 216(sp) # 8-byte Folded Spill
213-
; CHECK-NEXT: sd s4, 208(sp) # 8-byte Folded Spill
214-
; CHECK-NEXT: sd s5, 200(sp) # 8-byte Folded Spill
215-
; CHECK-NEXT: sd s6, 192(sp) # 8-byte Folded Spill
216-
; CHECK-NEXT: sd s7, 184(sp) # 8-byte Folded Spill
217-
; CHECK-NEXT: sd s8, 176(sp) # 8-byte Folded Spill
218-
; CHECK-NEXT: sd s9, 168(sp) # 8-byte Folded Spill
219-
; CHECK-NEXT: sd s10, 160(sp) # 8-byte Folded Spill
220-
; CHECK-NEXT: sd s11, 152(sp) # 8-byte Folded Spill
221-
; CHECK-NEXT: fsd fs0, 144(sp) # 8-byte Folded Spill
222-
; CHECK-NEXT: fsd fs1, 136(sp) # 8-byte Folded Spill
223-
; CHECK-NEXT: fsd fs2, 128(sp) # 8-byte Folded Spill
224-
; CHECK-NEXT: fsd fs3, 120(sp) # 8-byte Folded Spill
225-
; CHECK-NEXT: fsd fs4, 112(sp) # 8-byte Folded Spill
226-
; CHECK-NEXT: fsd fs5, 104(sp) # 8-byte Folded Spill
227-
; CHECK-NEXT: fsd fs6, 96(sp) # 8-byte Folded Spill
228-
; CHECK-NEXT: fsd fs7, 88(sp) # 8-byte Folded Spill
229-
; CHECK-NEXT: fsd fs8, 80(sp) # 8-byte Folded Spill
230-
; CHECK-NEXT: fsd fs9, 72(sp) # 8-byte Folded Spill
231-
; CHECK-NEXT: fsd fs10, 64(sp) # 8-byte Folded Spill
232-
; CHECK-NEXT: fsd fs11, 56(sp) # 8-byte Folded Spill
233-
; CHECK-NEXT: fld fa5, 312(sp)
234-
; CHECK-NEXT: fsd fa5, 48(sp) # 8-byte Folded Spill
235-
; CHECK-NEXT: flw fa4, 304(sp)
236-
; CHECK-NEXT: fsw fa4, 44(sp) # 4-byte Folded Spill
237-
; CHECK-NEXT: flh fa3, 296(sp)
238-
; CHECK-NEXT: fsh fa3, 42(sp) # 2-byte Folded Spill
239-
; CHECK-NEXT: flh fa2, 288(sp)
240-
; CHECK-NEXT: fsh fa2, 40(sp) # 2-byte Folded Spill
241-
; CHECK-NEXT: ld a0, 320(sp)
242-
; CHECK-NEXT: sd a0, 0(sp) # 8-byte Folded Spill
243-
; CHECK-NEXT: lbu a4, 256(sp)
244-
; CHECK-NEXT: sd a4, 8(sp) # 8-byte Folded Spill
245-
; CHECK-NEXT: lh a3, 264(sp)
246-
; CHECK-NEXT: sd a3, 16(sp) # 8-byte Folded Spill
247-
; CHECK-NEXT: lw a2, 272(sp)
248-
; CHECK-NEXT: sd a2, 24(sp) # 8-byte Folded Spill
249-
; CHECK-NEXT: ld a1, 280(sp)
250-
; CHECK-NEXT: sd a1, 32(sp) # 8-byte Folded Spill
207+
; CHECK-NEXT: addi sp, sp, -208
208+
; CHECK-NEXT: sd ra, 200(sp) # 8-byte Folded Spill
209+
; CHECK-NEXT: sd s0, 192(sp) # 8-byte Folded Spill
210+
; CHECK-NEXT: sd s1, 184(sp) # 8-byte Folded Spill
211+
; CHECK-NEXT: sd s2, 176(sp) # 8-byte Folded Spill
212+
; CHECK-NEXT: sd s3, 168(sp) # 8-byte Folded Spill
213+
; CHECK-NEXT: sd s4, 160(sp) # 8-byte Folded Spill
214+
; CHECK-NEXT: sd s5, 152(sp) # 8-byte Folded Spill
215+
; CHECK-NEXT: sd s6, 144(sp) # 8-byte Folded Spill
216+
; CHECK-NEXT: sd s7, 136(sp) # 8-byte Folded Spill
217+
; CHECK-NEXT: sd s8, 128(sp) # 8-byte Folded Spill
218+
; CHECK-NEXT: sd s9, 120(sp) # 8-byte Folded Spill
219+
; CHECK-NEXT: sd s10, 112(sp) # 8-byte Folded Spill
220+
; CHECK-NEXT: sd s11, 104(sp) # 8-byte Folded Spill
221+
; CHECK-NEXT: fsd fs0, 96(sp) # 8-byte Folded Spill
222+
; CHECK-NEXT: fsd fs1, 88(sp) # 8-byte Folded Spill
223+
; CHECK-NEXT: fsd fs2, 80(sp) # 8-byte Folded Spill
224+
; CHECK-NEXT: fsd fs3, 72(sp) # 8-byte Folded Spill
225+
; CHECK-NEXT: fsd fs4, 64(sp) # 8-byte Folded Spill
226+
; CHECK-NEXT: fsd fs5, 56(sp) # 8-byte Folded Spill
227+
; CHECK-NEXT: fsd fs6, 48(sp) # 8-byte Folded Spill
228+
; CHECK-NEXT: fsd fs7, 40(sp) # 8-byte Folded Spill
229+
; CHECK-NEXT: fsd fs8, 32(sp) # 8-byte Folded Spill
230+
; CHECK-NEXT: fsd fs9, 24(sp) # 8-byte Folded Spill
231+
; CHECK-NEXT: fsd fs10, 16(sp) # 8-byte Folded Spill
232+
; CHECK-NEXT: fsd fs11, 8(sp) # 8-byte Folded Spill
233+
; CHECK-NEXT: fld fa5, 264(sp)
234+
; CHECK-NEXT: flw fa4, 256(sp)
235+
; CHECK-NEXT: flh fa3, 248(sp)
236+
; CHECK-NEXT: flh fa2, 240(sp)
237+
; CHECK-NEXT: ld a0, 272(sp)
238+
; CHECK-NEXT: lbu a4, 208(sp)
239+
; CHECK-NEXT: lh a3, 216(sp)
240+
; CHECK-NEXT: lw a2, 224(sp)
241+
; CHECK-NEXT: ld a1, 232(sp)
251242
; CHECK-NEXT: sb a4, 0(a0)
252243
; CHECK-NEXT: sh a3, 0(a0)
253244
; CHECK-NEXT: sw a2, 0(a0)
@@ -258,49 +249,49 @@ define void @remat_load(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6,
258249
; CHECK-NEXT: fsd fa5, 0(a0)
259250
; CHECK-NEXT: #APP
260251
; CHECK-NEXT: #NO_APP
261-
; CHECK-NEXT: ld a0, 0(sp) # 8-byte Folded Reload
262-
; CHECK-NEXT: ld a1, 8(sp) # 8-byte Folded Reload
252+
; CHECK-NEXT: ld a0, 272(sp)
253+
; CHECK-NEXT: lbu a1, 208(sp)
263254
; CHECK-NEXT: sb a1, 0(a0)
264-
; CHECK-NEXT: ld a1, 16(sp) # 8-byte Folded Reload
255+
; CHECK-NEXT: lh a1, 216(sp)
265256
; CHECK-NEXT: sh a1, 0(a0)
266-
; CHECK-NEXT: ld a1, 24(sp) # 8-byte Folded Reload
257+
; CHECK-NEXT: lw a1, 224(sp)
267258
; CHECK-NEXT: sw a1, 0(a0)
268-
; CHECK-NEXT: ld a1, 32(sp) # 8-byte Folded Reload
259+
; CHECK-NEXT: ld a1, 232(sp)
269260
; CHECK-NEXT: sd a1, 0(a0)
270-
; CHECK-NEXT: flh fa5, 40(sp) # 2-byte Folded Reload
261+
; CHECK-NEXT: flh fa5, 240(sp)
271262
; CHECK-NEXT: fsh fa5, 0(a0)
272-
; CHECK-NEXT: flh fa5, 42(sp) # 2-byte Folded Reload
263+
; CHECK-NEXT: flh fa5, 248(sp)
273264
; CHECK-NEXT: fsh fa5, 0(a0)
274-
; CHECK-NEXT: flw fa5, 44(sp) # 4-byte Folded Reload
265+
; CHECK-NEXT: flw fa5, 256(sp)
275266
; CHECK-NEXT: fsw fa5, 0(a0)
276-
; CHECK-NEXT: fld fa5, 48(sp) # 8-byte Folded Reload
267+
; CHECK-NEXT: fld fa5, 264(sp)
277268
; CHECK-NEXT: fsd fa5, 0(a0)
278-
; CHECK-NEXT: ld ra, 248(sp) # 8-byte Folded Reload
279-
; CHECK-NEXT: ld s0, 240(sp) # 8-byte Folded Reload
280-
; CHECK-NEXT: ld s1, 232(sp) # 8-byte Folded Reload
281-
; CHECK-NEXT: ld s2, 224(sp) # 8-byte Folded Reload
282-
; CHECK-NEXT: ld s3, 216(sp) # 8-byte Folded Reload
283-
; CHECK-NEXT: ld s4, 208(sp) # 8-byte Folded Reload
284-
; CHECK-NEXT: ld s5, 200(sp) # 8-byte Folded Reload
285-
; CHECK-NEXT: ld s6, 192(sp) # 8-byte Folded Reload
286-
; CHECK-NEXT: ld s7, 184(sp) # 8-byte Folded Reload
287-
; CHECK-NEXT: ld s8, 176(sp) # 8-byte Folded Reload
288-
; CHECK-NEXT: ld s9, 168(sp) # 8-byte Folded Reload
289-
; CHECK-NEXT: ld s10, 160(sp) # 8-byte Folded Reload
290-
; CHECK-NEXT: ld s11, 152(sp) # 8-byte Folded Reload
291-
; CHECK-NEXT: fld fs0, 144(sp) # 8-byte Folded Reload
292-
; CHECK-NEXT: fld fs1, 136(sp) # 8-byte Folded Reload
293-
; CHECK-NEXT: fld fs2, 128(sp) # 8-byte Folded Reload
294-
; CHECK-NEXT: fld fs3, 120(sp) # 8-byte Folded Reload
295-
; CHECK-NEXT: fld fs4, 112(sp) # 8-byte Folded Reload
296-
; CHECK-NEXT: fld fs5, 104(sp) # 8-byte Folded Reload
297-
; CHECK-NEXT: fld fs6, 96(sp) # 8-byte Folded Reload
298-
; CHECK-NEXT: fld fs7, 88(sp) # 8-byte Folded Reload
299-
; CHECK-NEXT: fld fs8, 80(sp) # 8-byte Folded Reload
300-
; CHECK-NEXT: fld fs9, 72(sp) # 8-byte Folded Reload
301-
; CHECK-NEXT: fld fs10, 64(sp) # 8-byte Folded Reload
302-
; CHECK-NEXT: fld fs11, 56(sp) # 8-byte Folded Reload
303-
; CHECK-NEXT: addi sp, sp, 256
269+
; CHECK-NEXT: ld ra, 200(sp) # 8-byte Folded Reload
270+
; CHECK-NEXT: ld s0, 192(sp) # 8-byte Folded Reload
271+
; CHECK-NEXT: ld s1, 184(sp) # 8-byte Folded Reload
272+
; CHECK-NEXT: ld s2, 176(sp) # 8-byte Folded Reload
273+
; CHECK-NEXT: ld s3, 168(sp) # 8-byte Folded Reload
274+
; CHECK-NEXT: ld s4, 160(sp) # 8-byte Folded Reload
275+
; CHECK-NEXT: ld s5, 152(sp) # 8-byte Folded Reload
276+
; CHECK-NEXT: ld s6, 144(sp) # 8-byte Folded Reload
277+
; CHECK-NEXT: ld s7, 136(sp) # 8-byte Folded Reload
278+
; CHECK-NEXT: ld s8, 128(sp) # 8-byte Folded Reload
279+
; CHECK-NEXT: ld s9, 120(sp) # 8-byte Folded Reload
280+
; CHECK-NEXT: ld s10, 112(sp) # 8-byte Folded Reload
281+
; CHECK-NEXT: ld s11, 104(sp) # 8-byte Folded Reload
282+
; CHECK-NEXT: fld fs0, 96(sp) # 8-byte Folded Reload
283+
; CHECK-NEXT: fld fs1, 88(sp) # 8-byte Folded Reload
284+
; CHECK-NEXT: fld fs2, 80(sp) # 8-byte Folded Reload
285+
; CHECK-NEXT: fld fs3, 72(sp) # 8-byte Folded Reload
286+
; CHECK-NEXT: fld fs4, 64(sp) # 8-byte Folded Reload
287+
; CHECK-NEXT: fld fs5, 56(sp) # 8-byte Folded Reload
288+
; CHECK-NEXT: fld fs6, 48(sp) # 8-byte Folded Reload
289+
; CHECK-NEXT: fld fs7, 40(sp) # 8-byte Folded Reload
290+
; CHECK-NEXT: fld fs8, 32(sp) # 8-byte Folded Reload
291+
; CHECK-NEXT: fld fs9, 24(sp) # 8-byte Folded Reload
292+
; CHECK-NEXT: fld fs10, 16(sp) # 8-byte Folded Reload
293+
; CHECK-NEXT: fld fs11, 8(sp) # 8-byte Folded Reload
294+
; CHECK-NEXT: addi sp, sp, 208
304295
; CHECK-NEXT: ret
305296
entry:
306297
; Force loading the stack arguments to create their live interval

llvm/test/CodeGen/RISCV/rvv/pr95865.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ define i32 @main(i1 %arg.1, i64 %arg.2, i1 %arg.3, i64 %arg.4, i1 %arg.5, <vscal
4040
; CHECK-NEXT: li t0, 12
4141
; CHECK-NEXT: li s0, 4
4242
; CHECK-NEXT: li t1, 20
43-
; CHECK-NEXT: ld a1, 112(sp)
44-
; CHECK-NEXT: sd a1, 0(sp) # 8-byte Folded Spill
4543
; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma
4644
; CHECK-NEXT: vmv.v.i v8, 0
4745
; CHECK-NEXT: andi t3, a4, 1
@@ -142,7 +140,7 @@ define i32 @main(i1 %arg.1, i64 %arg.2, i1 %arg.3, i64 %arg.4, i1 %arg.5, <vscal
142140
; CHECK-NEXT: j .LBB0_11
143141
; CHECK-NEXT: .LBB0_12: # %for.body7.us.19
144142
; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
145-
; CHECK-NEXT: ld a0, 0(sp) # 8-byte Folded Reload
143+
; CHECK-NEXT: ld a0, 112(sp)
146144
; CHECK-NEXT: vmv.s.x v16, a0
147145
; CHECK-NEXT: vmv.v.i v8, 0
148146
; CHECK-NEXT: vsetivli zero, 2, e32, m1, tu, ma

0 commit comments

Comments
 (0)