diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopRerollPass.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopRerollPass.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopRerollPass.cpp b/llvm/lib/Transforms/Scalar/LoopRerollPass.cpp index da13a342ae123..3542d0a4ee735 100644 --- a/llvm/lib/Transforms/Scalar/LoopRerollPass.cpp +++ b/llvm/lib/Transforms/Scalar/LoopRerollPass.cpp @@ -24,7 +24,6 @@ #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/ScalarEvolution.h" -#include "llvm/Analysis/ScalarEvolutionExpander.h" #include "llvm/Analysis/ScalarEvolutionExpressions.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" @@ -55,6 +54,7 @@ #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/LoopUtils.h" +#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h" #include <cassert> #include <cstddef> #include <cstdint> @@ -880,6 +880,12 @@ bool LoopReroll::DAGRootTracker::validateRootSet(DAGRootSet &DRS) { if (DRS.Roots.empty()) return false; + // If the value of the base instruction is used outside the loop, we cannot + // reroll the loop. Check for other root instructions is unnecessary because + // they don't match any base instructions if their values are used outside. + if (hasUsesOutsideLoop(DRS.BaseInst, L)) + return false; + // Consider a DAGRootSet with N-1 roots (so N different values including // BaseInst). // Define d = Roots[0] - BaseInst, which should be the same as @@ -1126,7 +1132,7 @@ static bool isIgnorableInst(const Instruction *I) { case Intrinsic::annotation: case Intrinsic::ptr_annotation: case Intrinsic::var_annotation: - // TODO: the following intrinsics may also be whitelisted: + // TODO: the following intrinsics may also be allowed: // lifetime_start, lifetime_end, invariant_start, invariant_end return true; } |