[llvm] 0a14551 - [RISCV] Fix a silent miscompile in copyPhysReg
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 14 14:45:57 PDT 2022
Author: Philip Reames
Date: 2022-09-14T14:45:01-07:00
New Revision: 0a145516a24bdda0440754adc162649f788ba673
URL: https://github.com/llvm/llvm-project/commit/0a145516a24bdda0440754adc162649f788ba673
DIFF: https://github.com/llvm/llvm-project/commit/0a145516a24bdda0440754adc162649f788ba673.diff
LOG: [RISCV] Fix a silent miscompile in copyPhysReg
Found this when adding verifier rules. The case which arises is that we have a DefMBBI which has a VecPolicy operand. The code was not expecting this, and the unconditional copy of the last two operands resulted in the SEW and VecPolicy fields being added to the VMV_V_V as AVL and SEW respectively.
Oddly, this appears to be a silent in practice. There's no test change despite verifier changes proving that we definitely hit this in existing tests.
Differential Revision: https://reviews.llvm.org/D133868
Added:
Modified:
llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
index 1addb0a613030..2307ba5c2ee46 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -235,13 +235,14 @@ static bool isConvertibleToVMV_V_V(const RISCVSubtarget &STI,
if (RISCVII::isRVVWideningReduction(TSFlags))
return false;
- // Found the definition.
- FoundDef = true;
- DefMBBI = MBBI;
// If the producing instruction does not depend on vsetvli, do not
// convert COPY to vmv.v.v. For example, VL1R_V or PseudoVRELOAD.
- if (!RISCVII::hasSEWOp(TSFlags))
+ if (!RISCVII::hasSEWOp(TSFlags) || !RISCVII::hasVLOp(TSFlags))
return false;
+
+ // Found the definition.
+ FoundDef = true;
+ DefMBBI = MBBI;
break;
}
}
@@ -361,11 +362,9 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
if (IsScalableVector) {
bool UseVMV_V_V = false;
MachineBasicBlock::const_iterator DefMBBI;
- unsigned DefExplicitOpNum;
unsigned VIOpc;
if (isConvertibleToVMV_V_V(STI, MBB, MBBI, DefMBBI, LMul)) {
UseVMV_V_V = true;
- DefExplicitOpNum = DefMBBI->getNumExplicitOperands();
// We only need to handle LMUL = 1/2/4/8 here because we only define
// vector register classes for LMUL = 1/2/4/8.
switch (LMul) {
@@ -403,10 +402,9 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
else
MIB = MIB.addReg(SrcReg, getKillRegState(KillSrc));
if (UseVMV_V_V) {
- // The last two arguments of vector instructions are
- // AVL, SEW. We also need to append the implicit-use vl and vtype.
- MIB.add(DefMBBI->getOperand(DefExplicitOpNum - 2)); // AVL
- MIB.add(DefMBBI->getOperand(DefExplicitOpNum - 1)); // SEW
+ const MCInstrDesc &Desc = DefMBBI->getDesc();
+ MIB.add(DefMBBI->getOperand(RISCVII::getVLOpNum(Desc))); // AVL
+ MIB.add(DefMBBI->getOperand(RISCVII::getSEWOpNum(Desc))); // SEW
MIB.addReg(RISCV::VL, RegState::Implicit);
MIB.addReg(RISCV::VTYPE, RegState::Implicit);
}
@@ -435,8 +433,9 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
MIB = MIB.addReg(TRI->getSubReg(SrcReg, SubRegIdx + I),
getKillRegState(KillSrc));
if (UseVMV_V_V) {
- MIB.add(DefMBBI->getOperand(DefExplicitOpNum - 2)); // AVL
- MIB.add(DefMBBI->getOperand(DefExplicitOpNum - 1)); // SEW
+ const MCInstrDesc &Desc = DefMBBI->getDesc();
+ MIB.add(DefMBBI->getOperand(RISCVII::getVLOpNum(Desc))); // AVL
+ MIB.add(DefMBBI->getOperand(RISCVII::getSEWOpNum(Desc))); // SEW
MIB.addReg(RISCV::VL, RegState::Implicit);
MIB.addReg(RISCV::VTYPE, RegState::Implicit);
}
More information about the llvm-commits
mailing list