[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