From 0ff2059da636026ef484cc50dbfdef25f49ec916 Mon Sep 17 00:00:00 2001 From: Juergen Ributzka Date: Tue, 9 Dec 2014 17:50:10 +0000 Subject: [PATCH] [CGP] Rewrite pattern match for splitBranchCondition to work with Values instead. 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 | 7 ------- lib/CodeGen/CodeGenPrepare.cpp | 17 ++++++++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/include/llvm/IR/PatternMatch.h b/include/llvm/IR/PatternMatch.h index c9597c19aa0..4963997a773 100644 --- a/include/llvm/IR/PatternMatch.h +++ b/include/llvm/IR/PatternMatch.h @@ -68,10 +68,6 @@ struct class_match { /// m_Value() - Match an arbitrary value and ignore it. inline class_match m_Value() { return class_match(); } -/// m_Instruction() - Match an arbitrary instruction and ignore it. -inline class_match m_Instruction() { - return class_match(); -} /// m_BinOp() - Match an arbitrary binary operation and ignore it. inline class_match m_BinOp() { return class_match(); @@ -311,9 +307,6 @@ struct bind_ty { /// m_Value - Match a value, capturing it if we match. inline bind_ty m_Value(Value *&V) { return V; } -/// m_Instruction - Match a instruction, capturing it if we match. -inline bind_ty m_Instruction(Instruction *&I) { return I; } - /// m_BinOp - Match a instruction, capturing it if we match. inline bind_ty m_BinOp(BinaryOperator *&I) { return I; } diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index e043bfbfa27..96e2d3d74de 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -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(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(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