[llvm-commits] [llvm] r137203 - in /llvm/trunk: lib/Transforms/Scalar/LoopUnrollPass.cpp lib/Transforms/Utils/LoopUnroll.cpp test/Transforms/LoopUnroll/2011-08-09-IVSimplify.ll

Nick Lewycky nicholas at mxc.ca
Tue Aug 9 22:18:48 PDT 2011


Andrew Trick wrote:
> Author: atrick
> Date: Tue Aug  9 23:29:49 2011
> New Revision: 137203
>
> URL: http://llvm.org/viewvc/llvm-project?rev=137203&view=rev
> Log:
> Invoke SimplifyIndVar when we partially unroll a loop. Fixes PR10534.
>
> Added:
>      llvm/trunk/test/Transforms/LoopUnroll/2011-08-09-IVSimplify.ll
> Modified:
>      llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp
>      llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=137203&r1=137202&r2=137203&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp Tue Aug  9 23:29:49 2011
> @@ -79,6 +79,7 @@
>         AU.addPreservedID(LoopSimplifyID);
>         AU.addRequiredID(LCSSAID);
>         AU.addPreservedID(LCSSAID);
> +      AU.addRequired<ScalarEvolution>();
>         AU.addPreserved<ScalarEvolution>();
>         // FIXME: Loop unroll requires LCSSA. And LCSSA requires dom info.
>         // If loop unroll does not preserve dom info then LCSSA pass on next
> @@ -187,12 +188,8 @@
>     }
>
>     // Unroll the loop.
> -  Function *F = L->getHeader()->getParent();
>     if (!UnrollLoop(L, Count, TripCount, TripMultiple, LI,&LPM))
>       return false;
>
> -  // FIXME: Reconstruct dom info, because it is not preserved properly.
> -  if (DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>())
> -    DT->runOnFunction(*F);
>     return true;
>   }
>
> Modified: llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp?rev=137203&r1=137202&r2=137203&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp Tue Aug  9 23:29:49 2011
> @@ -29,6 +29,7 @@
>   #include "llvm/Transforms/Utils/BasicBlockUtils.h"
>   #include "llvm/Transforms/Utils/Cloning.h"
>   #include "llvm/Transforms/Utils/Local.h"
> +#include "llvm/Transforms/Utils/SimplifyIndVar.h"
>   using namespace llvm;
>
>   // TODO: Should these be here or in LoopUnroll?
> @@ -130,6 +131,9 @@
>   ///
>   /// If a LoopPassManager is passed in, and the loop is fully removed, it will be
>   /// removed from the LoopPassManager as well. LPM can also be NULL.
> +///
> +/// This utility preserves LoopInfo. If DominatorTree or ScalarEvolution are
> +/// available it must also preseve those analyses.

Typo, "preseve".

>   bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount,
>                         unsigned TripMultiple, LoopInfo *LI, LPPassManager *LPM) {
>     BasicBlock *Preheader = L->getLoopPreheader();
> @@ -163,7 +167,8 @@
>
>     // Notify ScalarEvolution that the loop will be substantially changed,
>     // if not outright eliminated.
> -  if (ScalarEvolution *SE = LPM->getAnalysisIfAvailable<ScalarEvolution>())
> +  ScalarEvolution *SE = LPM->getAnalysisIfAvailable<ScalarEvolution>();
> +  if (SE)
>       SE->forgetLoop(L);
>
>     if (TripCount != 0)
> @@ -374,6 +379,24 @@
>       }
>     }
>
> +  // FIXME: Reconstruct dom info, because it is not preserved properly.
> +  // Incrementally updating domtree after loop unrolling woud be easy.

Typo, "woud".

Nick

> +  if (DominatorTree *DT = LPM->getAnalysisIfAvailable<DominatorTree>())
> +    DT->runOnFunction(*L->getHeader()->getParent());
> +
> +  // Simplify any new induction variables in the partially unrolled loop.
> +  if (SE&&  !CompletelyUnroll) {
> +    SmallVector<WeakVH, 16>  DeadInsts;
> +    simplifyLoopIVs(L, SE, LPM, DeadInsts);
> +
> +    // Aggressively clean up dead instructions that simplifyLoopIVs already
> +    // identified. Any remaining should be cleaned up below.
> +    while (!DeadInsts.empty())
> +      if (Instruction *Inst =
> +          dyn_cast_or_null<Instruction>(&*DeadInsts.pop_back_val()))
> +        RecursivelyDeleteTriviallyDeadInstructions(Inst);
> +  }
> +
>     // At this point, the code is well formed.  We now do a quick sweep over the
>     // inserted code, doing constant propagation and dead code elimination as we
>     // go.
>
> Added: llvm/trunk/test/Transforms/LoopUnroll/2011-08-09-IVSimplify.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/2011-08-09-IVSimplify.ll?rev=137203&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopUnroll/2011-08-09-IVSimplify.ll (added)
> +++ llvm/trunk/test/Transforms/LoopUnroll/2011-08-09-IVSimplify.ll Tue Aug  9 23:29:49 2011
> @@ -0,0 +1,39 @@
> +; RUN: opt -S<  %s -loop-unroll -unroll-count=4 -disable-iv-rewrite | FileCheck %s
> +;
> +; Test induction variable simplify after loop unrolling. It should
> +; expose nice opportunities for GVN.
> +
> +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
> +
> +; PR10534: LoopUnroll not keeping canonical induction variable...
> +; CHECK: while.body.1:
> +; CHECK: %shr.1 = lshr i32 %bit_addr.addr.01, 5
> +; CHECK: %arrayidx.1 = getelementptr inbounds i32* %bitmap, i32 %shr.1
> +; CHECK: while.body.2:
> +; CHECK: %shr.2 = lshr i32 %bit_addr.addr.01, 5
> +; CHECK: %arrayidx.2 = getelementptr inbounds i32* %bitmap, i32 %shr.2
> +; CHECK: while.body.3:
> +; CHECK: %shr.3 = lshr i32 %bit_addr.addr.01, 5
> +; CHECK: %arrayidx.3 = getelementptr inbounds i32* %bitmap, i32 %shr.3
> +define void @FlipBit(i32* nocapture %bitmap, i32 %bit_addr, i32 %nbits) nounwind {
> +entry:
> +  br label %while.body
> +
> +while.body:
> +  %nbits.addr.02 = phi i32 [ 128, %entry ], [ %dec, %while.body ]
> +  %bit_addr.addr.01 = phi i32 [ 0, %entry ], [ %inc, %while.body ]
> +  %dec = add i32 %nbits.addr.02, -1
> +  %shr = lshr i32 %bit_addr.addr.01, 5
> +  %rem = and i32 %bit_addr.addr.01, 31
> +  %shl = shl i32 1, %rem
> +  %arrayidx = getelementptr inbounds i32* %bitmap, i32 %shr
> +  %tmp6 = load i32* %arrayidx, align 4
> +  %xor = xor i32 %tmp6, %shl
> +  store i32 %xor, i32* %arrayidx, align 4
> +  %inc = add i32 %bit_addr.addr.01, 1
> +  %tobool = icmp eq i32 %dec, 0
> +  br i1 %tobool, label %while.end, label %while.body
> +
> +while.end:
> +  ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list