[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