diff options
-rw-r--r-- | llvm/include/llvm/IR/PatternMatch.h | 7 | ||||
-rw-r--r-- | llvm/lib/CodeGen/CodeGenPrepare.cpp | 17 |
2 files changed, 10 insertions, 14 deletions
diff --git a/llvm/include/llvm/IR/PatternMatch.h b/llvm/include/llvm/IR/PatternMatch.h index c9597c19aa0..4963997a773 100644 --- a/llvm/include/llvm/IR/PatternMatch.h +++ b/llvm/include/llvm/IR/PatternMatch.h @@ -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; } diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index e043bfbfa27..96e2d3d74de 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/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<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 |