-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[RISCV] Add invariants that registers always have definitions. NFC #90587
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-backend-risc-v Author: Luke Lau (lukel97) ChangesFor vector merge operands, we check if it's a NoRegister beforehand so any other register type should have a definition. For VL operands, they don't get replaced with NoRegisters since they're scalar and should also always have a definition, even if it's an implicit_def. Full diff: https://github.com/llvm/llvm-project/pull/90587.diff 1 Files Affected:
diff --git a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
index b27e1dd258ebd0..13836f30b06b52 100644
--- a/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
@@ -198,19 +198,22 @@ static bool hasUndefinedMergeOp(const MachineInstr &MI,
if (UseMO.getReg().isPhysical())
return false;
- if (MachineInstr *UseMI = MRI.getVRegDef(UseMO.getReg())) {
- if (UseMI->isImplicitDef())
- return true;
+ MachineInstr *UseMI = MRI.getUniqueVRegDef(UseMO.getReg());
+ assert(UseMI);
+ if (UseMI->isImplicitDef())
+ return true;
- if (UseMI->isRegSequence()) {
- for (unsigned i = 1, e = UseMI->getNumOperands(); i < e; i += 2) {
- MachineInstr *SourceMI = MRI.getVRegDef(UseMI->getOperand(i).getReg());
- if (!SourceMI || !SourceMI->isImplicitDef())
- return false;
- }
- return true;
+ if (UseMI->isRegSequence()) {
+ for (unsigned i = 1, e = UseMI->getNumOperands(); i < e; i += 2) {
+ MachineInstr *SourceMI =
+ MRI.getUniqueVRegDef(UseMI->getOperand(i).getReg());
+ assert(SourceMI);
+ if (!SourceMI->isImplicitDef())
+ return false;
}
+ return true;
}
+
return false;
}
@@ -890,7 +893,7 @@ static VSETVLIInfo getInfoForVSETVLI(const MachineInstr &MI,
if (AVLReg == RISCV::X0)
NewInfo.setAVLVLMAX();
else
- NewInfo.setAVLRegDef(MRI.getVRegDef(AVLReg), AVLReg);
+ NewInfo.setAVLRegDef(MRI.getUniqueVRegDef(AVLReg), AVLReg);
}
NewInfo.setVTYPE(MI.getOperand(2).getImm());
@@ -962,7 +965,8 @@ static VSETVLIInfo computeInfoForInstr(const MachineInstr &MI, uint64_t TSFlags,
else
InstrInfo.setAVLImm(Imm);
} else {
- InstrInfo.setAVLRegDef(MRI->getVRegDef(VLOp.getReg()), VLOp.getReg());
+ InstrInfo.setAVLRegDef(MRI->getUniqueVRegDef(VLOp.getReg()),
+ VLOp.getReg());
}
} else {
assert(isScalarExtractInstr(MI));
@@ -1235,7 +1239,7 @@ void RISCVInsertVSETVLI::transferAfter(VSETVLIInfo &Info,
if (RISCV::isFaultFirstLoad(MI)) {
// Update AVL to vl-output of the fault first load.
- Info.setAVLRegDef(MRI->getVRegDef(MI.getOperand(1).getReg()),
+ Info.setAVLRegDef(MRI->getUniqueVRegDef(MI.getOperand(1).getReg()),
MI.getOperand(1).getReg());
return;
}
@@ -1342,8 +1346,9 @@ bool RISCVInsertVSETVLI::needVSETVLIPHI(const VSETVLIInfo &Require,
const VSETVLIInfo &PBBExit = BlockInfo[PBB->getNumber()].Exit;
// We need the PHI input to the be the output of a VSET(I)VLI.
- MachineInstr *DefMI = MRI->getVRegDef(InReg);
- if (!DefMI || !isVectorConfigInstr(*DefMI))
+ MachineInstr *DefMI = MRI->getUniqueVRegDef(InReg);
+ assert(DefMI);
+ if (!isVectorConfigInstr(*DefMI))
return true;
// We found a VSET(I)VLI make sure it matches the output of the
@@ -1403,7 +1408,8 @@ void RISCVInsertVSETVLI::emitVSETVLIs(MachineBasicBlock &MBB) {
MachineOperand &VLOp = MI.getOperand(getVLOpNum(MI));
if (VLOp.isReg()) {
Register Reg = VLOp.getReg();
- MachineInstr *VLOpDef = MRI->getVRegDef(Reg);
+ MachineInstr *VLOpDef = MRI->getUniqueVRegDef(Reg);
+ assert(VLOpDef);
// Erase the AVL operand from the instruction.
VLOp.setReg(RISCV::NoRegister);
@@ -1413,8 +1419,7 @@ void RISCVInsertVSETVLI::emitVSETVLIs(MachineBasicBlock &MBB) {
// as an ADDI. However, the ADDI might not have been used in the
// vsetvli, or a vsetvli might not have been emitted, so it may be
// dead now.
- if (VLOpDef && TII->isAddImmediate(*VLOpDef, Reg) &&
- MRI->use_nodbg_empty(Reg))
+ if (TII->isAddImmediate(*VLOpDef, Reg) && MRI->use_nodbg_empty(Reg))
VLOpDef->eraseFromParent();
}
MI.addOperand(MachineOperand::CreateReg(RISCV::VL, /*isDef*/ false,
|
Does it necessary to use |
It's a slightly stronger assertion to double check everything's in SSA, but it's not necessary |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
For vector merge operands, we check if it's a NoRegister beforehand so any other register type should have a definition. For VL operands, they don't get replaced with NoRegisters since they're scalar and should also always have a definition, even if it's an implicit_def.
3e5f8fe
to
532cbb1
Compare
For vector merge operands, we check if it's a NoRegister beforehand so any other register type should have a definition.
For VL operands, they don't get replaced with NoRegisters since they're scalar and should also always have a definition, even if it's an implicit_def.
All the definitions at this stage should also be unique, this will change in #70549