[llvm-commits] [llvm] r132022 - /llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp
Cameron Zwarich
zwarich at apple.com
Wed May 25 01:45:44 PDT 2011
On 2011-05-24, at 4:12 PM, Evan Cheng wrote:
> @@ -910,12 +916,27 @@
> // successor if they become single-entry, those PHI nodes may
> // be in the Users list.
>
> + BasicBlock *Switch = SI->getParent();
> + BasicBlock *SISucc = SI->getSuccessor(DeadCase);
> + BasicBlock *Latch = L->getLoopLatch();
> + // If the DeadCase successor dominates all of the predecessors of the
> + // loop latch, then the transformation isn't safe since it will delete
> + // the predecessor edges to the latch.
> + if (Latch) {
> + bool DominateAll = true;
> + for (pred_iterator PI = pred_begin(Latch), PE = pred_end(Latch);
> + DominateAll && PI != PE; ++PI)
> + if (!DT->dominates(SISucc, *PI))
> + DominateAll = false;
> + if (DominateAll)
> + continue;
> + }
You only need to check whether SISucc dominates Latch here. Also, you should be change this check in RemoveBlockIfDead to be a dominance check rather than an equality check and avoid skipping the optimization:
// If this is the edge to the header block for a loop, remove the loop and
// promote all subloops.
if (Loop *BBLoop = LI->getLoopFor(BB)) {
if (BBLoop->getLoopLatch() == BB)
RemoveLoopFromHierarchy(BBLoop);
}
Cameron
More information about the llvm-commits
mailing list