From 2ab9b7521b5d133ff6951f6ad476d568c791c93e Mon Sep 17 00:00:00 2001 From: Serguei Katkov Date: Thu, 18 Apr 2019 08:46:11 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358647 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm/Transforms/Vectorize/LoopVectorize.h | 31 +++++++++++++++++-- lib/Passes/PassBuilder.cpp | 21 +++++++++++++ lib/Passes/PassRegistry.def | 6 +++- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/include/llvm/Transforms/Vectorize/LoopVectorize.h b/include/llvm/Transforms/Vectorize/LoopVectorize.h index 88b0658caf3..daca286f018 100644 --- a/include/llvm/Transforms/Vectorize/LoopVectorize.h +++ b/include/llvm/Transforms/Vectorize/LoopVectorize.h @@ -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 { /// 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; diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index 92d6dbc2b5a..66936d68cb9 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -1469,6 +1469,27 @@ Expected parseSimplifyCFGOptions(StringRef Params) { return Result; } +/// Parser of parameters for LoopVectorize pass. +Expected 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( + 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 diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def index aa75af9bb23..d3220c8f2e6 100644 --- a/lib/Passes/PassRegistry.def +++ b/lib/Passes/PassRegistry.def @@ -199,7 +199,6 @@ FUNCTION_PASS("loop-data-prefetch", LoopDataPrefetchPass()) 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", 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 -- 2.40.0