From: John Regehr Date: Wed, 3 Aug 2022 04:22:07 +0000 (-0600) Subject: avoid a bug where we remove a BB and then the next one becomes the X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1116fa476504a0c3a03b779ce3c020f231b0511c;p=platform%2Fupstream%2Fllvm.git avoid a bug where we remove a BB and then the next one becomes the entry block and is illegal due to having more then one predecessor block Differential Revision: https://reviews.llvm.org/D131026 --- diff --git a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp index 520a45c..5d1b3bab 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp @@ -102,6 +102,19 @@ 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()) + return true; + auto F = BB.getParent(); + auto it = F->begin(); + ++it; + return (it == F->end()) || (*it).hasNPredecessors(1); +} + /// 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) { @@ -110,7 +123,7 @@ static void extractBasicBlocksFromModule(Oracle &O, Module &Program) { SmallVector BBsToDelete; for (auto &F : Program) { for (auto &BB : F) { - if (O.shouldKeep()) + if (!okToRemove(BB) || O.shouldKeep()) BBsToKeep.insert(&BB); else { BBsToDelete.push_back(&BB);