diff options
author | dim <dim@FreeBSD.org> | 2016-02-13 14:57:10 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2016-02-13 14:57:10 +0000 |
commit | 97a7b8a20a989eb4cf3d9465e1451de6cd05fa41 (patch) | |
tree | 0daaa3c98a8029d259c5918dfa1c13c9d4fe7971 /lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 44c4732640f764c943d7814138396141c0f4646b (diff) | |
download | FreeBSD-src-97a7b8a20a989eb4cf3d9465e1451de6cd05fa41.zip FreeBSD-src-97a7b8a20a989eb4cf3d9465e1451de6cd05fa41.tar.gz |
Vendor import of llvm release_38 branch r260756:
https://llvm.org/svn/llvm-project/llvm/branches/release_38@260756
Diffstat (limited to 'lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | lib/Transforms/Utils/SimplifyCFG.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 3125a2c..e484b69 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -90,6 +90,11 @@ static cl::opt<bool> SpeculateOneExpensiveInst( cl::desc("Allow exactly one expensive instruction to be speculatively " "executed")); +static cl::opt<unsigned> MaxSpeculationDepth( + "max-speculation-depth", cl::Hidden, cl::init(10), + cl::desc("Limit maximum recursion depth when calculating costs of " + "speculatively executed instructions")); + STATISTIC(NumBitMaps, "Number of switch instructions turned into bitmaps"); STATISTIC(NumLinearMaps, "Number of switch instructions turned into linear mapping"); STATISTIC(NumLookupTables, "Number of switch instructions turned into lookup tables"); @@ -269,6 +274,13 @@ static bool DominatesMergePoint(Value *V, BasicBlock *BB, unsigned &CostRemaining, const TargetTransformInfo &TTI, unsigned Depth = 0) { + // It is possible to hit a zero-cost cycle (phi/gep instructions for example), + // so limit the recursion depth. + // TODO: While this recursion limit does prevent pathological behavior, it + // would be better to track visited instructions to avoid cycles. + if (Depth == MaxSpeculationDepth) + return false; + Instruction *I = dyn_cast<Instruction>(V); if (!I) { // Non-instructions all dominate instructions, but not all constantexprs |