Skip to content

Commit 6c23e9e

Browse files
authored
[RISCV] Fix crash when trying to remove segment (#146524)
LiveInterval DefLI can be consisting of multiple segments, and SlotIndex NewDefSI can be inside any of them. Currenty it is assumed that NewDefSI belongs to the first segment, and when trying to call removeSegment, clang crashes since there is no segment containing [DefLI.beginIndex(), NewDefSI] FIxes #146518
1 parent 4b9f622 commit 6c23e9e

File tree

3 files changed

+77
-2
lines changed

3 files changed

+77
-2
lines changed

llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,8 +1768,9 @@ void RISCVInsertVSETVLI::insertReadVL(MachineBasicBlock &MBB) {
17681768
SlotIndex NewDefSI =
17691769
LIS->InsertMachineInstrInMaps(*ReadVLMI).getRegSlot();
17701770
LiveInterval &DefLI = LIS->getInterval(VLOutput);
1771-
VNInfo *DefVNI = DefLI.getVNInfoAt(DefLI.beginIndex());
1772-
DefLI.removeSegment(DefLI.beginIndex(), NewDefSI);
1771+
LiveRange::Segment *DefSeg = DefLI.getSegmentContaining(NewDefSI);
1772+
VNInfo *DefVNI = DefLI.getVNInfoAt(DefSeg->start);
1773+
DefLI.removeSegment(DefSeg->start, NewDefSI);
17731774
DefVNI->def = NewDefSI;
17741775
}
17751776
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,3 +721,35 @@ define i64 @avl_undef2() {
721721
%1 = tail call i64 @llvm.riscv.vsetvli(i64 poison, i64 2, i64 7)
722722
ret i64 %1
723723
}
724+
725+
define i64 @vsetvli_vleff(ptr %s, i64 %evl) {
726+
; CHECK-LABEL: vsetvli_vleff:
727+
; CHECK: # %bb.0: # %entry
728+
; CHECK-NEXT: vsetvli a3, zero, e16, m1, ta, ma
729+
; CHECK-NEXT: vmv.v.i v8, 0
730+
; CHECK-NEXT: .LBB37_1: # %while.body
731+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
732+
; CHECK-NEXT: vsetvli zero, a1, e16, m1, tu, ma
733+
; CHECK-NEXT: vmv1r.v v9, v8
734+
; CHECK-NEXT: vle16ff.v v9, (a0)
735+
; CHECK-NEXT: csrr a2, vl
736+
; CHECK-NEXT: beqz a2, .LBB37_1
737+
; CHECK-NEXT: # %bb.2: # %while.end
738+
; CHECK-NEXT: li a0, 0
739+
; CHECK-NEXT: ret
740+
entry:
741+
br label %while.cond
742+
743+
while.cond:
744+
%new_vl.0 = phi i64 [ 0, %entry ], [ %1, %while.body ]
745+
%cmp = icmp eq i64 %new_vl.0, 0
746+
br i1 %cmp, label %while.body, label %while.end
747+
748+
while.body:
749+
%0 = tail call { <vscale x 4 x i16>, i64 } @llvm.riscv.vleff.nxv4i16.i64(<vscale x 4 x i16> zeroinitializer, ptr %s, i64 %evl)
750+
%1 = extractvalue { <vscale x 4 x i16>, i64 } %0, 1
751+
br label %while.cond
752+
753+
while.end:
754+
ret i64 0
755+
}

llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.mir

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@
100100
ret void
101101
}
102102

103+
define void @vsetvli_vleff() {
104+
ret void
105+
}
106+
103107
declare <vscale x 1 x i64> @llvm.riscv.vadd.nxv1i64.nxv1i64.i64(<vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i64>, i64) #1
104108

105109
declare <vscale x 1 x i64> @llvm.riscv.vle.nxv1i64.i64(<vscale x 1 x i64>, ptr nocapture, i64) #4
@@ -622,3 +626,41 @@ body: |
622626
dead $x0 = PseudoVSETIVLI 1, 208, implicit-def $vl, implicit-def $vtype
623627
%v:vr = COPY $v8, implicit $vtype
624628
%x = PseudoVSETVLI %x, 208, implicit-def $vl, implicit-def $vtype
629+
...
630+
---
631+
name: vsetvli_vleff
632+
tracksRegLiveness: true
633+
body: |
634+
; CHECK-LABEL: name: vsetvli_vleff
635+
; CHECK: bb.0:
636+
; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
637+
; CHECK-NEXT: {{ $}}
638+
; CHECK-NEXT: %vl:gpr = COPY $x0
639+
; CHECK-NEXT: BNE $x0, $x0, %bb.2
640+
; CHECK-NEXT: PseudoBR %bb.1
641+
; CHECK-NEXT: {{ $}}
642+
; CHECK-NEXT: bb.1:
643+
; CHECK-NEXT: successors: %bb.2(0x80000000)
644+
; CHECK-NEXT: {{ $}}
645+
; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 200 /* e16, m1, ta, ma */, implicit-def $vl, implicit-def $vtype
646+
; CHECK-NEXT: $noreg, $x0 = PseudoVLE16FF_V_M1 $noreg, $noreg, 0, 4 /* e16 */, 2 /* tu, ma */, implicit $vl, implicit $vtype, implicit-def $vl
647+
; CHECK-NEXT: %vl:gpr = PseudoReadVL implicit $vl
648+
; CHECK-NEXT: {{ $}}
649+
; CHECK-NEXT: bb.2:
650+
; CHECK-NEXT: $x10 = COPY %vl
651+
; CHECK-NEXT: PseudoRET implicit killed $x10
652+
bb.0:
653+
successors: %bb.1(0x40000000), %bb.2(0x40000000)
654+
655+
%vl:gpr = COPY $x0
656+
BNE $x0, $x0, %bb.2
657+
PseudoBR %bb.1
658+
659+
bb.1:
660+
successors: %bb.2(0x80000000)
661+
662+
$noreg, %vl:gpr = PseudoVLE16FF_V_M1 $noreg, $noreg, 0, 4 /* e16 */, 2 /* tu, ma */
663+
664+
bb.2:
665+
$x10 = COPY %vl
666+
PseudoRET implicit killed $x10

0 commit comments

Comments
 (0)