From 3aff13b82a579e910420b6c040f3e85c99110e15 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 14 Dec 2010 08:46:09 +0000 Subject: [PATCH] - Insert new instructions before DomBlock's terminator, which is simpler than finding a place to insert in BB. - Don't perform the 'if condition hoisting' xform on certain i1 PHIs, as it interferes with switch formation. This re-fixes "example 7", without breaking the world hopefully. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121764 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyCFG.cpp | 23 +++++++++----- test/Transforms/SimplifyCFG/PhiEliminate.ll | 14 --------- test/Transforms/SimplifyCFG/switch_create.ll | 32 ++++++++++---------- 3 files changed, 32 insertions(+), 37 deletions(-) diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 1fbbb42b60e..bbdde4b51f4 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1168,11 +1168,11 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetData *TD) { // that need to be moved to the dominating block. SmallPtrSet AggressiveInsts; - BasicBlock::iterator AfterPHIIt = BB->begin(); - while (isa(AfterPHIIt)) { - PHINode *PN = cast(AfterPHIIt++); + for (BasicBlock::iterator II = BB->begin(); isa(II);) { + PHINode *PN = cast(II++); if (Value *V = SimplifyInstruction(PN, TD)) { PN->replaceAllUsesWith(V); + PN->eraseFromParent(); continue; } @@ -1186,6 +1186,14 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetData *TD) { PN = dyn_cast(BB->begin()); if (PN == 0) return true; + // Don't fold i1 branches on PHIs which contain binary operators. These can + // often be turned into switches and other things. + if (PN->getType()->isIntegerTy(1) && + (isa(PN->getIncomingValue(0)) || + isa(PN->getIncomingValue(1)) || + isa(IfCond))) + return false; + // If we all PHI nodes are promotable, check to make sure that all // instructions in the predecessor blocks can be promoted as well. If // not, we won't be able to get rid of the control flow, so it's not @@ -1224,15 +1232,16 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetData *TD) { // If we can still promote the PHI nodes after this gauntlet of tests, // do all of the PHI's now. - + Instruction *InsertPt = DomBlock->getTerminator(); + // Move all 'aggressive' instructions, which are defined in the // conditional parts of the if's up to the dominating block. if (IfBlock1) - DomBlock->getInstList().splice(DomBlock->getTerminator(), + DomBlock->getInstList().splice(InsertPt, IfBlock1->getInstList(), IfBlock1->begin(), IfBlock1->getTerminator()); if (IfBlock2) - DomBlock->getInstList().splice(DomBlock->getTerminator(), + DomBlock->getInstList().splice(InsertPt, IfBlock2->getInstList(), IfBlock2->begin(), IfBlock2->getTerminator()); @@ -1241,7 +1250,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetData *TD) { Value *TrueVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfFalse); Value *FalseVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfTrue); - Value *NV = SelectInst::Create(IfCond, TrueVal, FalseVal, "", AfterPHIIt); + Value *NV = SelectInst::Create(IfCond, TrueVal, FalseVal, "", InsertPt); PN->replaceAllUsesWith(NV); NV->takeName(PN); PN->eraseFromParent(); diff --git a/test/Transforms/SimplifyCFG/PhiEliminate.ll b/test/Transforms/SimplifyCFG/PhiEliminate.ll index 73cf466a4f7..d5ce9a7e6bc 100644 --- a/test/Transforms/SimplifyCFG/PhiEliminate.ll +++ b/test/Transforms/SimplifyCFG/PhiEliminate.ll @@ -11,20 +11,6 @@ declare void @use(i1) declare void @use.upgrd.1(i32) -define void @test2(i1 %c, i1 %d, i32 %V, i32 %V2) { -;