Skip to content

Commit b3be148

Browse files
authored
[RISCV] Use LiveIntervals::extendToIndices to extend AVL in insertVSETVLI (#97512)
In #96200 we handled extending AVL LiveIntervals across basic blocks, which fixed a crash in a test case in 133ab9a. This was done by manually adding a single segment to the LiveInterval to extend it from AVL def -> inserted vsetvli, but in hindsight this was too simple and fails to handle cases where the vsetlvi is located before the AVL def. This patch fixes this by using LiveIntervals::extendToIndices instead which can handle these cases. (The crash that this fixes is separate from the crash in #97264)
1 parent 3969d2c commit b3be148

File tree

2 files changed

+44
-17
lines changed

2 files changed

+44
-17
lines changed

llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,10 +1161,7 @@ void RISCVInsertVSETVLI::insertVSETVLI(MachineBasicBlock &MBB,
11611161
// isn't always the case, e.g. PseudoVMV_X_S doesn't have an AVL operand or
11621162
// we've taken the AVL from the VL output of another vsetvli.
11631163
LiveInterval &LI = LIS->getInterval(AVLReg);
1164-
// Need to get non-const VNInfo
1165-
VNInfo *VNI = LI.getValNumInfo(Info.getAVLVNInfo()->id);
1166-
LI.addSegment(LiveInterval::Segment(
1167-
VNI->def, LIS->getInstructionIndex(*MI).getRegSlot(), VNI));
1164+
LIS->extendToIndices(LI, {LIS->getInstructionIndex(*MI).getRegSlot()});
11681165
}
11691166
}
11701167

llvm/test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.ll

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -322,19 +322,19 @@ declare void @foo()
322322
define <vscale x 1 x double> @test8(i64 %avl, i8 zeroext %cond, <vscale x 1 x double> %a, <vscale x 1 x double> %b) nounwind {
323323
; CHECK-LABEL: test8:
324324
; CHECK: # %bb.0: # %entry
325-
; CHECK-NEXT: addi sp, sp, -32
326-
; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
327-
; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
328-
; CHECK-NEXT: csrr a2, vlenb
329-
; CHECK-NEXT: slli a2, a2, 1
330-
; CHECK-NEXT: sub sp, sp, a2
331-
; CHECK-NEXT: mv s0, a0
332325
; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
333326
; CHECK-NEXT: beqz a1, .LBB6_2
334327
; CHECK-NEXT: # %bb.1: # %if.then
335328
; CHECK-NEXT: vfadd.vv v8, v8, v9
336-
; CHECK-NEXT: j .LBB6_3
329+
; CHECK-NEXT: ret
337330
; CHECK-NEXT: .LBB6_2: # %if.else
331+
; CHECK-NEXT: addi sp, sp, -32
332+
; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
333+
; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
334+
; CHECK-NEXT: csrr a1, vlenb
335+
; CHECK-NEXT: slli a1, a1, 1
336+
; CHECK-NEXT: sub sp, sp, a1
337+
; CHECK-NEXT: mv s0, a0
338338
; CHECK-NEXT: csrr a0, vlenb
339339
; CHECK-NEXT: add a0, a0, sp
340340
; CHECK-NEXT: addi a0, a0, 16
@@ -350,7 +350,6 @@ define <vscale x 1 x double> @test8(i64 %avl, i8 zeroext %cond, <vscale x 1 x do
350350
; CHECK-NEXT: vl1r.v v9, (a0) # Unknown-size Folded Reload
351351
; CHECK-NEXT: vsetvli zero, s0, e64, m1, ta, ma
352352
; CHECK-NEXT: vfsub.vv v8, v9, v8
353-
; CHECK-NEXT: .LBB6_3: # %if.then
354353
; CHECK-NEXT: csrr a0, vlenb
355354
; CHECK-NEXT: slli a0, a0, 1
356355
; CHECK-NEXT: add sp, sp, a0
@@ -1063,17 +1062,48 @@ exit:
10631062
ret <vscale x 2 x i32> %c
10641063
}
10651064

1065+
define void @cross_block_avl_extend_backwards(i1 %cond, <vscale x 8 x i8> %v, ptr %p, i64 %avl) {
1066+
; CHECK-LABEL: cross_block_avl_extend_backwards:
1067+
; CHECK: # %bb.0: # %entry
1068+
; CHECK-NEXT: andi a0, a0, 1
1069+
; CHECK-NEXT: beqz a0, .LBB25_2
1070+
; CHECK-NEXT: # %bb.1: # %exit
1071+
; CHECK-NEXT: ret
1072+
; CHECK-NEXT: .LBB25_2: # %bar
1073+
; CHECK-NEXT: addi a2, a2, 1
1074+
; CHECK-NEXT: .LBB25_3: # %foo
1075+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
1076+
; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
1077+
; CHECK-NEXT: vse8.v v8, (a1)
1078+
; CHECK-NEXT: vsetvli zero, a2, e8, m1, ta, ma
1079+
; CHECK-NEXT: vse8.v v8, (a1)
1080+
; CHECK-NEXT: j .LBB25_3
1081+
entry:
1082+
br i1 %cond, label %exit, label %bar
1083+
foo:
1084+
; Force a vl toggle
1085+
call void @llvm.riscv.vse.nxv8i8.i64(<vscale x 8 x i8> %v, ptr %p, i64 1)
1086+
; %add's LiveRange needs to be extended backwards to here.
1087+
call void @llvm.riscv.vse.nxv8i8.i64(<vscale x 8 x i8> %v, ptr %p, i64 %add)
1088+
br label %foo
1089+
exit:
1090+
ret void
1091+
bar:
1092+
%add = add i64 %avl, 1
1093+
br label %foo
1094+
}
1095+
10661096
define void @vlmax_avl_phi(i1 %cmp, ptr %p, i64 %a, i64 %b) {
10671097
; CHECK-LABEL: vlmax_avl_phi:
10681098
; CHECK: # %bb.0: # %entry
10691099
; CHECK-NEXT: andi a0, a0, 1
1070-
; CHECK-NEXT: beqz a0, .LBB25_2
1100+
; CHECK-NEXT: beqz a0, .LBB26_2
10711101
; CHECK-NEXT: # %bb.1: # %foo
10721102
; CHECK-NEXT: vsetvli zero, a2, e8, m1, ta, ma
1073-
; CHECK-NEXT: j .LBB25_3
1074-
; CHECK-NEXT: .LBB25_2: # %bar
1103+
; CHECK-NEXT: j .LBB26_3
1104+
; CHECK-NEXT: .LBB26_2: # %bar
10751105
; CHECK-NEXT: vsetvli zero, a3, e8, m1, ta, ma
1076-
; CHECK-NEXT: .LBB25_3: # %exit
1106+
; CHECK-NEXT: .LBB26_3: # %exit
10771107
; CHECK-NEXT: vmv.v.i v8, 0
10781108
; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
10791109
; CHECK-NEXT: vse8.v v8, (a1)

0 commit comments

Comments
 (0)