[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