Skip to content

Commit 903f6fc

Browse files
preameslukel97
andauthored
[RISCV] Prune dead LI in vsetvli coalescing with trivially dead vsetvli (#98647)
This is a follow up to ff8a03a. On the review for that, I'd suggested a stylistic rework, but after discussion we decided to move forward with the fix as it was. This change is a small part of that suggested rework. Once I sat down and wrote the code, I think I've convinced myself of an entirely different approach (tbd), but for the moment, let's use a lambda to share code so that we can pickup a missed optimization, and reduce some duplication. --------- Co-authored-by: Luke Lau <[email protected]>
1 parent 4fac145 commit 903f6fc

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1644,6 +1644,24 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
16441644
Used.demandVL();
16451645
Used.demandVTYPE();
16461646
SmallVector<MachineInstr*> ToDelete;
1647+
1648+
// Update LIS and cleanup dead AVLs given a value which has
1649+
// has had one use (as an AVL) removed.
1650+
auto afterDroppedAVLUse = [&](Register OldVLReg) {
1651+
if (LIS)
1652+
LIS->shrinkToUses(&LIS->getInterval(OldVLReg));
1653+
1654+
MachineInstr *VLOpDef = MRI->getUniqueVRegDef(OldVLReg);
1655+
if (VLOpDef && TII->isAddImmediate(*VLOpDef, OldVLReg) &&
1656+
MRI->use_nodbg_empty(OldVLReg)) {
1657+
if (LIS) {
1658+
LIS->removeInterval(OldVLReg);
1659+
LIS->RemoveMachineInstrFromMaps(*VLOpDef);
1660+
}
1661+
VLOpDef->eraseFromParent();
1662+
}
1663+
};
1664+
16471665
for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend())) {
16481666

16491667
if (!isVectorConfigInstr(MI)) {
@@ -1696,22 +1714,9 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
16961714
MI.getOperand(1).ChangeToImmediate(NextMI->getOperand(1).getImm());
16971715
else
16981716
MI.getOperand(1).ChangeToRegister(NextMI->getOperand(1).getReg(), false);
1717+
if (OldVLReg && OldVLReg.isVirtual())
1718+
afterDroppedAVLUse(OldVLReg);
16991719

1700-
if (OldVLReg && OldVLReg.isVirtual()) {
1701-
// MI no longer uses OldVLReg so shrink its LiveInterval.
1702-
if (LIS)
1703-
LIS->shrinkToUses(&LIS->getInterval(OldVLReg));
1704-
1705-
MachineInstr *VLOpDef = MRI->getUniqueVRegDef(OldVLReg);
1706-
if (VLOpDef && TII->isAddImmediate(*VLOpDef, OldVLReg) &&
1707-
MRI->use_nodbg_empty(OldVLReg)) {
1708-
if (LIS) {
1709-
LIS->removeInterval(OldVLReg);
1710-
LIS->RemoveMachineInstrFromMaps(*VLOpDef);
1711-
}
1712-
VLOpDef->eraseFromParent();
1713-
}
1714-
}
17151720
MI.setDesc(NextMI->getDesc());
17161721
}
17171722
MI.getOperand(2).setImm(NextMI->getOperand(2).getImm());
@@ -1731,8 +1736,8 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
17311736
if (MI->getOperand(1).isReg())
17321737
OldAVLReg = MI->getOperand(1).getReg();
17331738
MI->eraseFromParent();
1734-
if (LIS && OldAVLReg && OldAVLReg.isVirtual())
1735-
LIS->shrinkToUses(&LIS->getInterval(OldAVLReg));
1739+
if (OldAVLReg && OldAVLReg.isVirtual())
1740+
afterDroppedAVLUse(OldAVLReg);
17361741
}
17371742
}
17381743

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,6 @@ body: |
589589
; CHECK-LABEL: name: coalesce_shrink_removed_vsetvlis_uses
590590
; CHECK: liveins: $x10, $v8
591591
; CHECK-NEXT: {{ $}}
592-
; CHECK-NEXT: %avl1:gprnox0 = ADDI $x0, 1
593592
; CHECK-NEXT: %avl2:gprnox0 = ADDI $x0, 2
594593
; CHECK-NEXT: dead $x0 = PseudoVSETVLI %avl2, 209 /* e32, m2, ta, ma */, implicit-def $vl, implicit-def $vtype
595594
; CHECK-NEXT: %x:gpr = COPY $x10

0 commit comments

Comments
 (0)