[llvm] 3781a46 - Revert "[IPT] Restructure cache to allow lazy update following invalidation [NFC]"

Arthur Eubanks via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 21 10:49:12 PDT 2021


Author: Arthur Eubanks
Date: 2021-10-21T10:48:41-07:00
New Revision: 3781a46c3c70a83b2a5312aa358512578e87b9ca

URL: https://github.com/llvm/llvm-project/commit/3781a46c3c70a83b2a5312aa358512578e87b9ca
DIFF: https://github.com/llvm/llvm-project/commit/3781a46c3c70a83b2a5312aa358512578e87b9ca.diff

LOG: Revert "[IPT] Restructure cache to allow lazy update following invalidation [NFC]"

This reverts commit baea663a6e9bc52f80995d02bb8149934c825612.

Causes crashes, e.g. https://lab.llvm.org/buildbot/#/builders/77/builds/10715.

Added: 
    

Modified: 
    llvm/include/llvm/Analysis/InstructionPrecedenceTracking.h
    llvm/lib/Analysis/InstructionPrecedenceTracking.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Analysis/InstructionPrecedenceTracking.h b/llvm/include/llvm/Analysis/InstructionPrecedenceTracking.h
index cf997f0d2e69a..192630e62a54c 100644
--- a/llvm/include/llvm/Analysis/InstructionPrecedenceTracking.h
+++ b/llvm/include/llvm/Analysis/InstructionPrecedenceTracking.h
@@ -28,13 +28,14 @@ class BasicBlock;
 class Instruction;
 
 class InstructionPrecedenceTracking {
-  // Maps a block to the topmost instruction which *might* be a special
-  // instruction in it. This value is lazily updated on query to point to the
-  // topmost special instruction, but we allow it to point before that for
-  // efficient invalidation.  If the value is nullptr, it means that it is
-  // known that this block does not contain any special instructions.
+  // Maps a block to the topmost special instruction in it. If the value is
+  // nullptr, it means that it is known that this block does not contain any
+  // special instructions.
   DenseMap<const BasicBlock *, const Instruction *> FirstSpecialInsts;
 
+  // Fills information about the given block's special instructions.
+  void fill(const BasicBlock *BB);
+
 #ifndef NDEBUG
   /// Asserts that the cached info for \p BB is up-to-date. This helps to catch
   /// the usage error of accessing a block without properly invalidating after a

diff  --git a/llvm/lib/Analysis/InstructionPrecedenceTracking.cpp b/llvm/lib/Analysis/InstructionPrecedenceTracking.cpp
index 850ccacb67a87..9fee57c54b858 100644
--- a/llvm/lib/Analysis/InstructionPrecedenceTracking.cpp
+++ b/llvm/lib/Analysis/InstructionPrecedenceTracking.cpp
@@ -47,29 +47,11 @@ const Instruction *InstructionPrecedenceTracking::getFirstSpecialInstruction(
     validate(BB);
 #endif
 
-  if (!FirstSpecialInsts.count(BB))
-    // Seed the lazy scan
-    FirstSpecialInsts[BB] = &*BB->begin();
-
-  auto *CurI = FirstSpecialInsts[BB];
-  if (!CurI || isSpecialInstruction(CurI))
-    // We found a cached definite result
-    return CurI;
-
-  // Otherwise, scan forward until we find a definite result, then cache that.
-  auto *Res = [&]() -> const Instruction * {
-    for (auto &I : make_range(CurI->getIterator(), BB->end())) {
-      NumInstScanned++;
-      if (isSpecialInstruction(&I))
-        // Found next special instruction
-        return &I;
-    }
-    // Mark this block as having no special instructions.
-    return nullptr;
-  }();
-
-  FirstSpecialInsts[BB] = Res;
-  return Res;
+  if (FirstSpecialInsts.find(BB) == FirstSpecialInsts.end()) {
+    fill(BB);
+    assert(FirstSpecialInsts.find(BB) != FirstSpecialInsts.end() && "Must be!");
+  }
+  return FirstSpecialInsts[BB];
 }
 
 bool InstructionPrecedenceTracking::hasSpecialInstructions(
@@ -84,6 +66,20 @@ bool InstructionPrecedenceTracking::isPreceededBySpecialInstruction(
   return MaybeFirstSpecial && MaybeFirstSpecial->comesBefore(Insn);
 }
 
+void InstructionPrecedenceTracking::fill(const BasicBlock *BB) {
+  FirstSpecialInsts.erase(BB);
+  for (auto &I : *BB) {
+    NumInstScanned++;
+    if (isSpecialInstruction(&I)) {
+      FirstSpecialInsts[BB] = &I;
+      return;
+    }
+  }
+
+  // Mark this block as having no special instructions.
+  FirstSpecialInsts[BB] = nullptr;
+}
+
 #ifndef NDEBUG
 void InstructionPrecedenceTracking::validate(const BasicBlock *BB) const {
   auto It = FirstSpecialInsts.find(BB);
@@ -91,13 +87,12 @@ void InstructionPrecedenceTracking::validate(const BasicBlock *BB) const {
   if (It == FirstSpecialInsts.end())
     return;
 
-  for (const Instruction &I : *BB) {
-    if (&I == It->second)
-      // No special instruction before cached result
+  for (const Instruction &Insn : *BB)
+    if (isSpecialInstruction(&Insn)) {
+      assert(It->second == &Insn &&
+             "Cached first special instruction is wrong!");
       return;
-    assert(!isSpecialInstruction(&I) &&
-           "Cached first special instruction is wrong!");
-  }
+    }
 
   assert(It->second == nullptr &&
          "Block is marked as having special instructions but in fact it  has "
@@ -120,12 +115,8 @@ void InstructionPrecedenceTracking::insertInstructionTo(const Instruction *Inst,
 void InstructionPrecedenceTracking::removeInstruction(const Instruction *Inst) {
   auto *BB = Inst->getParent();
   assert(BB && "must be called before instruction is actually removed");
-  if (FirstSpecialInsts.count(BB) && FirstSpecialInsts[BB] == Inst) {
-    if (Inst->isTerminator())
-      FirstSpecialInsts[BB] = nullptr;
-    else
-      FirstSpecialInsts[BB] = &*std::next(Inst->getIterator());
-  }
+  if (FirstSpecialInsts.count(BB) && FirstSpecialInsts[BB] == Inst)
+    FirstSpecialInsts.erase(BB);
 }
 
 void InstructionPrecedenceTracking::removeUsersOf(const Instruction *Inst) {


        


More information about the llvm-commits mailing list