Skip to content

Commit

Permalink
[GlobalISel] Add GPtrAdd and use it in some combines.
Browse files Browse the repository at this point in the history
  • Loading branch information
aemerson committed Jul 29, 2021
1 parent 1c14441 commit 532c458
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 13 deletions.
11 changes: 11 additions & 0 deletions llvm/include/llvm/CodeGen/GlobalISel/GenericMachineInstrs.h
Expand Up @@ -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
27 changes: 14 additions & 13 deletions llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
Expand Up @@ -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<GPtrAdd>(MI);
Register LHS = PtrAdd.getBaseReg();
Register RHS = PtrAdd.getOffsetReg();
MachineRegisterInfo &MRI = Builder.getMF().getRegInfo();

if (auto RHSCst = getConstantVRegSExtVal(RHS, MRI)) {
Expand All @@ -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<GPtrAdd>(MI);
Register Dst = PtrAdd.getReg(0);

Builder.setInstrAndDebugLoc(MI);
Builder.buildConstant(Dst, NewCst);
MI.eraseFromParent();
PtrAdd.eraseFromParent();
}

bool CombinerHelper::matchCombineAnyExtTrunc(MachineInstr &MI, Register &Reg) {
Expand Down Expand Up @@ -3346,28 +3346,29 @@ void CombinerHelper::applyXorOfAndWithSameReg(
}

bool CombinerHelper::matchPtrAddZero(MachineInstr &MI) {
Register DstReg = MI.getOperand(0).getReg();
auto &PtrAdd = cast<GPtrAdd>(MI);
Register DstReg = PtrAdd.getReg(0);
LLT Ty = MRI.getType(DstReg);
const DataLayout &DL = Builder.getMF().getDataLayout();

if (DL.isNonIntegralAddressSpace(Ty.getScalarType().getAddressSpace()))
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<GPtrAdd>(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.
Expand Down

0 comments on commit 532c458

Please sign in to comment.