summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp b/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp
index e0456a2110d..7c7bf64ba79 100644
--- a/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp
@@ -41,6 +41,12 @@ static cl::opt<unsigned> CheckPerElim(
cl::desc("Max number of memchecks allowed per eliminated load on average"),
cl::init(1));
+static cl::opt<unsigned> LoadElimSCEVCheckThreshold(
+ "loop-load-elimination-scev-check-threshold", cl::init(8), cl::Hidden,
+ cl::desc("The maximum number of SCEV checks allowed for Loop "
+ "Load Elimination"));
+
+
STATISTIC(NumLoopLoadEliminted, "Number of loads eliminated by LLE");
namespace {
@@ -453,10 +459,17 @@ public:
return false;
}
+ if (LAI.Preds.getComplexity() > LoadElimSCEVCheckThreshold) {
+ DEBUG(dbgs() << "Too many SCEV run-time checks needed.\n");
+ return false;
+ }
+
// Point of no-return, start the transformation. First, version the loop if
// necessary.
- if (!Checks.empty()) {
- LoopVersioning LV(std::move(Checks), LAI, L, LI, DT);
+ if (!Checks.empty() || !LAI.Preds.isAlwaysTrue()) {
+ LoopVersioning LV(LAI, L, LI, DT, SE, false);
+ LV.setAliasChecks(std::move(Checks));
+ LV.setSCEVChecks(LAI.Preds);
LV.versionLoop();
}
OpenPOWER on IntegriCloud