[NFC] Specialize public API of ICFLoopSafetyInfo for insertions and removals

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@345822 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Max Kazantsev
2018-11-01 10:16:06 +00:00
parent eae41c39e7
commit 477ccd4e50
2 changed files with 19 additions and 7 deletions
+12 -6
View File
@@ -125,8 +125,9 @@ public:
/// This implementation of LoopSafetyInfo use ImplicitControlFlowTracking to
/// give precise answers on "may throw" queries. This implementation uses cache
/// that should be invalidated by calling the method dropCachedInfo whenever we
/// modify a basic block's contents by adding or removing instructions.
/// that should be invalidated by calling the methods insertInstructionTo and
/// removeInstruction whenever we modify a basic block's contents by adding or
/// removing instructions.
class ICFLoopSafetyInfo: public LoopSafetyInfo {
bool MayThrow = false; // The current loop contains an instruction which
// may throw.
@@ -144,10 +145,15 @@ public:
const DominatorTree *DT,
const Loop *CurLoop) const;
/// Drops cached information regarding the implicit control flow in block
/// \p BB. It should be called for every block in which we add or remove any
/// instructions to a block before we make queries to it.
void dropCachedInfo(const BasicBlock *BB);
/// Inform the safety info that we are planning to insert a new instruction
/// into the basic block \p BB. It will make all cache updates to keep it
/// correct after this insertion.
void insertInstructionTo(const BasicBlock *BB);
/// Inform safety info that we are planning to remove the instruction \p Inst
/// from its block. It will make all cache updates to keep it correct after
/// this removal.
void removeInstruction(const Instruction *Inst);
ICFLoopSafetyInfo(DominatorTree *DT) : LoopSafetyInfo(), ICF(DT) {};
+7 -1
View File
@@ -82,10 +82,16 @@ void ICFLoopSafetyInfo::computeLoopSafetyInfo(const Loop *CurLoop) {
computeBlockColors(CurLoop);
}
void ICFLoopSafetyInfo::dropCachedInfo(const BasicBlock *BB) {
void ICFLoopSafetyInfo::insertInstructionTo(const BasicBlock *BB) {
ICF.invalidateBlock(BB);
}
void ICFLoopSafetyInfo::removeInstruction(const Instruction *Inst) {
// TODO: So far we just conservatively drop cache, but maybe we can not do it
// when Inst is not an ICF instruction. Follow-up on that.
ICF.invalidateBlock(Inst->getParent());
}
void LoopSafetyInfo::computeBlockColors(const Loop *CurLoop) {
// Compute funclet colors if we might sink/hoist in a function with a funclet
// personality routine.