diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-02-13 15:58:51 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-02-13 15:58:51 +0000 | 
| commit | a8bcc4d878beb806a2318b70a52668972adfd2ec (patch) | |
| tree | 788dd2f48fde34dee962a966ebc3d94510e29a47 /contrib/llvm/lib/Transforms/Utils | |
| parent | 43a7fce37a5cb0d69e27740f6dd431ff6451fdcf (diff) | |
| parent | a322a4af1fe8b989fe5d1bbc15de8736a26c03ca (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/Transforms/Utils')
| -rw-r--r-- | contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 3125a2c359b6..e484b690597e 100644 --- a/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/contrib/llvm/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  | 
