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