Index: llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h =================================================================== --- llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h +++ llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h @@ -362,6 +362,10 @@ /// Transform PtrToInt(IntToPtr(x)) to x. void applyCombineP2IToI2P(MachineInstr &MI, Register &Reg); + /// Transform Fold G_PTRTOINT(G_CONSTANT(x)) to x. + bool matchCombineP2IToC(MachineInstr &MI, Register &Reg); + void applyCombineP2IToC(MachineInstr &MI, Register &Reg); + /// Transform G_ADD (G_PTRTOINT x), y -> G_PTRTOINT (G_PTR_ADD x, y) /// Transform G_ADD y, (G_PTRTOINT x) -> G_PTRTOINT (G_PTR_ADD x, y) bool matchCombineAddP2IToPtrAdd(MachineInstr &MI, Index: llvm/include/llvm/Target/GlobalISel/Combine.td =================================================================== --- llvm/include/llvm/Target/GlobalISel/Combine.td +++ llvm/include/llvm/Target/GlobalISel/Combine.td @@ -506,6 +506,14 @@ (apply [{ Helper.applyCombineP2IToI2P(*${mi}, ${info}); }]) >; +// Fold ptr2int(cst) -> cst +def i2p_to_c: GICombineRule< + (defs root:$root, register_matchinfo:$info), + (match (wip_match_opcode G_PTRTOINT):$root, + [{ return Helper.matchCombineP2IToC(*${root}, ${info}); }]), + (apply [{ Helper.applyCombineP2IToC(*${root}, ${info}); }]) +>; + // Fold add ptrtoint(x), y -> ptrtoint (ptr_add x), y def add_p2i_to_ptradd_matchinfo : GIDefMatchData<"std::pair">; def add_p2i_to_ptradd : GICombineRule< @@ -1083,7 +1091,8 @@ add_sub_reg, buildvector_identity_fold, trunc_buildvector_fold, trunc_lshr_buildvector_fold, - bitcast_bitcast_fold, fptrunc_fpext_fold]>; + bitcast_bitcast_fold, fptrunc_fpext_fold, + i2p_to_c]>; def const_combines : GICombineGroup<[constant_fold_fp_ops, const_ptradd_to_i2p, overlapping_and, mulo_by_2, mulo_by_0, Index: llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -2091,6 +2091,24 @@ MI.eraseFromParent(); } +bool CombinerHelper::matchCombineP2IToC(MachineInstr &MI, Register &Reg) { + assert(MI.getOpcode() == TargetOpcode::G_PTRTOINT && "Expected a G_PTRTOINT"); + const Register SrcReg = MI.getOperand(1).getReg(); + const MachineInstr *SrcInstr = MRI.getVRegDef(SrcReg); + return SrcInstr->getOpcode() == TargetOpcode::G_CONSTANT; +} + +void CombinerHelper::applyCombineP2IToC(MachineInstr &MI, Register &Reg) { + assert(MI.getOpcode() == TargetOpcode::G_PTRTOINT && "Expected a G_PTRTOINT"); + Register DstReg = MI.getOperand(0).getReg(); + Register SrcReg = MI.getOperand(1).getReg(); + MachineInstr *SrcMI = MRI.getVRegDef(SrcReg); + const MachineOperand &CstVal = SrcMI->getOperand(1); + Builder.setInstr(MI); + Builder.buildConstant(DstReg, CstVal.getCImm()->getValue()); + MI.eraseFromParent(); +} + bool CombinerHelper::matchCombineAddP2IToPtrAdd( MachineInstr &MI, std::pair &PtrReg) { assert(MI.getOpcode() == TargetOpcode::G_ADD); Index: llvm/test/CodeGen/AArch64/GlobalISel/combine-ptradd-int2ptr.mir =================================================================== --- llvm/test/CodeGen/AArch64/GlobalISel/combine-ptradd-int2ptr.mir +++ llvm/test/CodeGen/AArch64/GlobalISel/combine-ptradd-int2ptr.mir @@ -8,9 +8,8 @@ bb.1: liveins: $x0 ; CHECK-LABEL: name: agc.test_combine_ptradd_constants_intres - ; CHECK: [[C:%[0-9]+]]:_(p64) = G_CONSTANT i64 44 - ; CHECK: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[C]](p64) - ; CHECK: $x0 = COPY [[PTRTOINT]](s64) + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 44 + ; CHECK: $x0 = COPY [[C]](s64) %1:_(s32) = G_CONSTANT i32 42 %2:_(s32) = G_CONSTANT i32 2 %3:_(p64) = G_INTTOPTR %2