[PATCH] D54128: Fix MachineInstr::findRegisterUseOperandIdx subreg checks

Stanislav Mekhanoshin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 6 13:13:01 PST 2018


rampitec added inline comments.


================
Comment at: lib/CodeGen/MachineInstr.cpp:936
       continue;
-    if (MOReg == Reg || (TRI && TargetRegisterInfo::isPhysicalRegister(MOReg) &&
-                         TargetRegisterInfo::isPhysicalRegister(Reg) &&
-                         TRI->isSubRegister(MOReg, Reg)))
+    if (MOReg == Reg || (TRI && Reg && MOReg && TRI->regsOverlap(MOReg, Reg)))
       if (!isKill || MO.isKill())
----------------
rampitec wrote:
> arsenm wrote:
> > Why is TRI optional here? I would expect it to be mandatory if there is a physical register and assert
> That's a good question why, but it is optional.
> I have tried to use just TRI->regsOverlap() instead of the whole condition, and then run into crashes due to TRI being nullptr.
Here are just some examples of places where the function is called without optional TRI operand and with a physreg:

lib/Target/AArch64/AArch64InstrInfo.cpp:

1515│   case AArch64::FCSELDrrr: {
1516├>    int Idx = Instr.findRegisterUseOperandIdx(AArch64::NZCV);

lib/Target/AMDGPU/SIInstrInfo.cpp:

4769├>    if (MI.findRegisterUseOperandIdx(AMDGPU::SCC) != -1)
4770│       Worklist.insert(&MI);

lib/Target/ARM/ARMLoadStoreOptimizer.cpp:

 891├>  bool BaseKill = LatestMI->killsRegister(Base);

and then:

include/llvm/CodeGen/MachineInstr.h:

1134│   bool killsRegister(unsigned Reg,
1135│                      const TargetRegisterInfo *TRI = nullptr) const {
1136├>    return findRegisterUseOperandIdx(Reg, true, TRI) != -1;

There is huge number of places across all targets.


https://reviews.llvm.org/D54128





More information about the llvm-commits mailing list