[PATCH] D53440: [LoopUnroll] allow customization for new-pass-manager version of LoopUnroll
Fedor Sergeev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 19 10:21:12 PDT 2018
fedor.sergeev updated this revision to Diff 170214.
fedor.sergeev added a comment.
clang-formatted
Repository:
rL LLVM
https://reviews.llvm.org/D53440
Files:
include/llvm/Transforms/Scalar/LoopUnrollPass.h
lib/Transforms/Scalar/LoopUnrollPass.cpp
Index: lib/Transforms/Scalar/LoopUnrollPass.cpp
===================================================================
--- lib/Transforms/Scalar/LoopUnrollPass.cpp
+++ lib/Transforms/Scalar/LoopUnrollPass.cpp
@@ -1333,23 +1333,21 @@
Loop *ParentL = L.getParentLoop();
#endif
- // The API here is quite complex to call, but there are only two interesting
- // states we support: partial and full (or "simple") unrolling. However, to
- // enable these things we actually pass "None" in for the optional to avoid
- // providing an explicit choice.
- Optional<bool> AllowPartialParam, RuntimeParam, UpperBoundParam,
- AllowPeeling;
// Check if the profile summary indicates that the profiled application
// has a huge working set size, in which case we disable peeling to avoid
// bloating it further.
if (PSI && PSI->hasHugeWorkingSetSize())
AllowPeeling = false;
std::string LoopName = L.getName();
+ // The API here is quite complex to call and we allow to select some
+ // flavors of unrolling during construction time (by setting Allow* values).
+ // As soon as the caller does not care we pass None for the corresponding
+ // optional to avoid providing an explicit choice.
LoopUnrollResult Result =
tryToUnrollLoop(&L, DT, &LI, SE, TTI, AC, ORE,
/*PreserveLCSSA*/ true, OptLevel, /*Count*/ None,
- /*Threshold*/ None, AllowPartialParam, RuntimeParam,
- UpperBoundParam, AllowPeeling);
+ /*Threshold*/ None, AllowPartial, AllowRuntime,
+ AllowUpperBound, AllowPeeling);
Changed |= Result != LoopUnrollResult::Unmodified;
// The parent must not be damaged by unrolling!
Index: include/llvm/Transforms/Scalar/LoopUnrollPass.h
===================================================================
--- include/llvm/Transforms/Scalar/LoopUnrollPass.h
+++ include/llvm/Transforms/Scalar/LoopUnrollPass.h
@@ -10,6 +10,7 @@
#ifndef LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
#define LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
+#include "llvm/ADT/Optional.h"
#include "llvm/Analysis/LoopAnalysisManager.h"
#include "llvm/IR/PassManager.h"
@@ -35,12 +36,45 @@
/// It will also put loops into canonical form (simplified and LCSSA).
class LoopUnrollPass : public PassInfoMixin<LoopUnrollPass> {
const int OptLevel;
+ Optional<bool> AllowPartial;
+ Optional<bool> AllowRuntime;
+ Optional<bool> AllowPeeling;
+ Optional<bool> AllowUpperBound;
public:
/// This uses the target information (or flags) to control the thresholds for
/// different unrolling stategies but supports all of them.
explicit LoopUnrollPass(int OptLevel = 2) : OptLevel(OptLevel) {}
+ /// Selector for the optional behavior - Partial unrolling.
+ /// Call with \p Partial being true to enable, false to disable.
+ /// Without calling this a global default will be used.
+ LoopUnrollPass &&setPartial(bool Partial) && {
+ AllowPartial = Partial;
+ return std::move(*this);
+ }
+ /// Selector for the optional behavior - Runtime unrolling.
+ /// Call with \p Runtime being true to enable, false to disable.
+ /// Without calling this a global default will be used.
+ LoopUnrollPass &&setRuntime(bool Runtime) && {
+ AllowRuntime = Runtime;
+ return std::move(*this);
+ }
+ /// Selector for the optional behavior - Peeling.
+ /// Call with \p Peeling being true to enable, false to disable.
+ /// Without calling this a global default will be used.
+ LoopUnrollPass &&setPeeling(bool Peeling) && {
+ AllowPeeling = Peeling;
+ return std::move(*this);
+ }
+ /// Selector for the optional behavior - UpperBound.
+ /// Call with \p UpperBound being true to enable, false to disable.
+ /// Without calling this a global default will be used.
+ LoopUnrollPass &&setUpperBound(bool UpperBound) && {
+ AllowUpperBound = UpperBound;
+ return std::move(*this);
+ }
+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53440.170214.patch
Type: text/x-patch
Size: 4071 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181019/b5fd8be3/attachment.bin>
More information about the llvm-commits
mailing list