[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