[llvm] 213c21f - earlier I fixed a bug where the BB removal pass sometimes created

John Regehr via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 4 09:22:11 PDT 2022


Author: John Regehr
Date: 2022-08-04T10:21:20-06:00
New Revision: 213c21fe10bb1bc72efddc5828761f445f16f28c

URL: https://github.com/llvm/llvm-project/commit/213c21fe10bb1bc72efddc5828761f445f16f28c
DIFF: https://github.com/llvm/llvm-project/commit/213c21fe10bb1bc72efddc5828761f445f16f28c.diff

LOG: earlier I fixed a bug where the BB removal pass sometimes created
invalid IR. the fix was incomplete, this one is better and is believed
to be complete

Differential Revision: https://reviews.llvm.org/D131132

Added: 
    llvm/test/tools/llvm-reduce/remove-bbs-illegal2.ll

Modified: 
    llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-reduce/remove-bbs-illegal2.ll b/llvm/test/tools/llvm-reduce/remove-bbs-illegal2.ll
new file mode 100644
index 0000000000000..8a520a9d0fd4a
--- /dev/null
+++ b/llvm/test/tools/llvm-reduce/remove-bbs-illegal2.ll
@@ -0,0 +1,28 @@
+; RUN: llvm-reduce --delta-passes=basic-blocks --test %python --test-arg %p/Inputs/remove-bbs.py -abort-on-invalid-reduction %s -o %t
+
+declare void @0()
+
+define internal void @1(ptr %x0, i1 %x1) {
+interesting0:
+  %x3 = alloca i32, align 4
+  store ptr null, ptr %x0, align 8
+  br label %interesting1
+
+interesting1:                                                ; preds = %x2
+  call void @0()
+  br label %x2
+
+x2:
+  br i1 %x1, label %interesting3, label %interesting4
+
+interesting3:
+  call void @0()
+  br label %x2
+
+interesting4:
+  br label %x5
+
+x5:
+  store i32 0, ptr %x3, align 4
+  ret void
+}

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp
index 5d1b3bab20a1b..f3f844fd2bb12 100644
--- a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp
+++ b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp
@@ -102,35 +102,48 @@ removeUninterestingBBsFromSwitch(SwitchInst &SwInst,
     }
 }
 
-/// A BB is ok to remove if it's not the entry block, or else it is
-/// the entry block but the next block in the function has just one
-/// predecessor -- this property is required because that block is
-/// going to become the new entry block
-static bool okToRemove(BasicBlock &BB) {
-  if (!BB.isEntryBlock())
+/// It's OK to add a block to the set of removed blocks if the first
+/// basic block in the function that survives all of the deletions is
+/// a legal entry block
+static bool okToRemove(BasicBlock &Candidate, Function &F,
+                       const DenseSet<BasicBlock *> &BBsToDelete) {
+  for (auto &B : F) {
+    if (&B == &Candidate)
+      continue;
+    if (BBsToDelete.count(&B))
+      continue;
+    /// Ok we've found the first block that's not going to be deleted,
+    /// it will be the new entry block -- that's only legal if this
+    /// block has no predecessors among blocks that survive the
+    /// deletions
+    for (BasicBlock *Pred : predecessors(&B)) {
+      if (!BBsToDelete.contains(Pred))
+        return false;
+    }
     return true;
-  auto F = BB.getParent();
-  auto it = F->begin();
-  ++it;
-  return (it == F->end()) || (*it).hasNPredecessors(1);
+  }
+  return true;
 }
 
 /// Removes out-of-chunk arguments from functions, and modifies their calls
 /// accordingly. It also removes allocations of out-of-chunk arguments.
 static void extractBasicBlocksFromModule(Oracle &O, Module &Program) {
-  DenseSet<BasicBlock *> BBsToKeep;
+  DenseSet<BasicBlock *> BBsToKeep, BBsToDelete;
 
-  SmallVector<BasicBlock *> BBsToDelete;
   for (auto &F : Program) {
     for (auto &BB : F) {
-      if (!okToRemove(BB) || O.shouldKeep())
+      if (!okToRemove(BB, F, BBsToDelete) || O.shouldKeep())
         BBsToKeep.insert(&BB);
-      else {
-        BBsToDelete.push_back(&BB);
-        // Remove out-of-chunk BB from successor phi nodes
-        for (auto *Succ : successors(&BB))
-          Succ->removePredecessor(&BB);
-      }
+      else
+        BBsToDelete.insert(&BB);
+    }
+  }
+
+  // Remove out-of-chunk BB from successor phi nodes
+  for (auto &F : Program) {
+    for (auto &BB : F) {
+      for (auto *Succ : successors(&BB))
+        Succ->removePredecessor(&BB);
     }
   }
 


        


More information about the llvm-commits mailing list