diff --git a/llvm/include/llvm/CodeGen/GlobalISel/GenericMachineInstrs.h b/llvm/include/llvm/CodeGen/GlobalISel/GenericMachineInstrs.h index 1162134b2ad286..0fe9ac38c4df7e 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/GenericMachineInstrs.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/GenericMachineInstrs.h @@ -195,6 +195,17 @@ class GBuildVector : public GMergeLikeOp { } }; +/// Represents a G_PTR_ADD. +class GPtrAdd : public GenericMachineInstr { +public: + Register getBaseReg() const { return getReg(1); } + Register getOffsetReg() const { return getReg(2); } + + static bool classof(const MachineInstr *MI) { + return MI->getOpcode() == TargetOpcode::G_PTR_ADD; + } +}; + } // namespace llvm #endif // LLVM_CODEGEN_GLOBALISEL_GENERICMACHINEINSTRS_H \ No newline at end of file diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp index 06d827de2e96ba..335c2c87c8b593 100644 --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -2410,9 +2410,9 @@ void CombinerHelper::applyCombineAddP2IToPtrAdd( bool CombinerHelper::matchCombineConstPtrAddToI2P(MachineInstr &MI, int64_t &NewCst) { - assert(MI.getOpcode() == TargetOpcode::G_PTR_ADD && "Expected a G_PTR_ADD"); - Register LHS = MI.getOperand(1).getReg(); - Register RHS = MI.getOperand(2).getReg(); + auto &PtrAdd = cast(MI); + Register LHS = PtrAdd.getBaseReg(); + Register RHS = PtrAdd.getOffsetReg(); MachineRegisterInfo &MRI = Builder.getMF().getRegInfo(); if (auto RHSCst = getConstantVRegSExtVal(RHS, MRI)) { @@ -2428,12 +2428,12 @@ bool CombinerHelper::matchCombineConstPtrAddToI2P(MachineInstr &MI, void CombinerHelper::applyCombineConstPtrAddToI2P(MachineInstr &MI, int64_t &NewCst) { - assert(MI.getOpcode() == TargetOpcode::G_PTR_ADD && "Expected a G_PTR_ADD"); - Register Dst = MI.getOperand(0).getReg(); + auto &PtrAdd = cast(MI); + Register Dst = PtrAdd.getReg(0); Builder.setInstrAndDebugLoc(MI); Builder.buildConstant(Dst, NewCst); - MI.eraseFromParent(); + PtrAdd.eraseFromParent(); } bool CombinerHelper::matchCombineAnyExtTrunc(MachineInstr &MI, Register &Reg) { @@ -3346,7 +3346,8 @@ void CombinerHelper::applyXorOfAndWithSameReg( } bool CombinerHelper::matchPtrAddZero(MachineInstr &MI) { - Register DstReg = MI.getOperand(0).getReg(); + auto &PtrAdd = cast(MI); + Register DstReg = PtrAdd.getReg(0); LLT Ty = MRI.getType(DstReg); const DataLayout &DL = Builder.getMF().getDataLayout(); @@ -3354,20 +3355,20 @@ bool CombinerHelper::matchPtrAddZero(MachineInstr &MI) { return false; if (Ty.isPointer()) { - auto ConstVal = getConstantVRegVal(MI.getOperand(1).getReg(), MRI); + auto ConstVal = getConstantVRegVal(PtrAdd.getBaseReg(), MRI); return ConstVal && *ConstVal == 0; } assert(Ty.isVector() && "Expecting a vector type"); - const MachineInstr *VecMI = MRI.getVRegDef(MI.getOperand(1).getReg()); + const MachineInstr *VecMI = MRI.getVRegDef(PtrAdd.getBaseReg()); return isBuildVectorAllZeros(*VecMI, MRI); } void CombinerHelper::applyPtrAddZero(MachineInstr &MI) { - assert(MI.getOpcode() == TargetOpcode::G_PTR_ADD); - Builder.setInstrAndDebugLoc(MI); - Builder.buildIntToPtr(MI.getOperand(0), MI.getOperand(2)); - MI.eraseFromParent(); + auto &PtrAdd = cast(MI); + Builder.setInstrAndDebugLoc(PtrAdd); + Builder.buildIntToPtr(PtrAdd.getReg(0), PtrAdd.getOffsetReg()); + PtrAdd.eraseFromParent(); } /// The second source operand is known to be a power of 2.