[llvm] r358647 - [NewPM] Add Option handling for LoopVectorize

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 18 08:24:40 PDT 2019


This needs llvm-lit tests to show basic usage if nothing else.

Philip

On 4/18/19 1:46 AM, Serguei Katkov via llvm-commits wrote:
> Author: skatkov
> Date: Thu Apr 18 01:46:11 2019
> New Revision: 358647
>
> URL: http://llvm.org/viewvc/llvm-project?rev=358647&view=rev
> Log:
> [NewPM] Add Option handling for LoopVectorize
>
> This patch enables passing options to LoopVectorizePass via the passes pipeline.
>
> Reviewers: chandlerc, fedor.sergeev, leonardchan, philip.pfaffe
> Reviewed By: fedor.sergeev
> Subscribers: llvm-commits
> Differential Revision: https://reviews.llvm.org/D60681
>
> Modified:
>     llvm/trunk/include/llvm/Transforms/Vectorize/LoopVectorize.h
>     llvm/trunk/lib/Passes/PassBuilder.cpp
>     llvm/trunk/lib/Passes/PassRegistry.def
>
> Modified: llvm/trunk/include/llvm/Transforms/Vectorize/LoopVectorize.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Vectorize/LoopVectorize.h?rev=358647&r1=358646&r2=358647&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Vectorize/LoopVectorize.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Vectorize/LoopVectorize.h Thu Apr 18 01:46:11 2019
> @@ -76,15 +76,42 @@ class ScalarEvolution;
>  class TargetLibraryInfo;
>  class TargetTransformInfo;
>  
> +struct LoopVectorizeOptions {
> +  /// If false, consider all loops for interleaving.
> +  /// If true, only loops that explicitly request interleaving are considered.
> +  bool InterleaveOnlyWhenForced;
> +
> +  /// If false, consider all loops for vectorization.
> +  /// If true, only loops that explicitly request vectorization are considered.
> +  bool VectorizeOnlyWhenForced;
> +
> +  LoopVectorizeOptions()
> +      : InterleaveOnlyWhenForced(false), VectorizeOnlyWhenForced(false) {}
> +
> +  LoopVectorizeOptions &setInterleaveOnlyWhenForced(bool Value) {
> +    InterleaveOnlyWhenForced = Value;
> +    return *this;
> +  }
> +
> +  LoopVectorizeOptions &setVectorizeOnlyWhenForced(bool Value) {
> +    VectorizeOnlyWhenForced = Value;
> +    return *this;
> +  }
> +};
> +
>  /// The LoopVectorize Pass.
>  struct LoopVectorizePass : public PassInfoMixin<LoopVectorizePass> {
>    /// If false, consider all loops for interleaving.
>    /// If true, only loops that explicitly request interleaving are considered.
> -  bool InterleaveOnlyWhenForced = false;
> +  bool InterleaveOnlyWhenForced;
>  
>    /// If false, consider all loops for vectorization.
>    /// If true, only loops that explicitly request vectorization are considered.
> -  bool VectorizeOnlyWhenForced = false;
> +  bool VectorizeOnlyWhenForced;
> +
> +  LoopVectorizePass(LoopVectorizeOptions Opts = {})
> +      : InterleaveOnlyWhenForced(Opts.InterleaveOnlyWhenForced),
> +        VectorizeOnlyWhenForced(Opts.VectorizeOnlyWhenForced) {}
>  
>    ScalarEvolution *SE;
>    LoopInfo *LI;
>
> Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=358647&r1=358646&r2=358647&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Thu Apr 18 01:46:11 2019
> @@ -1469,6 +1469,27 @@ Expected<SimplifyCFGOptions> parseSimpli
>    return Result;
>  }
>  
> +/// Parser of parameters for LoopVectorize pass.
> +Expected<LoopVectorizeOptions> parseLoopVectorizeOptions(StringRef Params) {
> +  LoopVectorizeOptions Opts;
> +  while (!Params.empty()) {
> +    StringRef ParamName;
> +    std::tie(ParamName, Params) = Params.split(';');
> +
> +    bool Enable = !ParamName.consume_front("no-");
> +    if (ParamName == "interleave-forced-only") {
> +      Opts.setInterleaveOnlyWhenForced(Enable);
> +    } else if (ParamName == "vectorize-forced-only") {
> +      Opts.setVectorizeOnlyWhenForced(Enable);
> +    } else {
> +      return make_error<StringError>(
> +          formatv("invalid LoopVectorize parameter '{0}' ", ParamName).str(),
> +          inconvertibleErrorCode());
> +    }
> +  }
> +  return Opts;
> +}
> +
>  } // namespace
>  
>  /// Tests whether a pass name starts with a valid prefix for a default pipeline
>
> Modified: llvm/trunk/lib/Passes/PassRegistry.def
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=358647&r1=358646&r2=358647&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassRegistry.def (original)
> +++ llvm/trunk/lib/Passes/PassRegistry.def Thu Apr 18 01:46:11 2019
> @@ -199,7 +199,6 @@ FUNCTION_PASS("loop-data-prefetch", Loop
>  FUNCTION_PASS("loop-load-elim", LoopLoadEliminationPass())
>  FUNCTION_PASS("loop-fuse", LoopFusePass())
>  FUNCTION_PASS("loop-distribute", LoopDistributePass())
> -FUNCTION_PASS("loop-vectorize", LoopVectorizePass())
>  FUNCTION_PASS("pgo-memop-opt", PGOMemOPSizeOpt())
>  FUNCTION_PASS("print", PrintFunctionPass(dbgs()))
>  FUNCTION_PASS("print<assumptions>", AssumptionPrinterPass(dbgs()))
> @@ -258,6 +257,11 @@ FUNCTION_PASS_WITH_PARAMS("simplify-cfg"
>                               return SimplifyCFGPass(Opts);
>                             },
>                             parseSimplifyCFGOptions)
> +FUNCTION_PASS_WITH_PARAMS("loop-vectorize",
> +                           [](LoopVectorizeOptions Opts) {
> +                             return LoopVectorizePass(Opts);
> +                           },
> +                           parseLoopVectorizeOptions)
>  #undef FUNCTION_PASS_WITH_PARAMS
>  
>  #ifndef LOOP_ANALYSIS
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list