[llvm] r220345 - LTO: respect command-line options that disable vectorization.

Arnold Schwaighofer aschwaighofer at apple.com
Fri Oct 24 08:57:19 PDT 2014


JF are you sure that “LoopVectorize” is set to true by default by the PassManager instance of libLTO?

The reason why I forced these parameters to true is that this is not the case if I remember correctly.

We wanted the default for libLTO to be with vectorization.

PassManager.cpp:

static cl::opt<bool>
RunLoopVectorization("vectorize-loops", cl::Hidden,
                     cl::desc("Run the Loop vectorization passes"));

PassManagerBuilder::PassManagerBuilder() {
    OptLevel = 2;
    SizeLevel = 0;
    LibraryInfo = nullptr;
    Inliner = nullptr;
    DisableTailCalls = false;
    DisableUnitAtATime = false;
    DisableUnrollLoops = false;
    BBVectorize = RunBBVectorization;
    SLPVectorize = RunSLPVectorization;
    LoopVectorize = RunLoopVectorization;
    RerollLoops = RunLoopRerolling;
    LoadCombine = RunLoadCombine;
    DisableGVNLoadPRE = false;
    VerifyInput = false;
    VerifyOutput = false;
    StripDebug = false;
    MergeFunctions = false;
}

LTOCodeGenerator.cpp:

/// Optimize merged modules using various IPO passes
bool LTOCodeGenerator::generateObjectFile(raw_ostream &out,
                                          bool DisableOpt,
                                          bool DisableInline,
                                          bool DisableGVNLoadPRE,
                                          std::string &errMsg) {
  if (!this->determineTarget(errMsg))
    return false;

  Module *mergedModule = IRLinker.getModule();

  // Mark which symbols can not be internalized
  this->applyScopeRestrictions();

  // Instantiate the pass manager to organize the passes.
  PassManager passes;

  // Add an appropriate DataLayout instance for this module...
  mergedModule->setDataLayout(TargetMach->getSubtargetImpl()->getDataLayout());

  Triple TargetTriple(TargetMach->getTargetTriple());
  PassManagerBuilder PMB;
  PMB.DisableGVNLoadPRE = DisableGVNLoadPRE;
  if (!DisableInline)
    PMB.Inliner = createFunctionInliningPass();
  PMB.LibraryInfo = new TargetLibraryInfo(TargetTriple);
  if (DisableOpt)
    PMB.OptLevel = 0;
  PMB.VerifyInput = true;
  PMB.VerifyOutput = true;

  PMB.populateLTOPassManager(passes, TargetMach);



I think cl::opt<bool> defaults to false and your commit effectively disabled vectorization during LTO. We can recover this by changing the default cl::opt flags 'vectorize-loops’ and 'vectorize-slp'  to true. If that does not work (because we make assumption somewhere about the default being false) we can follow the example of “DisableGVNLoadPRE” in LTOCodeGenerator.cpp and a a flag to disable Vectorization during LTO and pass that to the PassManager created in generateObjectFile.

  PMB.LoopVectorize = !DisableLTOVectorization;


Thanks,
Arnold

> DisableUnrollLoops
> On Oct 24, 2014, at 5:27 AM, Alexey Volkov <avolkov.intel at gmail.com> wrote:
> 
> Hi JF,
> 
> After your commit I saw a performance regression because of disabled Loop Vectorizer:
>  LV: Not vectorizing: No #pragma vectorize enable.
> It is really strange since I used -Ofast -flto clang's options to build an application.
> Before this change loop was successfully vectorized by Loop Vectorizer.
> 
> Thanks, Alexey.
> 
> 2014-10-22 3:18 GMT+04:00 JF Bastien <jfb at google.com>:
> Author: jfb
> Date: Tue Oct 21 18:18:21 2014
> New Revision: 220345
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=220345&view=rev
> Log:
> LTO: respect command-line options that disable vectorization.
> 
> Summary: Patches 202051 and 208013 added calls to LTO's PassManager which unconditionally add LoopVectorizePass and SLPVectorizerPass instead of following the logic in PassManagerBuilder::populateModulePassManager and honoring the -vectorize-loops -run-slp-after-loop-vectorization flags.
> 
> Reviewers: nadav, aschwaighofer, yijiang
> 
> Subscribers: llvm-commits
> 
> Differential Revision: http://reviews.llvm.org/D5884
> 
> Modified:
>     llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
> 
> Modified: llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp?rev=220345&r1=220344&r2=220345&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp Tue Oct 21 18:18:21 2014
> @@ -440,10 +440,12 @@ void PassManagerBuilder::addLTOOptimizat
>    // More loops are countable; try to optimize them.
>    PM.add(createIndVarSimplifyPass());
>    PM.add(createLoopDeletionPass());
> -  PM.add(createLoopVectorizePass(true, true));
> +  PM.add(createLoopVectorizePass(DisableUnrollLoops, LoopVectorize));
> 
>    // More scalar chains could be vectorized due to more alias information
> -  PM.add(createSLPVectorizerPass()); // Vectorize parallel scalar chains.
> +  if (RunSLPAfterLoopVectorization)
> +    if (SLPVectorize)
> +      PM.add(createSLPVectorizerPass()); // Vectorize parallel scalar chains.
> 
>    // After vectorization, assume intrinsics may tell us more about pointer
>    // alignments.
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> 
> 
> -- 
> Alexey Volkov
> Intel Corporation
> _______________________________________________
> 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