aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp55
1 files changed, 29 insertions, 26 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
index d5b3df4..96250b9 100644
--- a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
@@ -1645,24 +1645,23 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
Used.demandVTYPE();
SmallVector<MachineInstr*> ToDelete;
- // Update LIS and cleanup dead AVLs given a value which has
- // has had one use (as an AVL) removed.
- auto afterDroppedAVLUse = [&](Register OldVLReg) {
+ auto dropAVLUse = [&](MachineOperand &MO) {
+ if (!MO.isReg() || !MO.getReg().isVirtual())
+ return;
+ Register OldVLReg = MO.getReg();
+ MO.setReg(RISCV::NoRegister);
+
if (LIS)
LIS->shrinkToUses(&LIS->getInterval(OldVLReg));
MachineInstr *VLOpDef = MRI->getUniqueVRegDef(OldVLReg);
if (VLOpDef && TII->isAddImmediate(*VLOpDef, OldVLReg) &&
- MRI->use_nodbg_empty(OldVLReg)) {
- if (LIS) {
- LIS->removeInterval(OldVLReg);
- LIS->RemoveMachineInstrFromMaps(*VLOpDef);
- }
- VLOpDef->eraseFromParent();
- }
+ MRI->use_nodbg_empty(OldVLReg))
+ ToDelete.push_back(VLOpDef);
};
- for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend())) {
+ for (MachineInstr &MI :
+ make_early_inc_range(make_range(MBB.rbegin(), MBB.rend()))) {
if (!isVectorConfigInstr(MI)) {
Used.doUnion(getDemanded(MI, ST));
@@ -1678,7 +1677,11 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
if (NextMI) {
if (!Used.usedVL() && !Used.usedVTYPE()) {
- ToDelete.push_back(&MI);
+ dropAVLUse(MI.getOperand(1));
+ if (LIS)
+ LIS->RemoveMachineInstrFromMaps(MI);
+ MI.eraseFromParent();
+ NumCoalescedVSETVL++;
// Leave NextMI unchanged
continue;
}
@@ -1707,20 +1710,22 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
LIS->shrinkToUses(&DefLI);
}
- Register OldVLReg;
- if (MI.getOperand(1).isReg())
- OldVLReg = MI.getOperand(1).getReg();
+ dropAVLUse(MI.getOperand(1));
if (NextMI->getOperand(1).isImm())
MI.getOperand(1).ChangeToImmediate(NextMI->getOperand(1).getImm());
else
- MI.getOperand(1).ChangeToRegister(NextMI->getOperand(1).getReg(), false);
- if (OldVLReg && OldVLReg.isVirtual())
- afterDroppedAVLUse(OldVLReg);
+ MI.getOperand(1).ChangeToRegister(NextMI->getOperand(1).getReg(),
+ false);
MI.setDesc(NextMI->getDesc());
}
MI.getOperand(2).setImm(NextMI->getOperand(2).getImm());
- ToDelete.push_back(NextMI);
+
+ dropAVLUse(NextMI->getOperand(1));
+ if (LIS)
+ LIS->RemoveMachineInstrFromMaps(*NextMI);
+ NextMI->eraseFromParent();
+ NumCoalescedVSETVL++;
// fallthrough
}
}
@@ -1728,16 +1733,14 @@ void RISCVInsertVSETVLI::coalesceVSETVLIs(MachineBasicBlock &MBB) const {
Used = getDemanded(MI, ST);
}
- NumCoalescedVSETVL += ToDelete.size();
+ // Loop over the dead AVL values, and delete them now. This has
+ // to be outside the above loop to avoid invalidating iterators.
for (auto *MI : ToDelete) {
- if (LIS)
+ if (LIS) {
+ LIS->removeInterval(MI->getOperand(0).getReg());
LIS->RemoveMachineInstrFromMaps(*MI);
- Register OldAVLReg;
- if (MI->getOperand(1).isReg())
- OldAVLReg = MI->getOperand(1).getReg();
+ }
MI->eraseFromParent();
- if (OldAVLReg && OldAVLReg.isVirtual())
- afterDroppedAVLUse(OldAVLReg);
}
}