From 94f40324481c04ae8718967b4b5a3d7ca22370e6 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 10 Aug 2005 02:07:32 +0000 Subject: [PATCH] Make loop-simplify produce better loops by turning PHI nodes like X = phi [X, Y] into just Y. This often occurs when it seperates loops that have collapsed loop headers. This implements LoopSimplify/phi-node-simplify.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22746 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/LoopSimplify.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/Utils/LoopSimplify.cpp b/lib/Transforms/Utils/LoopSimplify.cpp index da1a6550a49..69b2ec44470 100644 --- a/lib/Transforms/Utils/LoopSimplify.cpp +++ b/lib/Transforms/Utils/LoopSimplify.cpp @@ -71,7 +71,7 @@ namespace { AU.addPreserved(); AU.addPreserved(); AU.addPreserved(); - AU.addPreservedID(BreakCriticalEdgesID); // No crit edges added.... + AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added. } private: bool ProcessLoop(Loop *L); @@ -190,8 +190,23 @@ bool LoopSimplify::ProcessLoop(Loop *L) { Changed = true; } + // Scan over the PHI nodes in the loop header. Since they now have only two + // incoming values (the loop is canonicalized), we may have simplified the PHI + // down to 'X = phi [X, Y]', which should be replaced with 'Y'. + PHINode *PN; + DominatorSet &DS = getAnalysis(); + for (BasicBlock::iterator I = L->getHeader()->begin(); + (PN = dyn_cast(I++)); ) + if (Value *V = PN->hasConstantValue(true)) + if (!isa(V) || + DS.dominates(cast(V)->getParent(), L->getHeader())) { + PN->replaceAllUsesWith(V); + PN->eraseFromParent(); + } + for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) Changed |= ProcessLoop(*I); + return Changed; } -- 2.34.1