@@ -194,19 +194,22 @@ static bool hasUndefinedMergeOp(const MachineInstr &MI,
194
194
if (UseMO.getReg ().isPhysical ())
195
195
return false ;
196
196
197
- if (MachineInstr *UseMI = MRI.getVRegDef (UseMO.getReg ())) {
198
- if (UseMI->isImplicitDef ())
199
- return true ;
197
+ MachineInstr *UseMI = MRI.getUniqueVRegDef (UseMO.getReg ());
198
+ assert (UseMI);
199
+ if (UseMI->isImplicitDef ())
200
+ return true ;
200
201
201
- if (UseMI->isRegSequence ()) {
202
- for (unsigned i = 1 , e = UseMI->getNumOperands (); i < e; i += 2 ) {
203
- MachineInstr *SourceMI = MRI. getVRegDef (UseMI-> getOperand (i). getReg ());
204
- if (!SourceMI || !SourceMI-> isImplicitDef ())
205
- return false ;
206
- }
207
- return true ;
202
+ if (UseMI->isRegSequence ()) {
203
+ for (unsigned i = 1 , e = UseMI->getNumOperands (); i < e; i += 2 ) {
204
+ MachineInstr *SourceMI =
205
+ MRI. getUniqueVRegDef (UseMI-> getOperand (i). getReg ());
206
+ assert (SourceMI) ;
207
+ if (!SourceMI-> isImplicitDef ())
208
+ return false ;
208
209
}
210
+ return true ;
209
211
}
212
+
210
213
return false ;
211
214
}
212
215
@@ -886,7 +889,7 @@ static VSETVLIInfo getInfoForVSETVLI(const MachineInstr &MI,
886
889
if (AVLReg == RISCV::X0)
887
890
NewInfo.setAVLVLMAX ();
888
891
else
889
- NewInfo.setAVLRegDef (MRI.getVRegDef (AVLReg), AVLReg);
892
+ NewInfo.setAVLRegDef (MRI.getUniqueVRegDef (AVLReg), AVLReg);
890
893
}
891
894
NewInfo.setVTYPE (MI.getOperand (2 ).getImm ());
892
895
@@ -958,7 +961,8 @@ static VSETVLIInfo computeInfoForInstr(const MachineInstr &MI, uint64_t TSFlags,
958
961
else
959
962
InstrInfo.setAVLImm (Imm);
960
963
} else {
961
- InstrInfo.setAVLRegDef (MRI->getVRegDef (VLOp.getReg ()), VLOp.getReg ());
964
+ InstrInfo.setAVLRegDef (MRI->getUniqueVRegDef (VLOp.getReg ()),
965
+ VLOp.getReg ());
962
966
}
963
967
} else {
964
968
assert (isScalarExtractInstr (MI));
@@ -1231,7 +1235,7 @@ void RISCVInsertVSETVLI::transferAfter(VSETVLIInfo &Info,
1231
1235
1232
1236
if (RISCV::isFaultFirstLoad (MI)) {
1233
1237
// Update AVL to vl-output of the fault first load.
1234
- Info.setAVLRegDef (MRI->getVRegDef (MI.getOperand (1 ).getReg ()),
1238
+ Info.setAVLRegDef (MRI->getUniqueVRegDef (MI.getOperand (1 ).getReg ()),
1235
1239
MI.getOperand (1 ).getReg ());
1236
1240
return ;
1237
1241
}
@@ -1338,8 +1342,9 @@ bool RISCVInsertVSETVLI::needVSETVLIPHI(const VSETVLIInfo &Require,
1338
1342
const VSETVLIInfo &PBBExit = BlockInfo[PBB->getNumber ()].Exit ;
1339
1343
1340
1344
// We need the PHI input to the be the output of a VSET(I)VLI.
1341
- MachineInstr *DefMI = MRI->getVRegDef (InReg);
1342
- if (!DefMI || !isVectorConfigInstr (*DefMI))
1345
+ MachineInstr *DefMI = MRI->getUniqueVRegDef (InReg);
1346
+ assert (DefMI);
1347
+ if (!isVectorConfigInstr (*DefMI))
1343
1348
return true ;
1344
1349
1345
1350
// We found a VSET(I)VLI make sure it matches the output of the
@@ -1399,7 +1404,8 @@ void RISCVInsertVSETVLI::emitVSETVLIs(MachineBasicBlock &MBB) {
1399
1404
MachineOperand &VLOp = MI.getOperand (getVLOpNum (MI));
1400
1405
if (VLOp.isReg ()) {
1401
1406
Register Reg = VLOp.getReg ();
1402
- MachineInstr *VLOpDef = MRI->getVRegDef (Reg);
1407
+ MachineInstr *VLOpDef = MRI->getUniqueVRegDef (Reg);
1408
+ assert (VLOpDef);
1403
1409
1404
1410
// Erase the AVL operand from the instruction.
1405
1411
VLOp.setReg (RISCV::NoRegister);
@@ -1409,8 +1415,7 @@ void RISCVInsertVSETVLI::emitVSETVLIs(MachineBasicBlock &MBB) {
1409
1415
// as an ADDI. However, the ADDI might not have been used in the
1410
1416
// vsetvli, or a vsetvli might not have been emitted, so it may be
1411
1417
// dead now.
1412
- if (VLOpDef && TII->isAddImmediate (*VLOpDef, Reg) &&
1413
- MRI->use_nodbg_empty (Reg))
1418
+ if (TII->isAddImmediate (*VLOpDef, Reg) && MRI->use_nodbg_empty (Reg))
1414
1419
VLOpDef->eraseFromParent ();
1415
1420
}
1416
1421
MI.addOperand (MachineOperand::CreateReg (RISCV::VL, /* isDef*/ false ,
@@ -1682,6 +1687,7 @@ void RISCVInsertVSETVLI::insertReadVL(MachineBasicBlock &MBB) {
1682
1687
MachineInstr &MI = *I++;
1683
1688
if (RISCV::isFaultFirstLoad (MI)) {
1684
1689
Register VLOutput = MI.getOperand (1 ).getReg ();
1690
+ assert (VLOutput.isVirtual ());
1685
1691
if (!MRI->use_nodbg_empty (VLOutput))
1686
1692
BuildMI (MBB, I, MI.getDebugLoc (), TII->get (RISCV::PseudoReadVL),
1687
1693
VLOutput);
0 commit comments