diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-08-03 00:59:12 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-08-03 00:59:12 +0000 |
| commit | 2dbf1960ff49cf68cd1aaa7a6308a61b9aecbd88 (patch) | |
| tree | 1f9c136b18a87408430c4a6db50d4bf0216b83f5 /llvm/lib/Transforms/Utils | |
| parent | 42b635c70c4eed627bd208d90a1ba5b959bb221f (diff) | |
| download | bcm5719-llvm-2dbf1960ff49cf68cd1aaa7a6308a61b9aecbd88.tar.gz bcm5719-llvm-2dbf1960ff49cf68cd1aaa7a6308a61b9aecbd88.zip | |
Finally, add the required constraint checks to fix Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll
the right way
llvm-svn: 22615
Diffstat (limited to 'llvm/lib/Transforms/Utils')
| -rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 5f368bc786f..742efe61844 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -98,8 +98,35 @@ static bool CanPropagatePredecessorsForPHIs(BasicBlock *BB, BasicBlock *Succ) { } } } - - return true; + + // Finally, if BB has PHI nodes that are used by things other than the PHIs in + // Succ and Succ has predecessors that are not Succ and not Pred, we cannot + // fold these blocks, as we don't know whether BB dominates Succ or not to + // update the PHI nodes correctly. + if (!isa<PHINode>(BB->begin()) || Succ->getSinglePredecessor()) return true; + + // If the predecessors of Succ are only BB and Succ itself, we can handle this. + bool IsSafe = true; + for (pred_iterator PI = pred_begin(Succ), E = pred_end(Succ); PI != E; ++PI) + if (*PI != Succ && *PI != BB) { + IsSafe = false; + break; + } + if (IsSafe) return true; + + // If the PHI nodes in BB are only used by instructions in Succ, we are ok. + IsSafe = true; + for (BasicBlock::iterator I = BB->begin(); isa<PHINode>(I) && IsSafe; ++I) { + PHINode *PN = cast<PHINode>(I); + for (Value::use_iterator UI = PN->use_begin(), E = PN->use_end(); UI != E; + ++UI) + if (cast<Instruction>(*UI)->getParent() != Succ) { + IsSafe = false; + break; + } + } + + return IsSafe; } /// TryToSimplifyUncondBranchFromEmptyBlock - BB contains an unconditional |

