[llvm] r189499 - Disable unrolling in the loop vectorizer when disabled in the pass manager

Aaron Ballman aaron at aaronballman.com
Wed Aug 28 14:05:16 PDT 2013


You're correct -- this was espindola's patch, and he's already on the
fix.  Sorry for the blame!  ;-)

~Aaron

On Wed, Aug 28, 2013 at 4:48 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> ----- Original Message -----
>> 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?
>
> I don't see how that change could have possibly caused those failures. I'll wait for a secondary confirmation. chapuni, can you please help with the diagnosis?
>
> Thanks for pointing this out!
>
>  -Hal
>
>>
>> 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
>>
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory



More information about the llvm-commits mailing list