Add in a unittest for the one-use pattern matcher.
authorChandler Carruth <chandlerc@gmail.com>
Sun, 5 Jan 2014 09:14:53 +0000 (09:14 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sun, 5 Jan 2014 09:14:53 +0000 (09:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198552 91177308-0d34-0410-b5e6-96231b3b80d8

unittests/IR/PatternMatch.cpp

index 150f1657b9c21dbd0281bec539ad575bd191645c..985135d2db013ae29faab231d375a22f879512d9 100644 (file)
@@ -45,6 +45,26 @@ struct PatternMatchTest : ::testing::Test {
         BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB) {}
 };
 
         BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB) {}
 };
 
+TEST_F(PatternMatchTest, OneUse) {
+  // Build up a little tree of values:
+  //
+  //   One  = (1 + 2) + 42
+  //   Two  = One + 42
+  //   Leaf = (Two + 8) + (Two + 13)
+  Value *One = IRB.CreateAdd(IRB.CreateAdd(IRB.getInt32(1), IRB.getInt32(2)),
+                             IRB.getInt32(42));
+  Value *Two = IRB.CreateAdd(One, IRB.getInt32(42));
+  Value *Leaf = IRB.CreateAdd(IRB.CreateAdd(Two, IRB.getInt32(8)),
+                              IRB.CreateAdd(Two, IRB.getInt32(13)));
+  Value *V;
+
+  EXPECT_TRUE(m_OneUse(m_Value(V)).match(One));
+  EXPECT_EQ(One, V);
+
+  EXPECT_FALSE(m_OneUse(m_Value()).match(Two));
+  EXPECT_FALSE(m_OneUse(m_Value()).match(Leaf));
+}
+
 TEST_F(PatternMatchTest, FloatingPointOrderedMin) {
   Type *FltTy = IRB.getFloatTy();
   Value *L = ConstantFP::get(FltTy, 1.0);
 TEST_F(PatternMatchTest, FloatingPointOrderedMin) {
   Type *FltTy = IRB.getFloatTy();
   Value *L = ConstantFP::get(FltTy, 1.0);