[llvm] r184698 - Add a flag to defer vectorization into a phase after the inliner and its

Nadav Rotem nrotem at apple.com
Mon Jul 1 11:26:21 PDT 2013


Hi Chandler, 

Have you had a chance to run the tests that you wanted with the new flag ?  Are you planning to continue the discussion on this issue ?

Thanks,
Nadav


On Jun 24, 2013, at 12:21 AM, Chandler Carruth <chandlerc at gmail.com> wrote:

> Author: chandlerc
> Date: Mon Jun 24 02:21:47 2013
> New Revision: 184698
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=184698&view=rev
> Log:
> Add a flag to defer vectorization into a phase after the inliner and its
> CGSCC pass manager. This should insulate the inlining decisions from the
> vectorization decisions, however it may have both compile time and code
> size problems so it is just an experimental option right now.
> 
> Adding this based on a discussion with Arnold and it seems at least
> worth having this flag for us to both run some experiments to see if
> this strategy is workable. It may solve some of the regressions seen
> with the loop vectorizer.
> 
> Modified:
>    llvm/trunk/include/llvm/Transforms/IPO/PassManagerBuilder.h
>    llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
> 
> Modified: llvm/trunk/include/llvm/Transforms/IPO/PassManagerBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO/PassManagerBuilder.h?rev=184698&r1=184697&r2=184698&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/IPO/PassManagerBuilder.h (original)
> +++ llvm/trunk/include/llvm/Transforms/IPO/PassManagerBuilder.h Mon Jun 24 02:21:47 2013
> @@ -105,6 +105,7 @@ public:
>   bool BBVectorize;
>   bool SLPVectorize;
>   bool LoopVectorize;
> +  bool LateVectorize;
> 
> private:
>   /// ExtensionList - This is list of all of the extensions that are registered.
> 
> Modified: llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp?rev=184698&r1=184697&r2=184698&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp Mon Jun 24 02:21:47 2013
> @@ -33,6 +33,11 @@ RunLoopVectorization("vectorize-loops",
>                      cl::desc("Run the Loop vectorization passes"));
> 
> static cl::opt<bool>
> +LateVectorization("late-vectorize", cl::init(false), cl::Hidden,
> +                  cl::desc("Run the vectorization pasess late in the pass "
> +                           "pipeline (after the inliner)"));
> +
> +static cl::opt<bool>
> RunSLPVectorization("vectorize-slp",
>                     cl::desc("Run the SLP vectorization passes"));
> 
> @@ -59,6 +64,7 @@ PassManagerBuilder::PassManagerBuilder()
>     BBVectorize = RunBBVectorization;
>     SLPVectorize = RunSLPVectorization;
>     LoopVectorize = RunLoopVectorization;
> +    LateVectorize = LateVectorization;
> }
> 
> PassManagerBuilder::~PassManagerBuilder() {
> @@ -189,8 +195,8 @@ void PassManagerBuilder::populateModuleP
>   MPM.add(createLoopIdiomPass());             // Recognize idioms like memset.
>   MPM.add(createLoopDeletionPass());          // Delete dead loops
> 
> -  if (LoopVectorize && OptLevel > 1 && SizeLevel < 2)
> -    MPM.add(createLoopVectorizePass());
> +  if (!LateVectorize && LoopVectorize && OptLevel > 1 && SizeLevel < 2)
> +      MPM.add(createLoopVectorizePass());
> 
>   if (!DisableUnrollLoops)
>     MPM.add(createLoopUnrollPass());          // Unroll small loops
> @@ -210,26 +216,70 @@ void PassManagerBuilder::populateModuleP
> 
>   addExtensionsToPM(EP_ScalarOptimizerLate, MPM);
> 
> -  if (SLPVectorize)
> -    MPM.add(createSLPVectorizerPass());     // Vectorize parallel scalar chains.
> -
> -  if (BBVectorize) {
> -    MPM.add(createBBVectorizePass());
> -    MPM.add(createInstructionCombiningPass());
> -    if (OptLevel > 1 && UseGVNAfterVectorization)
> -      MPM.add(createGVNPass());                   // Remove redundancies
> -    else
> -      MPM.add(createEarlyCSEPass());              // Catch trivial redundancies
> -
> -    // BBVectorize may have significantly shortened a loop body; unroll again.
> -    if (!DisableUnrollLoops)
> -      MPM.add(createLoopUnrollPass());
> +  if (!LateVectorize) {
> +    if (SLPVectorize)
> +      MPM.add(createSLPVectorizerPass());   // Vectorize parallel scalar chains.
> +
> +    if (BBVectorize) {
> +      MPM.add(createBBVectorizePass());
> +      MPM.add(createInstructionCombiningPass());
> +      if (OptLevel > 1 && UseGVNAfterVectorization)
> +        MPM.add(createGVNPass());           // Remove redundancies
> +      else
> +        MPM.add(createEarlyCSEPass());      // Catch trivial redundancies
> +
> +      // BBVectorize may have significantly shortened a loop body; unroll again.
> +      if (!DisableUnrollLoops)
> +        MPM.add(createLoopUnrollPass());
> +    }
>   }
> 
>   MPM.add(createAggressiveDCEPass());         // Delete dead instructions
>   MPM.add(createCFGSimplificationPass());     // Merge & remove BBs
>   MPM.add(createInstructionCombiningPass());  // Clean up after everything.
> 
> +  // As an experimental mode, run any vectorization passes in a separate
> +  // pipeline from the CGSCC pass manager that runs iteratively with the
> +  // inliner.
> +  if (LateVectorize) {
> +    // FIXME: This is a HACK! The inliner pass above implicitly creates a CGSCC
> +    // pass manager that we are specifically trying to avoid. To prevent this
> +    // we must insert a no-op module pass to reset the pass manager.
> +    MPM.add(createBarrierNoopPass());
> +
> +    // 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 && OptLevel > 1 && SizeLevel < 2) {
> +      MPM.add(createLoopVectorizePass());
> +
> +      if (!DisableUnrollLoops)
> +        MPM.add(createLoopUnrollPass());    // Unroll small loops
> +
> +      // FIXME: Is this necessary/useful? Should we also do SimplifyCFG?
> +      MPM.add(createInstructionCombiningPass());
> +    }
> +
> +    if (SLPVectorize) {
> +      MPM.add(createSLPVectorizerPass());   // Vectorize parallel scalar chains.
> +
> +      // FIXME: Is this necessary/useful? Should we also do SimplifyCFG?
> +      MPM.add(createInstructionCombiningPass());
> +    }
> +
> +    if (BBVectorize) {
> +      MPM.add(createBBVectorizePass());
> +      MPM.add(createInstructionCombiningPass());
> +      if (OptLevel > 1 && UseGVNAfterVectorization)
> +        MPM.add(createGVNPass());           // Remove redundancies
> +      else
> +        MPM.add(createEarlyCSEPass());      // Catch trivial redundancies
> +
> +      // BBVectorize may have significantly shortened a loop body; unroll again.
> +      if (!DisableUnrollLoops)
> +        MPM.add(createLoopUnrollPass());
> +    }
> +  }
> +
>   if (!DisableUnitAtATime) {
>     // FIXME: We shouldn't bother with this anymore.
>     MPM.add(createStripDeadPrototypesPass()); // Get rid of dead prototypes
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130701/b4391c84/attachment.html>


More information about the llvm-commits mailing list