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

Hal Finkel hfinkel at anl.gov
Wed Aug 28 13:48:08 PDT 2013


----- 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