diff options
Diffstat (limited to 'llvm/lib/Analysis/LoopInfo.cpp')
| -rw-r--r-- | llvm/lib/Analysis/LoopInfo.cpp | 19 | 
1 files changed, 8 insertions, 11 deletions
| diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp index 29c2437ff5ea..693b9ebd450a 100644 --- a/llvm/lib/Analysis/LoopInfo.cpp +++ b/llvm/lib/Analysis/LoopInfo.cpp @@ -425,12 +425,12 @@ bool Loop::isCanonical(ScalarEvolution &SE) const {  // Check that 'BB' doesn't have any uses outside of the 'L'  static bool isBlockInLCSSAForm(const Loop &L, const BasicBlock &BB, -                               const DominatorTree &DT) { +                               const DominatorTree &DT, bool IgnoreTokens) {    for (const Instruction &I : BB) {      // Tokens can't be used in PHI nodes and live-out tokens prevent loop      // optimizations, so for the purposes of considered LCSSA form, we      // can ignore them. -    if (I.getType()->isTokenTy()) +    if (IgnoreTokens && I.getType()->isTokenTy())        continue;      for (const Use &U : I.uses()) { @@ -455,20 +455,20 @@ static bool isBlockInLCSSAForm(const Loop &L, const BasicBlock &BB,    return true;  } -bool Loop::isLCSSAForm(const DominatorTree &DT) const { +bool Loop::isLCSSAForm(const DominatorTree &DT, bool IgnoreTokens) const {    // For each block we check that it doesn't have any uses outside of this loop.    return all_of(this->blocks(), [&](const BasicBlock *BB) { -    return isBlockInLCSSAForm(*this, *BB, DT); +    return isBlockInLCSSAForm(*this, *BB, DT, IgnoreTokens);    });  } -bool Loop::isRecursivelyLCSSAForm(const DominatorTree &DT, -                                  const LoopInfo &LI) const { +bool Loop::isRecursivelyLCSSAForm(const DominatorTree &DT, const LoopInfo &LI, +                                  bool IgnoreTokens) const {    // For each block we check that it doesn't have any uses outside of its    // innermost loop. This process will transitively guarantee that the current    // loop and all of the nested loops are in LCSSA form.    return all_of(this->blocks(), [&](const BasicBlock *BB) { -    return isBlockInLCSSAForm(*LI.getLoopFor(BB), *BB, DT); +    return isBlockInLCSSAForm(*LI.getLoopFor(BB), *BB, DT, IgnoreTokens);    });  } @@ -482,11 +482,8 @@ bool Loop::isLoopSimplifyForm() const {  bool Loop::isSafeToClone() const {    // Return false if any loop blocks contain indirectbrs, or there are any calls    // to noduplicate functions. -  // FIXME: it should be ok to clone CallBrInst's if we correctly update the -  // operand list to reflect the newly cloned labels.    for (BasicBlock *BB : this->blocks()) { -    if (isa<IndirectBrInst>(BB->getTerminator()) || -        isa<CallBrInst>(BB->getTerminator())) +    if (isa<IndirectBrInst>(BB->getTerminator()))        return false;      for (Instruction &I : *BB) | 
