mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-04 11:17:31 +00:00
Move llvm::computeLoopSafetyInfo from LICM.cpp to LoopUtils.cpp. NFC
Move computeLoopSafetyInfo, defined in Transforms/Utils/LoopUtils.h, into the corresponding LoopUtils.cpp, as opposed to LICM where it resides at the moment. This will allow other functions from Transforms/Utils to reference it. llvm-svn: 325151
This commit is contained in:
parent
0d2a33eaff
commit
ad8913af27
@ -503,43 +503,6 @@ bool llvm::hoistRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI,
|
||||
return Changed;
|
||||
}
|
||||
|
||||
/// Computes loop safety information, checks loop body & header
|
||||
/// for the possibility of may throw exception.
|
||||
///
|
||||
void llvm::computeLoopSafetyInfo(LoopSafetyInfo *SafetyInfo, Loop *CurLoop) {
|
||||
assert(CurLoop != nullptr && "CurLoop cant be null");
|
||||
BasicBlock *Header = CurLoop->getHeader();
|
||||
// Setting default safety values.
|
||||
SafetyInfo->MayThrow = false;
|
||||
SafetyInfo->HeaderMayThrow = false;
|
||||
// Iterate over header and compute safety info.
|
||||
for (BasicBlock::iterator I = Header->begin(), E = Header->end();
|
||||
(I != E) && !SafetyInfo->HeaderMayThrow; ++I)
|
||||
SafetyInfo->HeaderMayThrow |=
|
||||
!isGuaranteedToTransferExecutionToSuccessor(&*I);
|
||||
|
||||
SafetyInfo->MayThrow = SafetyInfo->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.
|
||||
assert(Header == *CurLoop->getBlocks().begin() &&
|
||||
"First block must be header");
|
||||
for (Loop::block_iterator BB = std::next(CurLoop->block_begin()),
|
||||
BBE = CurLoop->block_end();
|
||||
(BB != BBE) && !SafetyInfo->MayThrow; ++BB)
|
||||
for (BasicBlock::iterator I = (*BB)->begin(), E = (*BB)->end();
|
||||
(I != E) && !SafetyInfo->MayThrow; ++I)
|
||||
SafetyInfo->MayThrow |= !isGuaranteedToTransferExecutionToSuccessor(&*I);
|
||||
|
||||
// Compute funclet colors if we might sink/hoist in a function with a funclet
|
||||
// personality routine.
|
||||
Function *Fn = CurLoop->getHeader()->getParent();
|
||||
if (Fn->hasPersonalityFn())
|
||||
if (Constant *PersonalityFn = Fn->getPersonalityFn())
|
||||
if (isFuncletEHPersonality(classifyEHPersonality(PersonalityFn)))
|
||||
SafetyInfo->BlockColors = colorEHFunclets(*Fn);
|
||||
}
|
||||
|
||||
// Return true if LI is invariant within scope of the loop. LI is invariant if
|
||||
// CurLoop is dominated by an invariant.start representing the same memory
|
||||
// location and size as the memory location LI loads from, and also the
|
||||
|
@ -1481,6 +1481,43 @@ void llvm::deleteDeadLoop(Loop *L, DominatorTree *DT = nullptr,
|
||||
}
|
||||
}
|
||||
|
||||
/// Computes loop safety information, checks loop body & header
|
||||
/// for the possibility of may throw exception.
|
||||
///
|
||||
void llvm::computeLoopSafetyInfo(LoopSafetyInfo *SafetyInfo, Loop *CurLoop) {
|
||||
assert(CurLoop != nullptr && "CurLoop cant be null");
|
||||
BasicBlock *Header = CurLoop->getHeader();
|
||||
// Setting default safety values.
|
||||
SafetyInfo->MayThrow = false;
|
||||
SafetyInfo->HeaderMayThrow = false;
|
||||
// Iterate over header and compute safety info.
|
||||
for (BasicBlock::iterator I = Header->begin(), E = Header->end();
|
||||
(I != E) && !SafetyInfo->HeaderMayThrow; ++I)
|
||||
SafetyInfo->HeaderMayThrow |=
|
||||
!isGuaranteedToTransferExecutionToSuccessor(&*I);
|
||||
|
||||
SafetyInfo->MayThrow = SafetyInfo->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.
|
||||
assert(Header == *CurLoop->getBlocks().begin() &&
|
||||
"First block must be header");
|
||||
for (Loop::block_iterator BB = std::next(CurLoop->block_begin()),
|
||||
BBE = CurLoop->block_end();
|
||||
(BB != BBE) && !SafetyInfo->MayThrow; ++BB)
|
||||
for (BasicBlock::iterator I = (*BB)->begin(), E = (*BB)->end();
|
||||
(I != E) && !SafetyInfo->MayThrow; ++I)
|
||||
SafetyInfo->MayThrow |= !isGuaranteedToTransferExecutionToSuccessor(&*I);
|
||||
|
||||
// Compute funclet colors if we might sink/hoist in a function with a funclet
|
||||
// personality routine.
|
||||
Function *Fn = CurLoop->getHeader()->getParent();
|
||||
if (Fn->hasPersonalityFn())
|
||||
if (Constant *PersonalityFn = Fn->getPersonalityFn())
|
||||
if (isFuncletEHPersonality(classifyEHPersonality(PersonalityFn)))
|
||||
SafetyInfo->BlockColors = colorEHFunclets(*Fn);
|
||||
}
|
||||
|
||||
/// Returns true if the instruction in a loop is guaranteed to execute at least
|
||||
/// once.
|
||||
bool llvm::isGuaranteedToExecute(const Instruction &Inst,
|
||||
|
Loading…
x
Reference in New Issue
Block a user