Skip to content

Commit fd58e50

Browse files
authored
[RISCV] Reverse iteration/deletion structure in vsetvli coalescing [NFC] (llvm#98936)
The code previously deferred deleting the vsetvli to avoid invalidating iterators, but eagerly deleted any ADDIs feeding the AVL register operand. This was safe because the iterator was known to point to a non-ADDI instruction (the vsetvli which was the previous user.) This change switches to using an early_inc_range so that we can eagerly delete the vsetvlis, but have to track ADDIs for later deletion. This is purely stylistic, but IMO makes the code easier to follow. It will also simplify a future change to support recursive deletion of trivially dead instructions (i.e. LUI/ADDI pairs.)
1 parent d1e28e2 commit fd58e50

File tree

1 file changed

+29
-26
lines changed

1 file changed

+29
-26
lines changed

llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,24 +1645,23 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
16451645
Used.demandVTYPE();
16461646
SmallVector<MachineInstr*> ToDelete;
16471647

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) {
1648+
auto dropAVLUse = [&](MachineOperand &MO) {
1649+
if (!MO.isReg() || !MO.getReg().isVirtual())
1650+
return;
1651+
Register OldVLReg = MO.getReg();
1652+
MO.setReg(RISCV::NoRegister);
1653+
16511654
if (LIS)
16521655
LIS->shrinkToUses(&LIS->getInterval(OldVLReg));
16531656

16541657
MachineInstr *VLOpDef = MRI->getUniqueVRegDef(OldVLReg);
16551658
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-
}
1659+
MRI->use_nodbg_empty(OldVLReg))
1660+
ToDelete.push_back(VLOpDef);
16631661
};
16641662

1665-
for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend())) {
1663+
for (MachineInstr &MI :
1664+
make_early_inc_range(make_range(MBB.rbegin(), MBB.rend()))) {
16661665

16671666
if (!isVectorConfigInstr(MI)) {
16681667
Used.doUnion(getDemanded(MI, ST));
@@ -1678,7 +1677,11 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
16781677

16791678
if (NextMI) {
16801679
if (!Used.usedVL() && !Used.usedVTYPE()) {
1681-
ToDelete.push_back(&MI);
1680+
dropAVLUse(MI.getOperand(1));
1681+
if (LIS)
1682+
LIS->RemoveMachineInstrFromMaps(MI);
1683+
MI.eraseFromParent();
1684+
NumCoalescedVSETVL++;
16821685
// Leave NextMI unchanged
16831686
continue;
16841687
}
@@ -1707,37 +1710,37 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
17071710
LIS->shrinkToUses(&DefLI);
17081711
}
17091712

1710-
Register OldVLReg;
1711-
if (MI.getOperand(1).isReg())
1712-
OldVLReg = MI.getOperand(1).getReg();
1713+
dropAVLUse(MI.getOperand(1));
17131714
if (NextMI->getOperand(1).isImm())
17141715
MI.getOperand(1).ChangeToImmediate(NextMI->getOperand(1).getImm());
17151716
else
1716-
MI.getOperand(1).ChangeToRegister(NextMI->getOperand(1).getReg(), false);
1717-
if (OldVLReg && OldVLReg.isVirtual())
1718-
afterDroppedAVLUse(OldVLReg);
1717+
MI.getOperand(1).ChangeToRegister(NextMI->getOperand(1).getReg(),
1718+
false);
17191719

17201720
MI.setDesc(NextMI->getDesc());
17211721
}
17221722
MI.getOperand(2).setImm(NextMI->getOperand(2).getImm());
1723-
ToDelete.push_back(NextMI);
1723+
1724+
dropAVLUse(NextMI->getOperand(1));
1725+
if (LIS)
1726+
LIS->RemoveMachineInstrFromMaps(*NextMI);
1727+
NextMI->eraseFromParent();
1728+
NumCoalescedVSETVL++;
17241729
// fallthrough
17251730
}
17261731
}
17271732
NextMI = &MI;
17281733
Used = getDemanded(MI, ST);
17291734
}
17301735

1731-
NumCoalescedVSETVL += ToDelete.size();
1736+
// Loop over the dead AVL values, and delete them now. This has
1737+
// to be outside the above loop to avoid invalidating iterators.
17321738
for (auto *MI : ToDelete) {
1733-
if (LIS)
1739+
if (LIS) {
1740+
LIS->removeInterval(MI->getOperand(0).getReg());
17341741
LIS->RemoveMachineInstrFromMaps(*MI);
1735-
Register OldAVLReg;
1736-
if (MI->getOperand(1).isReg())
1737-
OldAVLReg = MI->getOperand(1).getReg();
1742+
}
17381743
MI->eraseFromParent();
1739-
if (OldAVLReg && OldAVLReg.isVirtual())
1740-
afterDroppedAVLUse(OldAVLReg);
17411744
}
17421745
}
17431746

0 commit comments

Comments
 (0)