diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-02-26 08:56:04 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-02-26 08:56:04 +0000 |
commit | e91665de394d0241cf90af031d1f0acda4c3f5f8 (patch) | |
tree | a690113bb73ce8ce67e19c90f2b67dd767f01f34 /llvm/lib | |
parent | e75ed92630ea924b7fb301014bfa9324155b174e (diff) | |
download | bcm5719-llvm-e91665de394d0241cf90af031d1f0acda4c3f5f8.tar.gz bcm5719-llvm-e91665de394d0241cf90af031d1f0acda4c3f5f8.zip |
IRCE: only touch loops that have been shown to have a high
backedge-taken count in profiliing data.
llvm-svn: 230619
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp index da4e0fe0fa5..8559e638ac3 100644 --- a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp +++ b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp @@ -82,6 +82,9 @@ static cl::opt<unsigned> LoopSizeCutoff("irce-loop-size-cutoff", cl::Hidden, static cl::opt<bool> PrintChangedLoops("irce-print-changed-loops", cl::Hidden, cl::init(false)); +static cl::opt<int> MaxExitProbReciprocal("irce-max-exit-prob-reciprocal", + cl::Hidden, cl::init(10)); + #define DEBUG_TYPE "irce" namespace { @@ -441,7 +444,9 @@ struct LoopStructure { return Result; } - static Optional<LoopStructure> parseLoopStructure(ScalarEvolution &, Loop &, + static Optional<LoopStructure> parseLoopStructure(ScalarEvolution &, + BranchProbabilityInfo &BPI, + Loop &, const char *&); }; @@ -615,8 +620,8 @@ static bool CanBeSMin(ScalarEvolution &SE, const SCEV *S) { } Optional<LoopStructure> -LoopStructure::parseLoopStructure(ScalarEvolution &SE, Loop &L, - const char *&FailureReason) { +LoopStructure::parseLoopStructure(ScalarEvolution &SE, BranchProbabilityInfo &BPI, + Loop &L, const char *&FailureReason) { assert(L.isLoopSimplifyForm() && "should follow from addRequired<>"); BasicBlock *Latch = L.getLoopLatch(); @@ -640,6 +645,14 @@ LoopStructure::parseLoopStructure(ScalarEvolution &SE, Loop &L, unsigned LatchBrExitIdx = LatchBr->getSuccessor(0) == Header ? 1 : 0; + BranchProbability ExitProbability = + BPI.getEdgeProbability(LatchBr->getParent(), LatchBrExitIdx); + + if (ExitProbability > BranchProbability(1, MaxExitProbReciprocal)) { + FailureReason = "short running loop, not profitable"; + return None; + } + ICmpInst *ICI = dyn_cast<ICmpInst>(LatchBr->getCondition()); if (!ICI || !isa<IntegerType>(ICI->getOperand(0)->getType())) { FailureReason = "latch terminator branch not conditional on integral icmp"; @@ -1340,7 +1353,7 @@ bool InductiveRangeCheckElimination::runOnLoop(Loop *L, LPPassManager &LPM) { const char *FailureReason = nullptr; Optional<LoopStructure> MaybeLoopStructure = - LoopStructure::parseLoopStructure(SE, *L, FailureReason); + LoopStructure::parseLoopStructure(SE, BPI, *L, FailureReason); if (!MaybeLoopStructure.hasValue()) { DEBUG(dbgs() << "irce: could not parse loop structure: " << FailureReason << "\n";); |