Skip to content

Commit ff8a03a

Browse files
authored
[RISCV] Fix coalesced vsetvli's AVL LiveInterval not always being shrunk (#98286)
Most of the time when we coalesce and delete a vsetvli, we shrink the LiveInterval of its AVL register now that there is one less use. However there's one edge case we were missing where if we have two vsetvlis with no users of vl or vtype in between, we coalesced a vsetvli without shrinking it's AVL. This fixes it by shrinking the LiveInterval whenever we delete a vsetvli, and also makes the LiveIntervals consistent in-situ by not removing the use before shrinking. This fixes a -verify-machineinstrs assertion in an MIR test case I found while investigating #97264 (comment). I couldn't recreate this at the LLVM IR level, seemingly because RISCVInsertVSETVLI will just avoid inserting extra vsetvlis that don't need coalesced.
1 parent 79bd628 commit ff8a03a

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,12 +1686,8 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
16861686
else
16871687
MI.getOperand(1).ChangeToRegister(NextMI->getOperand(1).getReg(), false);
16881688

1689-
// Clear NextMI's AVL early so we're not counting it as a use.
1690-
if (NextMI->getOperand(1).isReg())
1691-
NextMI->getOperand(1).setReg(RISCV::NoRegister);
1692-
16931689
if (OldVLReg && OldVLReg.isVirtual()) {
1694-
// NextMI no longer uses OldVLReg so shrink its LiveInterval.
1690+
// MI no longer uses OldVLReg so shrink its LiveInterval.
16951691
if (LIS)
16961692
LIS->shrinkToUses(&LIS->getInterval(OldVLReg));
16971693

@@ -1720,7 +1716,12 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
17201716
for (auto *MI : ToDelete) {
17211717
if (LIS)
17221718
LIS->RemoveMachineInstrFromMaps(*MI);
1719+
Register OldAVLReg;
1720+
if (MI->getOperand(1).isReg())
1721+
OldAVLReg = MI->getOperand(1).getReg();
17231722
MI->eraseFromParent();
1723+
if (LIS && OldAVLReg && OldAVLReg.isVirtual())
1724+
LIS->shrinkToUses(&LIS->getInterval(OldAVLReg));
17241725
}
17251726
}
17261727

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@
9292
ret void
9393
}
9494

95+
define void @coalesce_shrink_removed_vsetvlis_uses() {
96+
ret void
97+
}
98+
9599
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
96100

97101
declare <vscale x 1 x i64> @llvm.riscv.vle.nxv1i64.i64(<vscale x 1 x i64>, ptr nocapture, i64) #4
@@ -576,3 +580,25 @@ body: |
576580
$v0 = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 3, 6, 0
577581
PseudoRET
578582
...
583+
---
584+
name: coalesce_shrink_removed_vsetvlis_uses
585+
tracksRegLiveness: true
586+
body: |
587+
bb.0:
588+
liveins: $x10, $v8
589+
; CHECK-LABEL: name: coalesce_shrink_removed_vsetvlis_uses
590+
; CHECK: liveins: $x10, $v8
591+
; CHECK-NEXT: {{ $}}
592+
; CHECK-NEXT: %avl1:gprnox0 = ADDI $x0, 1
593+
; CHECK-NEXT: %avl2:gprnox0 = ADDI $x0, 2
594+
; CHECK-NEXT: dead $x0 = PseudoVSETVLI %avl2, 209 /* e32, m2, ta, ma */, implicit-def $vl, implicit-def $vtype
595+
; CHECK-NEXT: %x:gpr = COPY $x10
596+
; CHECK-NEXT: renamable $v8 = PseudoVMV_S_X undef renamable $v8, %x, 1, 5 /* e32 */, implicit $vl, implicit $vtype
597+
; CHECK-NEXT: PseudoRET implicit $v8
598+
%avl1:gprnox0 = ADDI $x0, 1
599+
dead $x0 = PseudoVSETVLI %avl1:gprnox0, 209, implicit-def dead $vl, implicit-def dead $vtype
600+
%avl2:gprnox0 = ADDI $x0, 2
601+
dead $x0 = PseudoVSETVLI %avl2:gprnox0, 209, implicit-def dead $vl, implicit-def dead $vtype
602+
%x:gpr = COPY $x10
603+
renamable $v8 = PseudoVMV_S_X undef renamable $v8, killed renamable %x, 1, 5
604+
PseudoRET implicit $v8

0 commit comments

Comments
 (0)