[CGP] Rewrite pattern match for splitBranchCondition to work with Values instead.
authorJuergen Ributzka <juergen@apple.com>
Tue, 9 Dec 2014 17:50:10 +0000 (17:50 +0000)
committerJuergen Ributzka <juergen@apple.com>
Tue, 9 Dec 2014 17:50:10 +0000 (17:50 +0000)
Rewrite the pattern match code to work also with Values instead with
Instructions only. Also remove the no longer need matcher (m_Instruction).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223797 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/PatternMatch.h
lib/CodeGen/CodeGenPrepare.cpp

index c9597c19aa0a7a24ad23c6dedf0fad807c6e5388..4963997a7739822a71688389b6bc160ebc72d217 100644 (file)
@@ -68,10 +68,6 @@ struct class_match {
 
 /// m_Value() - Match an arbitrary value and ignore it.
 inline class_match<Value> m_Value() { return class_match<Value>(); }
-/// m_Instruction() - Match an arbitrary instruction and ignore it.
-inline class_match<Instruction> m_Instruction() {
-  return class_match<Instruction>();
-}
 /// m_BinOp() - Match an arbitrary binary operation and ignore it.
 inline class_match<BinaryOperator> m_BinOp() {
   return class_match<BinaryOperator>();
@@ -311,9 +307,6 @@ struct bind_ty {
 /// m_Value - Match a value, capturing it if we match.
 inline bind_ty<Value> m_Value(Value *&V) { return V; }
 
-/// m_Instruction - Match a instruction, capturing it if we match.
-inline bind_ty<Instruction> m_Instruction(Instruction *&I) { return I; }
-
 /// m_BinOp - Match a instruction, capturing it if we match.
 inline bind_ty<BinaryOperator> m_BinOp(BinaryOperator *&I) { return I; }
 
index e043bfbfa270229a527da16d5ce3099ba5e09b4a..96e2d3d74deeffe5d78c930428ed79cdbcdb19c3 100644 (file)
@@ -3869,12 +3869,12 @@ bool CodeGenPrepare::splitBranchCondition(Function &F) {
       continue;
 
     unsigned Opc;
-    Instruction *Cond1, *Cond2;
-    if (match(LogicOp, m_And(m_OneUse(m_Instruction(Cond1)),
-                             m_OneUse(m_Instruction(Cond2)))))
+    Value *Cond1, *Cond2;
+    if (match(LogicOp, m_And(m_OneUse(m_Value(Cond1)),
+                             m_OneUse(m_Value(Cond2)))))
       Opc = Instruction::And;
-    else if (match(LogicOp, m_Or(m_OneUse(m_Instruction(Cond1)),
-                                 m_OneUse(m_Instruction(Cond2)))))
+    else if (match(LogicOp, m_Or(m_OneUse(m_Value(Cond1)),
+                                 m_OneUse(m_Value(Cond2)))))
       Opc = Instruction::Or;
     else
       continue;
@@ -3897,7 +3897,7 @@ bool CodeGenPrepare::splitBranchCondition(Function &F) {
     auto *Br1 = cast<BranchInst>(BB.getTerminator());
     Br1->setCondition(Cond1);
     LogicOp->eraseFromParent();
-    Cond2->removeFromParent();
+
     // Depending on the conditon we have to either replace the true or the false
     // successor of the original branch instruction.
     if (Opc == Instruction::And)
@@ -3907,7 +3907,10 @@ bool CodeGenPrepare::splitBranchCondition(Function &F) {
 
     // Fill in the new basic block.
     auto *Br2 = IRBuilder<>(TmpBB).CreateCondBr(Cond2, TBB, FBB);
-    Cond2->insertBefore(Br2);
+    if (auto *I = dyn_cast<Instruction>(Cond2)) {
+      I->removeFromParent();
+      I->insertBefore(Br2);
+    }
 
     // Update PHI nodes in both successors. The original BB needs to be
     // replaced in one succesor's PHI nodes, because the branch comes now from