[llvm] r189499 - Disable unrolling in the loop vectorizer when disabled in the pass manager
Aaron Ballman
aaron at aaronballman.com
Wed Aug 28 13:33:17 PDT 2013
I think you may have broken the build on Windows with this:
http://bb.pgr.jp/builders/ninja-clang-i686-msc17-R/builds/4358
The clang test is failing because of r189500, but the llvm failures
seem to be from this patch. Can you fix or revert?
Thanks!
~Aaron
On Wed, Aug 28, 2013 at 2:33 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> Author: hfinkel
> Date: Wed Aug 28 13:33:10 2013
> New Revision: 189499
>
> URL: http://llvm.org/viewvc/llvm-project?rev=189499&view=rev
> Log:
> Disable unrolling in the loop vectorizer when disabled in the pass manager
>
> When unrolling is disabled in the pass manager, the loop vectorizer should also
> not unroll loops. This will allow the -fno-unroll-loops option in Clang to
> behave as expected (even for vectorizable loops). The loop vectorizer's
> -force-vector-unroll option will (continue to) override the pass-manager
> setting (including -force-vector-unroll=0 to force use of the internal
> auto-selection logic).
>
> In order to test this, I added a flag to opt (-disable-loop-unrolling) to force
> disable unrolling through opt (the analog of -fno-unroll-loops in Clang). Also,
> this fixes a small bug in opt where the loop vectorizer was enabled only after
> the pass manager populated the queue of passes (the global_alias.ll test needed
> a slight update to the RUN line as a result of this fix).
>
> Added:
> llvm/trunk/test/Transforms/LoopVectorize/X86/unroll-pm.ll
> Modified:
> llvm/trunk/include/llvm/Transforms/Vectorize.h
> llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
> llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
> llvm/trunk/test/Transforms/LoopVectorize/global_alias.ll
> llvm/trunk/tools/opt/opt.cpp
>
> Modified: llvm/trunk/include/llvm/Transforms/Vectorize.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Vectorize.h?rev=189499&r1=189498&r2=189499&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Vectorize.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Vectorize.h Wed Aug 28 13:33:10 2013
> @@ -114,7 +114,7 @@ createBBVectorizePass(const VectorizeCon
> //
> // LoopVectorize - Create a loop vectorization pass.
> //
> -Pass *createLoopVectorizePass();
> +Pass *createLoopVectorizePass(bool NoUnrolling = false);
>
> //===----------------------------------------------------------------------===//
> //
>
> Modified: llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp?rev=189499&r1=189498&r2=189499&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp Wed Aug 28 13:33:10 2013
> @@ -196,7 +196,7 @@ void PassManagerBuilder::populateModuleP
> MPM.add(createLoopDeletionPass()); // Delete dead loops
>
> if (!LateVectorize && LoopVectorize)
> - MPM.add(createLoopVectorizePass());
> + MPM.add(createLoopVectorizePass(DisableUnrollLoops));
>
> if (!DisableUnrollLoops)
> MPM.add(createLoopUnrollPass()); // Unroll small loops
> @@ -250,7 +250,7 @@ void PassManagerBuilder::populateModuleP
> // Add the various vectorization passes and relevant cleanup passes for
> // them since we are no longer in the middle of the main scalar pipeline.
> if (LoopVectorize) {
> - MPM.add(createLoopVectorizePass());
> + MPM.add(createLoopVectorizePass(DisableUnrollLoops));
>
> if (!DisableUnrollLoops)
> MPM.add(createLoopUnrollPass()); // Unroll small loops
>
> Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=189499&r1=189498&r2=189499&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
> +++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Wed Aug 28 13:33:10 2013
> @@ -761,9 +761,9 @@ struct LoopVectorizeHints {
> /// Vectorization unroll factor.
> unsigned Unroll;
>
> - LoopVectorizeHints(const Loop *L)
> + LoopVectorizeHints(const Loop *L, bool DisableUnrolling)
> : Width(VectorizationFactor)
> - , Unroll(VectorizationUnroll)
> + , Unroll(DisableUnrolling ? 1 : VectorizationUnroll)
> , LoopID(L->getLoopID()) {
> getHints(L);
> // The command line options override any loop metadata except for when
> @@ -772,6 +772,9 @@ struct LoopVectorizeHints {
> Width = VectorizationFactor;
> if (VectorizationUnroll.getNumOccurrences() > 0)
> Unroll = VectorizationUnroll;
> +
> + DEBUG(if (DisableUnrolling && Unroll == 1)
> + dbgs() << "LV: Unrolling disabled by the pass manager\n");
> }
>
> /// Return the loop vectorizer metadata prefix.
> @@ -878,7 +881,8 @@ struct LoopVectorize : public LoopPass {
> /// Pass identification, replacement for typeid
> static char ID;
>
> - explicit LoopVectorize() : LoopPass(ID) {
> + explicit LoopVectorize(bool NoUnrolling = false)
> + : LoopPass(ID), DisableUnrolling(NoUnrolling) {
> initializeLoopVectorizePass(*PassRegistry::getPassRegistry());
> }
>
> @@ -888,6 +892,7 @@ struct LoopVectorize : public LoopPass {
> TargetTransformInfo *TTI;
> DominatorTree *DT;
> TargetLibraryInfo *TLI;
> + bool DisableUnrolling;
>
> virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {
> // We only vectorize innermost loops.
> @@ -909,7 +914,7 @@ struct LoopVectorize : public LoopPass {
> DEBUG(dbgs() << "LV: Checking a loop in \"" <<
> L->getHeader()->getParent()->getName() << "\"\n");
>
> - LoopVectorizeHints Hints(L);
> + LoopVectorizeHints Hints(L, DisableUnrolling);
>
> if (Hints.Width == 1 && Hints.Unroll == 1) {
> DEBUG(dbgs() << "LV: Not vectorizing.\n");
> @@ -4786,8 +4791,8 @@ INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
> INITIALIZE_PASS_END(LoopVectorize, LV_NAME, lv_name, false, false)
>
> namespace llvm {
> - Pass *createLoopVectorizePass() {
> - return new LoopVectorize();
> + Pass *createLoopVectorizePass(bool NoUnrolling) {
> + return new LoopVectorize(NoUnrolling);
> }
> }
>
>
> Added: llvm/trunk/test/Transforms/LoopVectorize/X86/unroll-pm.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/X86/unroll-pm.ll?rev=189499&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopVectorize/X86/unroll-pm.ll (added)
> +++ llvm/trunk/test/Transforms/LoopVectorize/X86/unroll-pm.ll Wed Aug 28 13:33:10 2013
> @@ -0,0 +1,31 @@
> +; RUN: opt < %s -O2 -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx -force-vector-width=4 -S | FileCheck %s
> +; RUN: opt < %s -O2 -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx -force-vector-width=4 -disable-loop-unrolling -S | FileCheck %s -check-prefix=CHECK-NOUNRL
> +
> +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-macosx10.8.0"
> +;CHECK-LABEL: @bar(
> +;CHECK: store <4 x i32>
> +;CHECK: store <4 x i32>
> +;CHECK: ret
> +;CHECK-NOUNRL-LABEL: @bar(
> +;CHECK-NOUNRL: store <4 x i32>
> +;CHECK-NOUNRL-NOT: store <4 x i32>
> +;CHECK-NOUNRL: ret
> +define i32 @bar(i32* nocapture %A, i32 %n) nounwind uwtable ssp {
> + %1 = icmp sgt i32 %n, 0
> + br i1 %1, label %.lr.ph, label %._crit_edge
> +
> +.lr.ph: ; preds = %0, %.lr.ph
> + %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ]
> + %2 = getelementptr inbounds i32* %A, i64 %indvars.iv
> + %3 = load i32* %2, align 4
> + %4 = add nsw i32 %3, 6
> + store i32 %4, i32* %2, align 4
> + %indvars.iv.next = add i64 %indvars.iv, 1
> + %lftr.wideiv = trunc i64 %indvars.iv.next to i32
> + %exitcond = icmp eq i32 %lftr.wideiv, %n
> + br i1 %exitcond, label %._crit_edge, label %.lr.ph
> +
> +._crit_edge: ; preds = %.lr.ph, %0
> + ret i32 undef
> +}
>
> Modified: llvm/trunk/test/Transforms/LoopVectorize/global_alias.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/global_alias.ll?rev=189499&r1=189498&r2=189499&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopVectorize/global_alias.ll (original)
> +++ llvm/trunk/test/Transforms/LoopVectorize/global_alias.ll Wed Aug 28 13:33:10 2013
> @@ -1,4 +1,4 @@
> -; RUN: opt < %s -O3 -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s
> +; RUN: opt < %s -O1 -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s
>
> 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-v64:64:64-v128:64:128-a0:0:64-n32-S64"
>
>
> Modified: llvm/trunk/tools/opt/opt.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/opt.cpp?rev=189499&r1=189498&r2=189499&view=diff
> ==============================================================================
> --- llvm/trunk/tools/opt/opt.cpp (original)
> +++ llvm/trunk/tools/opt/opt.cpp Wed Aug 28 13:33:10 2013
> @@ -136,6 +136,11 @@ UnitAtATime("funit-at-a-time",
> cl::init(true));
>
> static cl::opt<bool>
> +DisableLoopUnrolling("disable-loop-unrolling",
> + cl::desc("Disable loop unrolling in all relevant passes"),
> + cl::init(false));
> +
> +static cl::opt<bool>
> DisableSimplifyLibCalls("disable-simplify-libcalls",
> cl::desc("Disable simplify-libcalls"));
>
> @@ -447,12 +452,13 @@ static void AddOptimizationPasses(PassMa
> Builder.Inliner = createAlwaysInlinerPass();
> }
> Builder.DisableUnitAtATime = !UnitAtATime;
> - Builder.DisableUnrollLoops = OptLevel == 0;
> + Builder.DisableUnrollLoops = (DisableLoopUnrolling.getNumOccurrences() > 0) ?
> + DisableLoopUnrolling : OptLevel == 0;
>
> + Builder.LoopVectorize = OptLevel > 1 && SizeLevel < 2;
> +
> Builder.populateFunctionPassManager(FPM);
> Builder.populateModulePassManager(MPM);
> -
> - Builder.LoopVectorize = OptLevel > 1 && SizeLevel < 2;
> }
>
> static void AddStandardCompilePasses(PassManagerBase &PM) {
>
>
> _______________________________________________
> 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