Index: include/llvm/CodeGen/GlobalISel/MIPatternMatch.h =================================================================== --- include/llvm/CodeGen/GlobalISel/MIPatternMatch.h +++ include/llvm/CodeGen/GlobalISel/MIPatternMatch.h @@ -262,6 +262,24 @@ return UnaryOp_match(Src); } +template +inline UnaryOp_match +m_GBitcast(const SrcTy &Src) { + return UnaryOp_match(Src); +} + +template +inline UnaryOp_match +m_GPtrToInt(const SrcTy &Src) { + return UnaryOp_match(Src); +} + +template +inline UnaryOp_match +m_GIntToPtr(const SrcTy &Src) { + return UnaryOp_match(Src); +} + template inline UnaryOp_match m_GFPTrunc(const SrcTy &Src) { Index: unittests/CodeGen/GlobalISel/PatternMatchTest.cpp =================================================================== --- unittests/CodeGen/GlobalISel/PatternMatchTest.cpp +++ unittests/CodeGen/GlobalISel/PatternMatchTest.cpp @@ -313,10 +313,24 @@ // Try to match the destination type of a bitcast. LLT v2s32 = LLT::vector(2, 32); auto MIBCast = B.buildCast(v2s32, Copies[0]); + ASSERT_TRUE( + mi_match(MIBCast->getOperand(0).getReg(), MRI, m_GBitcast(m_Reg()))); ASSERT_TRUE( mi_match(MIBCast->getOperand(0).getReg(), MRI, m_SpecificType(v2s32))); ASSERT_TRUE( mi_match(MIBCast->getOperand(1).getReg(), MRI, m_SpecificType(s64))); + + // Build a PTRToInt and INTTOPTR and match and test them. + LLT PtrTy = LLT::pointer(0, 64); + auto MIBIntToPtr = B.buildCast(PtrTy, Copies[0]); + auto MIBPtrToInt = B.buildCast(s64, MIBIntToPtr); + unsigned Src0; + + // match the ptrtoint(inttoptr reg) + bool match = mi_match(MIBPtrToInt->getOperand(0).getReg(), MRI, + m_GPtrToInt(m_GIntToPtr(m_Reg(Src0)))); + ASSERT_TRUE(match); + ASSERT_EQ(Src0, Copies[0]); } TEST(PatternMatchInstr, MatchCombinators) {