From c45f765c0d41ad94b857ee4b7e007d58b41ed650 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Wed, 30 Dec 2020 20:48:40 +0300 Subject: [PATCH] [SimplifyCFG] Teach SimplifyBranchOnICmpChain() to preserve DomTree --- llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 11 ++++++++++- llvm/test/Transforms/SimplifyCFG/switch_msan.ll | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 5b60faee751a..c730c1427ec8 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -4101,12 +4101,16 @@ bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI, << " cases into SWITCH. BB is:\n" << *BB); + SmallVector Updates; + // If there are any extra values that couldn't be folded into the switch // then we evaluate them with an explicit branch first. Split the block // right before the condbr to handle it. if (ExtraCase) { BasicBlock *NewBB = - BB->splitBasicBlock(BI->getIterator(), "switch.early.test"); + SplitBlock(BB, BI, DTU ? &DTU->getDomTree() : nullptr, /*LI=*/nullptr, + /*MSSAU=*/nullptr, "switch.early.test"); + // Remove the uncond branch added to the old block. Instruction *OldTI = BB->getTerminator(); Builder.SetInsertPoint(OldTI); @@ -4118,6 +4122,8 @@ bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI, OldTI->eraseFromParent(); + Updates.push_back({DominatorTree::Insert, BB, EdgeBB}); + // If there are PHI nodes in EdgeBB, then we need to add a new entry to them // for the edge we just added. AddPredecessorToBlock(EdgeBB, BB, NewBB); @@ -4144,6 +4150,7 @@ bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI, // We added edges from PI to the EdgeBB. As such, if there were any // PHI nodes in EdgeBB, they need entries to be added corresponding to // the number of edges added. + Updates.push_back({DominatorTree::Insert, BB, EdgeBB}); for (BasicBlock::iterator BBI = EdgeBB->begin(); isa(BBI); ++BBI) { PHINode *PN = cast(BBI); Value *InVal = PN->getIncomingValueForBlock(BB); @@ -4153,6 +4160,8 @@ bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI, // Erase the old branch instruction. EraseTerminatorAndDCECond(BI); + if (DTU) + DTU->applyUpdatesPermissive(Updates); LLVM_DEBUG(dbgs() << " ** 'icmp' chain result is:\n" << *BB << '\n'); return true; diff --git a/llvm/test/Transforms/SimplifyCFG/switch_msan.ll b/llvm/test/Transforms/SimplifyCFG/switch_msan.ll index 96e798289772..a59515ed463a 100644 --- a/llvm/test/Transforms/SimplifyCFG/switch_msan.ll +++ b/llvm/test/Transforms/SimplifyCFG/switch_msan.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -simplifycfg < %s | FileCheck %s +; RUN: opt -S -simplifycfg -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s declare i8 @next_char();