diff --git a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp index 78d64ea67324f..dd002473a06e2 100644 --- a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp +++ b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp @@ -1768,8 +1768,9 @@ void RISCVInsertVSETVLI::insertReadVL(MachineBasicBlock &MBB) { SlotIndex NewDefSI = LIS->InsertMachineInstrInMaps(*ReadVLMI).getRegSlot(); LiveInterval &DefLI = LIS->getInterval(VLOutput); - VNInfo *DefVNI = DefLI.getVNInfoAt(DefLI.beginIndex()); - DefLI.removeSegment(DefLI.beginIndex(), NewDefSI); + LiveRange::Segment *DefSeg = DefLI.getSegmentContaining(NewDefSI); + VNInfo *DefVNI = DefLI.getVNInfoAt(DefSeg->start); + DefLI.removeSegment(DefSeg->start, NewDefSI); DefVNI->def = NewDefSI; } } diff --git a/llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll b/llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll index 8b48dc43eca29..a61e56d7877b5 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll @@ -722,3 +722,35 @@ define i64 @avl_undef2() { %1 = tail call i64 @llvm.riscv.vsetvli(i64 poison, i64 2, i64 7) ret i64 %1 } + +define i64 @vsetvli_vleff(ptr %s, i64 %evl) { +; CHECK-LABEL: vsetvli_vleff: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a3, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.i v8, 0 +; CHECK-NEXT: .LBB37_1: # %while.body +; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 +; CHECK-NEXT: vsetvli zero, a1, e16, m1, tu, ma +; CHECK-NEXT: vmv1r.v v9, v8 +; CHECK-NEXT: vle16ff.v v9, (a0) +; CHECK-NEXT: csrr a2, vl +; CHECK-NEXT: beqz a2, .LBB37_1 +; CHECK-NEXT: # %bb.2: # %while.end +; CHECK-NEXT: li a0, 0 +; CHECK-NEXT: ret +entry: + br label %while.cond + +while.cond: + %new_vl.0 = phi i64 [ 0, %entry ], [ %1, %while.body ] + %cmp = icmp eq i64 %new_vl.0, 0 + br i1 %cmp, label %while.body, label %while.end + +while.body: + %0 = tail call { , i64 } @llvm.riscv.vleff.nxv4i16.i64( zeroinitializer, ptr %s, i64 %evl) + %1 = extractvalue { , i64 } %0, 1 + br label %while.cond + +while.end: + ret i64 0 +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.mir b/llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.mir index 6bd03eb0c2226..fdd30c9a2c772 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.mir +++ b/llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.mir @@ -100,6 +100,10 @@ ret void } + define void @vsetvli_vleff() { + ret void + } + declare @llvm.riscv.vadd.nxv1i64.nxv1i64.i64(, , , i64) #1 declare @llvm.riscv.vle.nxv1i64.i64(, ptr nocapture, i64) #4 @@ -622,3 +626,41 @@ body: | dead $x0 = PseudoVSETIVLI 1, 208, implicit-def $vl, implicit-def $vtype %v:vr = COPY $v8, implicit $vtype %x = PseudoVSETVLI %x, 208, implicit-def $vl, implicit-def $vtype +... +--- +name: vsetvli_vleff +tracksRegLiveness: true +body: | + ; CHECK-LABEL: name: vsetvli_vleff + ; CHECK: bb.0: + ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %vl:gpr = COPY $x0 + ; CHECK-NEXT: BNE $x0, $x0, %bb.2 + ; CHECK-NEXT: PseudoBR %bb.1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.1: + ; CHECK-NEXT: successors: %bb.2(0x80000000) + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 200 /* e16, m1, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: $noreg, $x0 = PseudoVLE16FF_V_M1 $noreg, $noreg, 0, 4 /* e16 */, 2 /* tu, ma */, implicit $vl, implicit $vtype, implicit-def $vl + ; CHECK-NEXT: %vl:gpr = PseudoReadVL implicit $vl + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.2: + ; CHECK-NEXT: $x10 = COPY %vl + ; CHECK-NEXT: PseudoRET implicit killed $x10 + bb.0: + successors: %bb.1(0x40000000), %bb.2(0x40000000) + + %vl:gpr = COPY $x0 + BNE $x0, $x0, %bb.2 + PseudoBR %bb.1 + + bb.1: + successors: %bb.2(0x80000000) + + $noreg, %vl:gpr = PseudoVLE16FF_V_M1 $noreg, $noreg, 0, 4 /* e16 */, 2 /* tu, ma */ + + bb.2: + $x10 = COPY %vl + PseudoRET implicit killed $x10