[NFC] Specialize public API of ICFLoopSafetyInfo for insertions and removals
authorMax Kazantsev <max.kazantsev@azul.com>
Thu, 1 Nov 2018 10:16:06 +0000 (10:16 +0000)
committerMax Kazantsev <max.kazantsev@azul.com>
Thu, 1 Nov 2018 10:16:06 +0000 (10:16 +0000)
llvm-svn: 345822

llvm/include/llvm/Analysis/MustExecute.h
llvm/lib/Analysis/MustExecute.cpp

index 62d9b05..c4005a9 100644 (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) {};
 
index 64ee2a7..7507aeb 100644 (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.