diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/MustExecute.cpp | 35 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LICM.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnswitch.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp | 4 | 
5 files changed, 24 insertions, 25 deletions
diff --git a/llvm/lib/Analysis/MustExecute.cpp b/llvm/lib/Analysis/MustExecute.cpp index 8e85366b461..4ec9cde451a 100644 --- a/llvm/lib/Analysis/MustExecute.cpp +++ b/llvm/lib/Analysis/MustExecute.cpp @@ -22,20 +22,20 @@  #include "llvm/Support/raw_ostream.h"  using namespace llvm; -/// Computes loop safety information, checks loop body & header -/// for the possibility of may throw exception. -/// -void llvm::computeLoopSafetyInfo(LoopSafetyInfo *SafetyInfo, Loop *CurLoop) { +bool LoopSafetyInfo::headerMayThrow() const { +  return HeaderMayThrow; +} + +bool LoopSafetyInfo::anyBlockMayThrow() const { +  return MayThrow; +} + +void LoopSafetyInfo::computeLoopSafetyInfo(Loop *CurLoop) {    assert(CurLoop != nullptr && "CurLoop can't be null");    BasicBlock *Header = CurLoop->getHeader(); -  // Setting default safety values. -  SafetyInfo->MayThrow = false; -  SafetyInfo->HeaderMayThrow = false;    // Iterate over header and compute safety info. -  SafetyInfo->HeaderMayThrow = -    !isGuaranteedToTransferExecutionToSuccessor(Header); - -  SafetyInfo->MayThrow = SafetyInfo->HeaderMayThrow; +  HeaderMayThrow = !isGuaranteedToTransferExecutionToSuccessor(Header); +  MayThrow = HeaderMayThrow;    // Iterate over loop instructions and compute safety info.    // Skip header as it has been computed and stored in HeaderMayThrow.    // The first block in loopinfo.Blocks is guaranteed to be the header. @@ -43,9 +43,8 @@ void llvm::computeLoopSafetyInfo(LoopSafetyInfo *SafetyInfo, Loop *CurLoop) {           "First block must be header");    for (Loop::block_iterator BB = std::next(CurLoop->block_begin()),                              BBE = CurLoop->block_end(); -       (BB != BBE) && !SafetyInfo->MayThrow; ++BB) -    SafetyInfo->MayThrow |= -      !isGuaranteedToTransferExecutionToSuccessor(*BB); +       (BB != BBE) && !MayThrow; ++BB) +    MayThrow |= !isGuaranteedToTransferExecutionToSuccessor(*BB);    // Compute funclet colors if we might sink/hoist in a function with a funclet    // personality routine. @@ -53,7 +52,7 @@ void llvm::computeLoopSafetyInfo(LoopSafetyInfo *SafetyInfo, Loop *CurLoop) {    if (Fn->hasPersonalityFn())      if (Constant *PersonalityFn = Fn->getPersonalityFn())        if (isScopedEHPersonality(classifyEHPersonality(PersonalityFn))) -        SafetyInfo->BlockColors = colorEHFunclets(*Fn); +        BlockColors = colorEHFunclets(*Fn);  }  /// Return true if we can prove that the given ExitBlock is not reached on the @@ -116,12 +115,12 @@ bool llvm::isGuaranteedToExecute(const Instruction &Inst,      // Inst unless we can prove that Inst comes before the potential implicit      // exit.  At the moment, we use a (cheap) hack for the common case where      // the instruction of interest is the first one in the block. -    return !SafetyInfo->HeaderMayThrow || +    return !SafetyInfo->headerMayThrow() ||        Inst.getParent()->getFirstNonPHIOrDbg() == &Inst;    // Somewhere in this loop there is an instruction which may throw and make us    // exit the loop. -  if (SafetyInfo->MayThrow) +  if (SafetyInfo->anyBlockMayThrow())      return false;    // Note: There are two styles of reasoning intermixed below for @@ -196,7 +195,7 @@ static bool isMustExecuteIn(const Instruction &I, Loop *L, DominatorTree *DT) {    // result obtained by *either* implementation.  This is a bit unfair since no    // caller actually gets the full power at the moment.    LoopSafetyInfo LSI; -  computeLoopSafetyInfo(&LSI, L); +  LSI.computeLoopSafetyInfo(L);    return isGuaranteedToExecute(I, DT, L, &LSI) ||      isGuaranteedToExecuteForEveryIteration(&I, L);  } diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp index 890c449eb7e..878afe17cc4 100644 --- a/llvm/lib/Transforms/Scalar/LICM.cpp +++ b/llvm/lib/Transforms/Scalar/LICM.cpp @@ -261,7 +261,7 @@ bool LoopInvariantCodeMotion::runOnLoop(    // Compute loop safety information.    LoopSafetyInfo SafetyInfo; -  computeLoopSafetyInfo(&SafetyInfo, L); +  SafetyInfo.computeLoopSafetyInfo(L);    // We want to visit all of the instructions in this loop... that are not parts    // of our subloops (they have already had their invariants hoisted out of @@ -1310,7 +1310,7 @@ bool llvm::promoteLoopAccessesToScalars(    const DataLayout &MDL = Preheader->getModule()->getDataLayout();    bool IsKnownThreadLocalObject = false; -  if (SafetyInfo->MayThrow) { +  if (SafetyInfo->anyBlockMayThrow()) {      // If a loop can throw, we have to insert a store along each unwind edge.      // That said, we can't actually make the unwind edge explicit. Therefore,      // we have to prove that the store is dead along the unwind edge.  We do diff --git a/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp b/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp index 653948717fb..880cbc3db88 100644 --- a/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp +++ b/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp @@ -320,8 +320,8 @@ bool LoopIdiomRecognize::runOnCountableLoop() {    // The following transforms hoist stores/memsets into the loop pre-header.    // Give up if the loop has instructions may throw.    LoopSafetyInfo SafetyInfo; -  computeLoopSafetyInfo(&SafetyInfo, CurLoop); -  if (SafetyInfo.MayThrow) +  SafetyInfo.computeLoopSafetyInfo(CurLoop); +  if (SafetyInfo.anyBlockMayThrow())      return MadeChange;    // Scan all the blocks in the loop that are not in subloops. diff --git a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp index 6aad077ff19..45889bfe20f 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -520,7 +520,7 @@ bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPM_Ref) {    SanitizeMemory = F->hasFnAttribute(Attribute::SanitizeMemory);    if (SanitizeMemory) -    computeLoopSafetyInfo(&SafetyInfo, L); +    SafetyInfo.computeLoopSafetyInfo(L);    bool Changed = false;    do { diff --git a/llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp b/llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp index cc80e11e4ac..1a05bf4775b 100644 --- a/llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp @@ -762,8 +762,8 @@ bool llvm::isSafeToUnrollAndJam(Loop *L, ScalarEvolution &SE, DominatorTree &DT,    // Check the loop safety info for exceptions.    LoopSafetyInfo LSI; -  computeLoopSafetyInfo(&LSI, L); -  if (LSI.MayThrow) { +  LSI.computeLoopSafetyInfo(L); +  if (LSI.anyBlockMayThrow()) {      LLVM_DEBUG(dbgs() << "Won't unroll-and-jam; Something may throw\n");      return false;    }  | 

