diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp | 38 | 
1 files changed, 33 insertions, 5 deletions
| diff --git a/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp b/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp index 66e45ec..e84ca81 100644 --- a/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp @@ -122,16 +122,22 @@ static cl::opt<unsigned>                    cl::desc("Maximum cost accepted for the transformation"),                    cl::Hidden, cl::init(50)); -extern cl::opt<bool> ProfcheckDisableMetadataFixes; - -} // namespace llvm -  static cl::opt<double> MaxClonedRate(      "dfa-max-cloned-rate",      cl::desc(          "Maximum cloned instructions rate accepted for the transformation"),      cl::Hidden, cl::init(7.5)); +static cl::opt<unsigned> +    MaxOuterUseBlocks("dfa-max-out-use-blocks", +                      cl::desc("Maximum unduplicated blocks with outer uses " +                               "accepted for the transformation"), +                      cl::Hidden, cl::init(40)); + +extern cl::opt<bool> ProfcheckDisableMetadataFixes; + +} // namespace llvm +  namespace {  class SelectInstToUnfold {    SelectInst *SI; @@ -965,8 +971,16 @@ private:      // SLPVectorizer.      // TODO: Thread the switch partially before reaching the threshold.      uint64_t NumOrigInst = 0; -    for (auto *BB : DuplicateMap.keys()) +    uint64_t NumOuterUseBlock = 0; +    for (auto *BB : DuplicateMap.keys()) {        NumOrigInst += BB->sizeWithoutDebug(); +      // Only unduplicated blocks with single predecessor require new phi +      // nodes. +      for (auto *Succ : successors(BB)) +        if (!DuplicateMap.count(Succ) && Succ->getSinglePredecessor()) +          NumOuterUseBlock++; +    } +      if (double(NumClonedInst) / double(NumOrigInst) > MaxClonedRate) {        LLVM_DEBUG(dbgs() << "DFA Jump Threading: Not jump threading, too much "                             "instructions wll be cloned\n"); @@ -977,6 +991,20 @@ private:        return false;      } +    // Too much unduplicated blocks with outer uses may cause too much +    // insertions of phi nodes for duplicated definitions. TODO: Drop this +    // threshold if we come up with another way to reduce the number of inserted +    // phi nodes. +    if (NumOuterUseBlock > MaxOuterUseBlocks) { +      LLVM_DEBUG(dbgs() << "DFA Jump Threading: Not jump threading, too much " +                           "blocks with outer uses\n"); +      ORE->emit([&]() { +        return OptimizationRemarkMissed(DEBUG_TYPE, "NotProfitable", Switch) +               << "Too much blocks with outer uses."; +      }); +      return false; +    } +      InstructionCost DuplicationCost = 0;      unsigned JumpTableSize = 0; | 
