diff --git a/include/llvm/IR/PatternMatch.h b/include/llvm/IR/PatternMatch.h index 7da9afcf946..9151afd2295 100644 --- a/include/llvm/IR/PatternMatch.h +++ b/include/llvm/IR/PatternMatch.h @@ -294,10 +294,10 @@ template struct bind_ty { /// \brief Match a value, capturing it if we match. inline bind_ty m_Value(Value *&V) { return V; } +inline bind_ty m_Value(const Value *&V) { return V; } /// \brief Match an instruction, capturing it if we match. inline bind_ty m_Instruction(Instruction *&I) { return I; } - /// \brief Match a binary operator, capturing it if we match. inline bind_ty m_BinOp(BinaryOperator *&I) { return I; } @@ -682,7 +682,7 @@ template struct Exact_match { Exact_match(const SubPattern_t &SP) : SubPattern(SP) {} template bool match(OpTy *V) { - if (PossiblyExactOperator *PEO = dyn_cast(V)) + if (auto *PEO = dyn_cast(V)) return PEO->isExact() && SubPattern.match(V); return false; } @@ -706,7 +706,7 @@ struct CmpClass_match { : Predicate(Pred), L(LHS), R(RHS) {} template bool match(OpTy *V) { - if (Class *I = dyn_cast(V)) + if (auto *I = dyn_cast(V)) if (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) { Predicate = I->getPredicate(); return true; diff --git a/unittests/IR/PatternMatch.cpp b/unittests/IR/PatternMatch.cpp index 1121d6554db..2d1321def7e 100644 --- a/unittests/IR/PatternMatch.cpp +++ b/unittests/IR/PatternMatch.cpp @@ -295,4 +295,31 @@ TEST_F(PatternMatchTest, OverflowingBinOps) { EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R))); } +template struct MutableConstTest : PatternMatchTest { }; + +typedef ::testing::Types, + std::tuple> + MutableConstTestTypes; +TYPED_TEST_CASE(MutableConstTest, MutableConstTestTypes); + +TYPED_TEST(MutableConstTest, ICmp) { + auto &IRB = PatternMatchTest::IRB; + + typedef typename std::tuple_element<0, TypeParam>::type ValueType; + typedef typename std::tuple_element<1, TypeParam>::type InstructionType; + + Value *L = IRB.getInt32(1); + Value *R = IRB.getInt32(2); + ICmpInst::Predicate Pred = ICmpInst::ICMP_UGT; + + ValueType MatchL; + ValueType MatchR; + ICmpInst::Predicate MatchPred; + + EXPECT_TRUE(m_ICmp(MatchPred, m_Value(MatchL), m_Value(MatchR)) + .match((InstructionType)IRB.CreateICmp(Pred, L, R))); + EXPECT_EQ(L, MatchL); + EXPECT_EQ(R, MatchR); +} + } // anonymous namespace.