[llvm-commits] [polly] r156254 - in /polly/trunk: include/polly/CodeGen/CodeGeneration.h lib/CodeGen/BlockGenerators.cpp lib/CodeGen/CodeGeneration.cpp lib/Pocc.cpp lib/RegisterPasses.cpp lib/ScheduleOptimizer.cpp

Hal Finkel hfinkel at anl.gov
Sun May 6 07:33:24 PDT 2012


Ether,

Great!

We should also work on refactoring the vectorization code
so that poly can call the instruction fusion code directly. Am I
correct in thinking that when polly decides to vectorize a loop it
already knows what should be vectorized?

 -Hal

On Sun, 06 May 2012 10:22:19 -0000
Hongbin Zheng <etherzhhb at gmail.com> wrote:

> Author: ether
> Date: Sun May  6 05:22:19 2012
> New Revision: 156254
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=156254&view=rev
> Log:
> Allow polly ask bb-vectorizer to vectorize the loop body.
> 
> Modified:
>     polly/trunk/include/polly/CodeGen/CodeGeneration.h
>     polly/trunk/lib/CodeGen/BlockGenerators.cpp
>     polly/trunk/lib/CodeGen/CodeGeneration.cpp
>     polly/trunk/lib/Pocc.cpp
>     polly/trunk/lib/RegisterPasses.cpp
>     polly/trunk/lib/ScheduleOptimizer.cpp
> 
> Modified: polly/trunk/include/polly/CodeGen/CodeGeneration.h
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/CodeGen/CodeGeneration.h?rev=156254&r1=156253&r2=156254&view=diff
> ==============================================================================
> --- polly/trunk/include/polly/CodeGen/CodeGeneration.h (original) +++
> polly/trunk/include/polly/CodeGen/CodeGeneration.h Sun May  6
> 05:22:19 2012 @@ -16,7 +16,14 @@ #ifdef CLOOG_FOUND
>  
>  namespace polly {
> -  extern bool EnablePollyVector;
> +  enum VectorizerChoice {
> +    VECTORIZER_NONE,
> +    VECTORIZER_POLLY,
> +    VECTORIZER_UNROLL_ONLY,
> +    VECTORIZER_FIRST_NEED_GROUPED_UNROLL = VECTORIZER_UNROLL_ONLY,
> +    VECTORIZER_BB
> +  };
> +  extern VectorizerChoice PollyVectorizerChoice;
>  }
>  
>  #endif // CLOOG_FOUND
> 
> Modified: polly/trunk/lib/CodeGen/BlockGenerators.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/BlockGenerators.cpp?rev=156254&r1=156253&r2=156254&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/BlockGenerators.cpp (original) +++
> polly/trunk/lib/CodeGen/BlockGenerators.cpp Sun May  6 05:22:19 2012
> @@ -14,6 +14,7
> @@ //===----------------------------------------------------------------------===// 
>  #include "polly/ScopInfo.h"
> +#include "polly/CodeGen/CodeGeneration.h"
>  #include "polly/CodeGen/BlockGenerators.h"
>  #include "polly/Support/GICHelper.h"
>  
> @@ -36,12 +37,6 @@
>         cl::init(false), cl::ZeroOrMore);
>  
>  static cl::opt<bool>
> -GroupedUnrolling("enable-polly-grouped-unroll",
> -                 cl::desc("Perform grouped unrolling, but don't
> generate SIMD "
> -                          "instuctions"), cl::Hidden,
> cl::init(false),
> -                 cl::ZeroOrMore);
> -
> -static cl::opt<bool>
>  SCEVCodegen("polly-codegen-scev",
>              cl::desc("Use SCEV based code generation."), cl::Hidden,
>              cl::init(false), cl::ZeroOrMore);
> @@ -244,7 +239,6 @@
>    ValueMapT &BBMap;
>  };
>  
> -
>  // Helper class to generate memory location.
>  namespace {
>  class IslGenerator {
> @@ -670,7 +664,8 @@
>  void VectorBlockGenerator::generateLoad(const LoadInst *Load,
>                                          ValueMapT &VectorMap,
>                                          VectorValueMapT &ScalarMaps)
> {
> -  if (GroupedUnrolling
> || !VectorType::isValidElementType(Load->getType())) {
> +  if (PollyVectorizerChoice >= VECTORIZER_FIRST_NEED_GROUPED_UNROLL
> ||
> +      !VectorType::isValidElementType(Load->getType())) {
>      for (int i = 0; i < getVectorWidth(); i++)
>        ScalarMaps[i][Load] = generateScalarLoad(Load, ScalarMaps[i],
>                                                 GlobalMaps[i]);
> 
> Modified: polly/trunk/lib/CodeGen/CodeGeneration.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/CodeGeneration.cpp?rev=156254&r1=156253&r2=156254&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/CodeGeneration.cpp (original) +++
> polly/trunk/lib/CodeGen/CodeGeneration.cpp Sun May  6 05:22:19 2012
> @@ -57,14 +57,6 @@ struct isl_set;
>  
>  namespace polly {
> -
> -bool EnablePollyVector;
> -
> -static cl::opt<bool, true>
> -Vector("enable-polly-vector",
> -       cl::desc("Enable polly vector code generation"), cl::Hidden,
> -       cl::location(EnablePollyVector), cl::init(false),
> cl::ZeroOrMore); -
>  static cl::opt<bool>
>  OpenMP("enable-polly-openmp",
>         cl::desc("Generate OpenMP parallel code"), cl::Hidden,
> @@ -616,6 +608,7 @@
>  }
>  
>  void ClastStmtCodeGen::codegen(const clast_for *f) {
> +  bool Vector = PollyVectorizerChoice != VECTORIZER_NONE;
>    if ((Vector || OpenMP) &&
> P->getAnalysis<Dependences>().isParallelFor(f)) { if (Vector &&
> isInnermostLoop(f) && (-1 != getNumberOfIterations(f)) &&
> (getNumberOfIterations(f) <= 16)) {
> 
> Modified: polly/trunk/lib/Pocc.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Pocc.cpp?rev=156254&r1=156253&r2=156254&view=diff
> ==============================================================================
> --- polly/trunk/lib/Pocc.cpp (original) +++ polly/trunk/lib/Pocc.cpp
> Sun May  6 05:22:19 2012 @@ -118,7 +118,7 @@
>    if (!DisablePollyTiling)
>      arguments.push_back("--pluto-tile");
>  
> -  if (EnablePollyVector)
> +  if (PollyVectorizerChoice != VECTORIZER_NONE)
>      arguments.push_back("--pluto-prevector");
>  
>    arguments.push_back(0);
> 
> Modified: polly/trunk/lib/RegisterPasses.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/lib/RegisterPasses.cpp?rev=156254&r1=156253&r2=156254&view=diff
> ==============================================================================
> --- polly/trunk/lib/RegisterPasses.cpp (original) +++
> polly/trunk/lib/RegisterPasses.cpp Sun May  6 05:22:19 2012 @@ -18,6
> +18,7 @@ #include "polly/ScopDetection.h"
>  #include "polly/ScopInfo.h"
>  #include "polly/TempScopInfo.h"
> +#include "polly/CodeGen/CodeGeneration.h"
>  
>  #include "llvm/Analysis/Passes.h"
>  #include "llvm/Analysis/CFGPrinter.h"
> @@ -25,6 +26,7 @@
>  #include "llvm/PassManager.h"
>  #include "llvm/PassRegistry.h"
>  #include "llvm/Transforms/Scalar.h"
> +#include "llvm/Transforms/Vectorize.h"
>  #include "llvm/Transforms/IPO/PassManagerBuilder.h"
>  #include "llvm/Support/CommandLine.h"
>  
> @@ -61,6 +63,21 @@
>              clEnumValEnd),
>            cl::Hidden, cl::init(OPTIMIZER_ISL), cl::ZeroOrMore);
>  
> +static cl::opt<polly::VectorizerChoice, true>
> +Vectorizer("polly-vectorizer",
> +          cl::desc("Select the scheduling optimizer"),
> +          cl::values(
> +            clEnumValN(polly::VECTORIZER_NONE, "none", "No
> Vectorization"),
> +            clEnumValN(polly::VECTORIZER_POLLY, "polly",
> +                       "Polly internal vectorizer"),
> +            clEnumValN(polly::VECTORIZER_UNROLL_ONLY, "unroll-only",
> +                       "Only grouped unroll the vectorize candidate
> loops"),
> +            clEnumValN(polly::VECTORIZER_BB, "bb",
> +                       "The Basic Block vectorizer driven by Polly"),
> +            clEnumValEnd),
> +          cl::Hidden, cl::location(PollyVectorizerChoice),
> +          cl::init(polly::VECTORIZER_NONE), cl::ZeroOrMore);
> +
>  static cl::opt<bool>
>  ImportJScop("polly-import",
>              cl::desc("Export the polyhedral description of the
> detected Scops"), @@ -174,6 +191,8 @@
>    PM.add(polly::createRegionSimplifyPass());
>  }
>  
> +VectorizerChoice polly::PollyVectorizerChoice;
> +
>  void polly::registerPollyPasses(llvm::PassManagerBase &PM, bool
> DisableCodegen) { bool RunCodegen = !DisableCodegen;
>  
> @@ -215,8 +234,15 @@
>      PM.add(polly::createJSONExporterPass());
>  
>  #ifdef CLOOG_FOUND
> -  if (RunCodegen)
> +  if (RunCodegen) {
>      PM.add(polly::createCodeGenerationPass());
> +
> +    if (PollyVectorizerChoice == VECTORIZER_BB) {
> +      VectorizeConfig C;
> +      C.FastDep = true;
> +      PM.add(createBBVectorizePass(C));
> +    }
> +  }
>  #endif
>  
>    if (CFGPrinter)
> 
> Modified: polly/trunk/lib/ScheduleOptimizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/polly/trunk/lib/ScheduleOptimizer.cpp?rev=156254&r1=156253&r2=156254&view=diff
> ==============================================================================
> --- polly/trunk/lib/ScheduleOptimizer.cpp (original) +++
> polly/trunk/lib/ScheduleOptimizer.cpp Sun May  6 05:22:19 2012 @@
> -412,7 +412,7 @@ PartialSchedule =
> isl_union_map_flat_range_product(PartialSchedule, SuffixSchedule);
>        isl_band_list_free(Children);
> -    } else if (EnablePollyVector) {
> +    } else if (PollyVectorizerChoice != VECTORIZER_NONE) {
>        for (int j = 0;  j < isl_band_n_member(Band); j++) {
>  	if (isl_band_member_is_zero_distance(Band, j)) {
>            isl_map *TileMap;
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



-- 
Hal Finkel
Postdoctoral Appointee
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-commits mailing list