From: Chris Lattner Date: Sun, 13 Jul 2008 21:20:19 +0000 (+0000) Subject: Final bit of simplification for FoldBranchToCommonDest. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3698909623f994826b6a11fc4ea37e4b425a9589;p=oota-llvm.git Final bit of simplification for FoldBranchToCommonDest. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53528 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 1caf1182d52..78b330c5224 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1460,13 +1460,25 @@ static bool FoldBranchToCommonDest(BranchInst *BI) { !SafeToMergeTerminators(BI, PBI)) continue; - // Canonicalize the predecessors condition (inverting it) if needed to allow - // this xform to trigger. - if (PBI->getSuccessor(0) == FalseDest || - PBI->getSuccessor(1) == TrueDest) { + Instruction::BinaryOps Opc; + bool InvertPredCond = false; + + if (PBI->getSuccessor(0) == TrueDest) + Opc = Instruction::Or; + else if (PBI->getSuccessor(1) == FalseDest) + Opc = Instruction::And; + else if (PBI->getSuccessor(0) == FalseDest) + Opc = Instruction::And, InvertPredCond = true; + else if (PBI->getSuccessor(1) == TrueDest) + Opc = Instruction::Or, InvertPredCond = true; + else + continue; + + // If we need to invert the condition in the pred block to match, do so now. + if (InvertPredCond) { Value *NewCond = BinaryOperator::CreateNot(PBI->getCondition(), - PBI->getCondition()->getName()+".not", PBI); + PBI->getCondition()->getName()+".not", PBI); PBI->setCondition(NewCond); BasicBlock *OldTrue = PBI->getSuccessor(0); BasicBlock *OldFalse = PBI->getSuccessor(1); @@ -1474,34 +1486,25 @@ static bool FoldBranchToCommonDest(BranchInst *BI) { PBI->setSuccessor(1, OldTrue); } - Instruction::BinaryOps Opc = Instruction::Shl; // sentinel. + // Clone Cond into the predecessor basic block, and or/and the + // two conditions together. + Instruction *New = Cond->clone(); + PredBlock->getInstList().insert(PBI, New); + New->takeName(Cond); + Cond->setName(New->getName()+".old"); - if (PBI->getSuccessor(0) == TrueDest && FalseDest != BB) - Opc = Instruction::Or; - else if (PBI->getSuccessor(1) == FalseDest && TrueDest != BB) - Opc = Instruction::And; - - if (Opc != Instruction::Shl) { - // Clone Cond into the predecessor basic block, and or/and the - // two conditions together. - Instruction *New = Cond->clone(); - PredBlock->getInstList().insert(PBI, New); - New->takeName(Cond); - Cond->setName(New->getName()+".old"); - - Value *NewCond = BinaryOperator::Create(Opc, PBI->getCondition(), - New, "or.cond", PBI); - PBI->setCondition(NewCond); - if (PBI->getSuccessor(0) == BB) { - AddPredecessorToBlock(TrueDest, PredBlock, BB); - PBI->setSuccessor(0, TrueDest); - } - if (PBI->getSuccessor(1) == BB) { - AddPredecessorToBlock(FalseDest, PredBlock, BB); - PBI->setSuccessor(1, FalseDest); - } - return true; + Value *NewCond = BinaryOperator::Create(Opc, PBI->getCondition(), + New, "or.cond", PBI); + PBI->setCondition(NewCond); + if (PBI->getSuccessor(0) == BB) { + AddPredecessorToBlock(TrueDest, PredBlock, BB); + PBI->setSuccessor(0, TrueDest); + } + if (PBI->getSuccessor(1) == BB) { + AddPredecessorToBlock(FalseDest, PredBlock, BB); + PBI->setSuccessor(1, FalseDest); } + return true; } return false; } @@ -1742,7 +1745,6 @@ bool llvm::SimplifyCFG(BasicBlock *BB) { if (FoldBranchToCommonDest(BI)) return SimplifyCFG(BB) | 1; - // Scan predessor blocks for conditional branches. for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) if (BranchInst *PBI = dyn_cast((*PI)->getTerminator()))