109467b48Spatrick //===- BasicBlockUtils.cpp - BasicBlock Utilities --------------------------==// 209467b48Spatrick // 309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 609467b48Spatrick // 709467b48Spatrick //===----------------------------------------------------------------------===// 809467b48Spatrick // 909467b48Spatrick // This family of functions perform manipulations on basic blocks, and 1009467b48Spatrick // instructions contained within basic blocks. 1109467b48Spatrick // 1209467b48Spatrick //===----------------------------------------------------------------------===// 1309467b48Spatrick 1409467b48Spatrick #include "llvm/Transforms/Utils/BasicBlockUtils.h" 1509467b48Spatrick #include "llvm/ADT/ArrayRef.h" 1609467b48Spatrick #include "llvm/ADT/SmallPtrSet.h" 1709467b48Spatrick #include "llvm/ADT/SmallVector.h" 1809467b48Spatrick #include "llvm/ADT/Twine.h" 1909467b48Spatrick #include "llvm/Analysis/CFG.h" 2009467b48Spatrick #include "llvm/Analysis/DomTreeUpdater.h" 2109467b48Spatrick #include "llvm/Analysis/LoopInfo.h" 2209467b48Spatrick #include "llvm/Analysis/MemoryDependenceAnalysis.h" 2309467b48Spatrick #include "llvm/Analysis/MemorySSAUpdater.h" 2409467b48Spatrick #include "llvm/Analysis/PostDominators.h" 2509467b48Spatrick #include "llvm/IR/BasicBlock.h" 2609467b48Spatrick #include "llvm/IR/CFG.h" 2709467b48Spatrick #include "llvm/IR/Constants.h" 2809467b48Spatrick #include "llvm/IR/DebugInfoMetadata.h" 2909467b48Spatrick #include "llvm/IR/Dominators.h" 3009467b48Spatrick #include "llvm/IR/Function.h" 3109467b48Spatrick #include "llvm/IR/InstrTypes.h" 3209467b48Spatrick #include "llvm/IR/Instruction.h" 3309467b48Spatrick #include "llvm/IR/Instructions.h" 3409467b48Spatrick #include "llvm/IR/IntrinsicInst.h" 3509467b48Spatrick #include "llvm/IR/LLVMContext.h" 3609467b48Spatrick #include "llvm/IR/Type.h" 3709467b48Spatrick #include "llvm/IR/User.h" 3809467b48Spatrick #include "llvm/IR/Value.h" 3909467b48Spatrick #include "llvm/IR/ValueHandle.h" 4009467b48Spatrick #include "llvm/Support/Casting.h" 4109467b48Spatrick #include "llvm/Support/Debug.h" 4209467b48Spatrick #include "llvm/Support/raw_ostream.h" 4309467b48Spatrick #include "llvm/Transforms/Utils/Local.h" 4409467b48Spatrick #include <cassert> 4509467b48Spatrick #include <cstdint> 4609467b48Spatrick #include <string> 4709467b48Spatrick #include <utility> 4809467b48Spatrick #include <vector> 4909467b48Spatrick 5009467b48Spatrick using namespace llvm; 5109467b48Spatrick 5209467b48Spatrick #define DEBUG_TYPE "basicblock-utils" 5309467b48Spatrick 5409467b48Spatrick void llvm::DetatchDeadBlocks( 5509467b48Spatrick ArrayRef<BasicBlock *> BBs, 5609467b48Spatrick SmallVectorImpl<DominatorTree::UpdateType> *Updates, 5709467b48Spatrick bool KeepOneInputPHIs) { 5809467b48Spatrick for (auto *BB : BBs) { 5909467b48Spatrick // Loop through all of our successors and make sure they know that one 6009467b48Spatrick // of their predecessors is going away. 6109467b48Spatrick SmallPtrSet<BasicBlock *, 4> UniqueSuccessors; 6209467b48Spatrick for (BasicBlock *Succ : successors(BB)) { 6309467b48Spatrick Succ->removePredecessor(BB, KeepOneInputPHIs); 6409467b48Spatrick if (Updates && UniqueSuccessors.insert(Succ).second) 6509467b48Spatrick Updates->push_back({DominatorTree::Delete, BB, Succ}); 6609467b48Spatrick } 6709467b48Spatrick 6809467b48Spatrick // Zap all the instructions in the block. 6909467b48Spatrick while (!BB->empty()) { 7009467b48Spatrick Instruction &I = BB->back(); 7109467b48Spatrick // If this instruction is used, replace uses with an arbitrary value. 7209467b48Spatrick // Because control flow can't get here, we don't care what we replace the 7309467b48Spatrick // value with. Note that since this block is unreachable, and all values 7409467b48Spatrick // contained within it must dominate their uses, that all uses will 7509467b48Spatrick // eventually be removed (they are themselves dead). 7609467b48Spatrick if (!I.use_empty()) 7709467b48Spatrick I.replaceAllUsesWith(UndefValue::get(I.getType())); 7809467b48Spatrick BB->getInstList().pop_back(); 7909467b48Spatrick } 8009467b48Spatrick new UnreachableInst(BB->getContext(), BB); 8109467b48Spatrick assert(BB->getInstList().size() == 1 && 8209467b48Spatrick isa<UnreachableInst>(BB->getTerminator()) && 8309467b48Spatrick "The successor list of BB isn't empty before " 8409467b48Spatrick "applying corresponding DTU updates."); 8509467b48Spatrick } 8609467b48Spatrick } 8709467b48Spatrick 8809467b48Spatrick void llvm::DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU, 8909467b48Spatrick bool KeepOneInputPHIs) { 9009467b48Spatrick DeleteDeadBlocks({BB}, DTU, KeepOneInputPHIs); 9109467b48Spatrick } 9209467b48Spatrick 9309467b48Spatrick void llvm::DeleteDeadBlocks(ArrayRef <BasicBlock *> BBs, DomTreeUpdater *DTU, 9409467b48Spatrick bool KeepOneInputPHIs) { 9509467b48Spatrick #ifndef NDEBUG 9609467b48Spatrick // Make sure that all predecessors of each dead block is also dead. 9709467b48Spatrick SmallPtrSet<BasicBlock *, 4> Dead(BBs.begin(), BBs.end()); 9809467b48Spatrick assert(Dead.size() == BBs.size() && "Duplicating blocks?"); 9909467b48Spatrick for (auto *BB : Dead) 10009467b48Spatrick for (BasicBlock *Pred : predecessors(BB)) 10109467b48Spatrick assert(Dead.count(Pred) && "All predecessors must be dead!"); 10209467b48Spatrick #endif 10309467b48Spatrick 10409467b48Spatrick SmallVector<DominatorTree::UpdateType, 4> Updates; 10509467b48Spatrick DetatchDeadBlocks(BBs, DTU ? &Updates : nullptr, KeepOneInputPHIs); 10609467b48Spatrick 10709467b48Spatrick if (DTU) 10809467b48Spatrick DTU->applyUpdatesPermissive(Updates); 10909467b48Spatrick 11009467b48Spatrick for (BasicBlock *BB : BBs) 11109467b48Spatrick if (DTU) 11209467b48Spatrick DTU->deleteBB(BB); 11309467b48Spatrick else 11409467b48Spatrick BB->eraseFromParent(); 11509467b48Spatrick } 11609467b48Spatrick 11709467b48Spatrick bool llvm::EliminateUnreachableBlocks(Function &F, DomTreeUpdater *DTU, 11809467b48Spatrick bool KeepOneInputPHIs) { 11909467b48Spatrick df_iterator_default_set<BasicBlock*> Reachable; 12009467b48Spatrick 12109467b48Spatrick // Mark all reachable blocks. 12209467b48Spatrick for (BasicBlock *BB : depth_first_ext(&F, Reachable)) 12309467b48Spatrick (void)BB/* Mark all reachable blocks */; 12409467b48Spatrick 12509467b48Spatrick // Collect all dead blocks. 12609467b48Spatrick std::vector<BasicBlock*> DeadBlocks; 12709467b48Spatrick for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 12809467b48Spatrick if (!Reachable.count(&*I)) { 12909467b48Spatrick BasicBlock *BB = &*I; 13009467b48Spatrick DeadBlocks.push_back(BB); 13109467b48Spatrick } 13209467b48Spatrick 13309467b48Spatrick // Delete the dead blocks. 13409467b48Spatrick DeleteDeadBlocks(DeadBlocks, DTU, KeepOneInputPHIs); 13509467b48Spatrick 13609467b48Spatrick return !DeadBlocks.empty(); 13709467b48Spatrick } 13809467b48Spatrick 13909467b48Spatrick void llvm::FoldSingleEntryPHINodes(BasicBlock *BB, 14009467b48Spatrick MemoryDependenceResults *MemDep) { 14109467b48Spatrick if (!isa<PHINode>(BB->begin())) return; 14209467b48Spatrick 14309467b48Spatrick while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) { 14409467b48Spatrick if (PN->getIncomingValue(0) != PN) 14509467b48Spatrick PN->replaceAllUsesWith(PN->getIncomingValue(0)); 14609467b48Spatrick else 14709467b48Spatrick PN->replaceAllUsesWith(UndefValue::get(PN->getType())); 14809467b48Spatrick 14909467b48Spatrick if (MemDep) 15009467b48Spatrick MemDep->removeInstruction(PN); // Memdep updates AA itself. 15109467b48Spatrick 15209467b48Spatrick PN->eraseFromParent(); 15309467b48Spatrick } 15409467b48Spatrick } 15509467b48Spatrick 156*097a140dSpatrick bool llvm::DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI, 157*097a140dSpatrick MemorySSAUpdater *MSSAU) { 15809467b48Spatrick // Recursively deleting a PHI may cause multiple PHIs to be deleted 15909467b48Spatrick // or RAUW'd undef, so use an array of WeakTrackingVH for the PHIs to delete. 16009467b48Spatrick SmallVector<WeakTrackingVH, 8> PHIs; 16109467b48Spatrick for (PHINode &PN : BB->phis()) 16209467b48Spatrick PHIs.push_back(&PN); 16309467b48Spatrick 16409467b48Spatrick bool Changed = false; 16509467b48Spatrick for (unsigned i = 0, e = PHIs.size(); i != e; ++i) 16609467b48Spatrick if (PHINode *PN = dyn_cast_or_null<PHINode>(PHIs[i].operator Value*())) 167*097a140dSpatrick Changed |= RecursivelyDeleteDeadPHINode(PN, TLI, MSSAU); 16809467b48Spatrick 16909467b48Spatrick return Changed; 17009467b48Spatrick } 17109467b48Spatrick 17209467b48Spatrick bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU, 17309467b48Spatrick LoopInfo *LI, MemorySSAUpdater *MSSAU, 17409467b48Spatrick MemoryDependenceResults *MemDep, 17509467b48Spatrick bool PredecessorWithTwoSuccessors) { 17609467b48Spatrick if (BB->hasAddressTaken()) 17709467b48Spatrick return false; 17809467b48Spatrick 17909467b48Spatrick // Can't merge if there are multiple predecessors, or no predecessors. 18009467b48Spatrick BasicBlock *PredBB = BB->getUniquePredecessor(); 18109467b48Spatrick if (!PredBB) return false; 18209467b48Spatrick 18309467b48Spatrick // Don't break self-loops. 18409467b48Spatrick if (PredBB == BB) return false; 18509467b48Spatrick // Don't break unwinding instructions. 18609467b48Spatrick if (PredBB->getTerminator()->isExceptionalTerminator()) 18709467b48Spatrick return false; 18809467b48Spatrick 18909467b48Spatrick // Can't merge if there are multiple distinct successors. 19009467b48Spatrick if (!PredecessorWithTwoSuccessors && PredBB->getUniqueSuccessor() != BB) 19109467b48Spatrick return false; 19209467b48Spatrick 19309467b48Spatrick // Currently only allow PredBB to have two predecessors, one being BB. 19409467b48Spatrick // Update BI to branch to BB's only successor instead of BB. 19509467b48Spatrick BranchInst *PredBB_BI; 19609467b48Spatrick BasicBlock *NewSucc = nullptr; 19709467b48Spatrick unsigned FallThruPath; 19809467b48Spatrick if (PredecessorWithTwoSuccessors) { 19909467b48Spatrick if (!(PredBB_BI = dyn_cast<BranchInst>(PredBB->getTerminator()))) 20009467b48Spatrick return false; 20109467b48Spatrick BranchInst *BB_JmpI = dyn_cast<BranchInst>(BB->getTerminator()); 20209467b48Spatrick if (!BB_JmpI || !BB_JmpI->isUnconditional()) 20309467b48Spatrick return false; 20409467b48Spatrick NewSucc = BB_JmpI->getSuccessor(0); 20509467b48Spatrick FallThruPath = PredBB_BI->getSuccessor(0) == BB ? 0 : 1; 20609467b48Spatrick } 20709467b48Spatrick 20809467b48Spatrick // Can't merge if there is PHI loop. 20909467b48Spatrick for (PHINode &PN : BB->phis()) 21009467b48Spatrick for (Value *IncValue : PN.incoming_values()) 21109467b48Spatrick if (IncValue == &PN) 21209467b48Spatrick return false; 21309467b48Spatrick 21409467b48Spatrick LLVM_DEBUG(dbgs() << "Merging: " << BB->getName() << " into " 21509467b48Spatrick << PredBB->getName() << "\n"); 21609467b48Spatrick 21709467b48Spatrick // Begin by getting rid of unneeded PHIs. 21809467b48Spatrick SmallVector<AssertingVH<Value>, 4> IncomingValues; 21909467b48Spatrick if (isa<PHINode>(BB->front())) { 22009467b48Spatrick for (PHINode &PN : BB->phis()) 22109467b48Spatrick if (!isa<PHINode>(PN.getIncomingValue(0)) || 22209467b48Spatrick cast<PHINode>(PN.getIncomingValue(0))->getParent() != BB) 22309467b48Spatrick IncomingValues.push_back(PN.getIncomingValue(0)); 22409467b48Spatrick FoldSingleEntryPHINodes(BB, MemDep); 22509467b48Spatrick } 22609467b48Spatrick 22709467b48Spatrick // DTU update: Collect all the edges that exit BB. 22809467b48Spatrick // These dominator edges will be redirected from Pred. 22909467b48Spatrick std::vector<DominatorTree::UpdateType> Updates; 23009467b48Spatrick if (DTU) { 23109467b48Spatrick Updates.reserve(1 + (2 * succ_size(BB))); 23209467b48Spatrick // Add insert edges first. Experimentally, for the particular case of two 23309467b48Spatrick // blocks that can be merged, with a single successor and single predecessor 23409467b48Spatrick // respectively, it is beneficial to have all insert updates first. Deleting 23509467b48Spatrick // edges first may lead to unreachable blocks, followed by inserting edges 23609467b48Spatrick // making the blocks reachable again. Such DT updates lead to high compile 23709467b48Spatrick // times. We add inserts before deletes here to reduce compile time. 23809467b48Spatrick for (auto I = succ_begin(BB), E = succ_end(BB); I != E; ++I) 23909467b48Spatrick // This successor of BB may already have PredBB as a predecessor. 24009467b48Spatrick if (llvm::find(successors(PredBB), *I) == succ_end(PredBB)) 24109467b48Spatrick Updates.push_back({DominatorTree::Insert, PredBB, *I}); 24209467b48Spatrick for (auto I = succ_begin(BB), E = succ_end(BB); I != E; ++I) 24309467b48Spatrick Updates.push_back({DominatorTree::Delete, BB, *I}); 24409467b48Spatrick Updates.push_back({DominatorTree::Delete, PredBB, BB}); 24509467b48Spatrick } 24609467b48Spatrick 24709467b48Spatrick Instruction *PTI = PredBB->getTerminator(); 24809467b48Spatrick Instruction *STI = BB->getTerminator(); 24909467b48Spatrick Instruction *Start = &*BB->begin(); 25009467b48Spatrick // If there's nothing to move, mark the starting instruction as the last 25109467b48Spatrick // instruction in the block. Terminator instruction is handled separately. 25209467b48Spatrick if (Start == STI) 25309467b48Spatrick Start = PTI; 25409467b48Spatrick 25509467b48Spatrick // Move all definitions in the successor to the predecessor... 25609467b48Spatrick PredBB->getInstList().splice(PTI->getIterator(), BB->getInstList(), 25709467b48Spatrick BB->begin(), STI->getIterator()); 25809467b48Spatrick 25909467b48Spatrick if (MSSAU) 26009467b48Spatrick MSSAU->moveAllAfterMergeBlocks(BB, PredBB, Start); 26109467b48Spatrick 26209467b48Spatrick // Make all PHI nodes that referred to BB now refer to Pred as their 26309467b48Spatrick // source... 26409467b48Spatrick BB->replaceAllUsesWith(PredBB); 26509467b48Spatrick 26609467b48Spatrick if (PredecessorWithTwoSuccessors) { 26709467b48Spatrick // Delete the unconditional branch from BB. 26809467b48Spatrick BB->getInstList().pop_back(); 26909467b48Spatrick 27009467b48Spatrick // Update branch in the predecessor. 27109467b48Spatrick PredBB_BI->setSuccessor(FallThruPath, NewSucc); 27209467b48Spatrick } else { 27309467b48Spatrick // Delete the unconditional branch from the predecessor. 27409467b48Spatrick PredBB->getInstList().pop_back(); 27509467b48Spatrick 27609467b48Spatrick // Move terminator instruction. 27709467b48Spatrick PredBB->getInstList().splice(PredBB->end(), BB->getInstList()); 27809467b48Spatrick 27909467b48Spatrick // Terminator may be a memory accessing instruction too. 28009467b48Spatrick if (MSSAU) 28109467b48Spatrick if (MemoryUseOrDef *MUD = cast_or_null<MemoryUseOrDef>( 28209467b48Spatrick MSSAU->getMemorySSA()->getMemoryAccess(PredBB->getTerminator()))) 28309467b48Spatrick MSSAU->moveToPlace(MUD, PredBB, MemorySSA::End); 28409467b48Spatrick } 28509467b48Spatrick // Add unreachable to now empty BB. 28609467b48Spatrick new UnreachableInst(BB->getContext(), BB); 28709467b48Spatrick 28809467b48Spatrick // Eliminate duplicate/redundant dbg.values. This seems to be a good place to 28909467b48Spatrick // do that since we might end up with redundant dbg.values describing the 29009467b48Spatrick // entry PHI node post-splice. 29109467b48Spatrick RemoveRedundantDbgInstrs(PredBB); 29209467b48Spatrick 29309467b48Spatrick // Inherit predecessors name if it exists. 29409467b48Spatrick if (!PredBB->hasName()) 29509467b48Spatrick PredBB->takeName(BB); 29609467b48Spatrick 29709467b48Spatrick if (LI) 29809467b48Spatrick LI->removeBlock(BB); 29909467b48Spatrick 30009467b48Spatrick if (MemDep) 30109467b48Spatrick MemDep->invalidateCachedPredecessors(); 30209467b48Spatrick 30309467b48Spatrick // Finally, erase the old block and update dominator info. 30409467b48Spatrick if (DTU) { 30509467b48Spatrick assert(BB->getInstList().size() == 1 && 30609467b48Spatrick isa<UnreachableInst>(BB->getTerminator()) && 30709467b48Spatrick "The successor list of BB isn't empty before " 30809467b48Spatrick "applying corresponding DTU updates."); 30909467b48Spatrick DTU->applyUpdatesPermissive(Updates); 31009467b48Spatrick DTU->deleteBB(BB); 31109467b48Spatrick } else { 31209467b48Spatrick BB->eraseFromParent(); // Nuke BB if DTU is nullptr. 31309467b48Spatrick } 31409467b48Spatrick 31509467b48Spatrick return true; 31609467b48Spatrick } 31709467b48Spatrick 318*097a140dSpatrick bool llvm::MergeBlockSuccessorsIntoGivenBlocks( 319*097a140dSpatrick SmallPtrSetImpl<BasicBlock *> &MergeBlocks, Loop *L, DomTreeUpdater *DTU, 320*097a140dSpatrick LoopInfo *LI) { 321*097a140dSpatrick assert(!MergeBlocks.empty() && "MergeBlocks should not be empty"); 322*097a140dSpatrick 323*097a140dSpatrick bool BlocksHaveBeenMerged = false; 324*097a140dSpatrick while (!MergeBlocks.empty()) { 325*097a140dSpatrick BasicBlock *BB = *MergeBlocks.begin(); 326*097a140dSpatrick BasicBlock *Dest = BB->getSingleSuccessor(); 327*097a140dSpatrick if (Dest && (!L || L->contains(Dest))) { 328*097a140dSpatrick BasicBlock *Fold = Dest->getUniquePredecessor(); 329*097a140dSpatrick (void)Fold; 330*097a140dSpatrick if (MergeBlockIntoPredecessor(Dest, DTU, LI)) { 331*097a140dSpatrick assert(Fold == BB && 332*097a140dSpatrick "Expecting BB to be unique predecessor of the Dest block"); 333*097a140dSpatrick MergeBlocks.erase(Dest); 334*097a140dSpatrick BlocksHaveBeenMerged = true; 335*097a140dSpatrick } else 336*097a140dSpatrick MergeBlocks.erase(BB); 337*097a140dSpatrick } else 338*097a140dSpatrick MergeBlocks.erase(BB); 339*097a140dSpatrick } 340*097a140dSpatrick return BlocksHaveBeenMerged; 341*097a140dSpatrick } 342*097a140dSpatrick 34309467b48Spatrick /// Remove redundant instructions within sequences of consecutive dbg.value 34409467b48Spatrick /// instructions. This is done using a backward scan to keep the last dbg.value 34509467b48Spatrick /// describing a specific variable/fragment. 34609467b48Spatrick /// 34709467b48Spatrick /// BackwardScan strategy: 34809467b48Spatrick /// ---------------------- 34909467b48Spatrick /// Given a sequence of consecutive DbgValueInst like this 35009467b48Spatrick /// 35109467b48Spatrick /// dbg.value ..., "x", FragmentX1 (*) 35209467b48Spatrick /// dbg.value ..., "y", FragmentY1 35309467b48Spatrick /// dbg.value ..., "x", FragmentX2 35409467b48Spatrick /// dbg.value ..., "x", FragmentX1 (**) 35509467b48Spatrick /// 35609467b48Spatrick /// then the instruction marked with (*) can be removed (it is guaranteed to be 35709467b48Spatrick /// obsoleted by the instruction marked with (**) as the latter instruction is 35809467b48Spatrick /// describing the same variable using the same fragment info). 35909467b48Spatrick /// 36009467b48Spatrick /// Possible improvements: 36109467b48Spatrick /// - Check fully overlapping fragments and not only identical fragments. 36209467b48Spatrick /// - Support dbg.addr, dbg.declare. dbg.label, and possibly other meta 36309467b48Spatrick /// instructions being part of the sequence of consecutive instructions. 36409467b48Spatrick static bool removeRedundantDbgInstrsUsingBackwardScan(BasicBlock *BB) { 36509467b48Spatrick SmallVector<DbgValueInst *, 8> ToBeRemoved; 36609467b48Spatrick SmallDenseSet<DebugVariable> VariableSet; 36709467b48Spatrick for (auto &I : reverse(*BB)) { 36809467b48Spatrick if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(&I)) { 36909467b48Spatrick DebugVariable Key(DVI->getVariable(), 37009467b48Spatrick DVI->getExpression(), 37109467b48Spatrick DVI->getDebugLoc()->getInlinedAt()); 37209467b48Spatrick auto R = VariableSet.insert(Key); 37309467b48Spatrick // If the same variable fragment is described more than once it is enough 37409467b48Spatrick // to keep the last one (i.e. the first found since we for reverse 37509467b48Spatrick // iteration). 37609467b48Spatrick if (!R.second) 37709467b48Spatrick ToBeRemoved.push_back(DVI); 37809467b48Spatrick continue; 37909467b48Spatrick } 38009467b48Spatrick // Sequence with consecutive dbg.value instrs ended. Clear the map to 38109467b48Spatrick // restart identifying redundant instructions if case we find another 38209467b48Spatrick // dbg.value sequence. 38309467b48Spatrick VariableSet.clear(); 38409467b48Spatrick } 38509467b48Spatrick 38609467b48Spatrick for (auto &Instr : ToBeRemoved) 38709467b48Spatrick Instr->eraseFromParent(); 38809467b48Spatrick 38909467b48Spatrick return !ToBeRemoved.empty(); 39009467b48Spatrick } 39109467b48Spatrick 39209467b48Spatrick /// Remove redundant dbg.value instructions using a forward scan. This can 39309467b48Spatrick /// remove a dbg.value instruction that is redundant due to indicating that a 39409467b48Spatrick /// variable has the same value as already being indicated by an earlier 39509467b48Spatrick /// dbg.value. 39609467b48Spatrick /// 39709467b48Spatrick /// ForwardScan strategy: 39809467b48Spatrick /// --------------------- 39909467b48Spatrick /// Given two identical dbg.value instructions, separated by a block of 40009467b48Spatrick /// instructions that isn't describing the same variable, like this 40109467b48Spatrick /// 40209467b48Spatrick /// dbg.value X1, "x", FragmentX1 (**) 40309467b48Spatrick /// <block of instructions, none being "dbg.value ..., "x", ..."> 40409467b48Spatrick /// dbg.value X1, "x", FragmentX1 (*) 40509467b48Spatrick /// 40609467b48Spatrick /// then the instruction marked with (*) can be removed. Variable "x" is already 40709467b48Spatrick /// described as being mapped to the SSA value X1. 40809467b48Spatrick /// 40909467b48Spatrick /// Possible improvements: 41009467b48Spatrick /// - Keep track of non-overlapping fragments. 41109467b48Spatrick static bool removeRedundantDbgInstrsUsingForwardScan(BasicBlock *BB) { 41209467b48Spatrick SmallVector<DbgValueInst *, 8> ToBeRemoved; 41309467b48Spatrick DenseMap<DebugVariable, std::pair<Value *, DIExpression *> > VariableMap; 41409467b48Spatrick for (auto &I : *BB) { 41509467b48Spatrick if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(&I)) { 41609467b48Spatrick DebugVariable Key(DVI->getVariable(), 41709467b48Spatrick NoneType(), 41809467b48Spatrick DVI->getDebugLoc()->getInlinedAt()); 41909467b48Spatrick auto VMI = VariableMap.find(Key); 42009467b48Spatrick // Update the map if we found a new value/expression describing the 42109467b48Spatrick // variable, or if the variable wasn't mapped already. 42209467b48Spatrick if (VMI == VariableMap.end() || 42309467b48Spatrick VMI->second.first != DVI->getValue() || 42409467b48Spatrick VMI->second.second != DVI->getExpression()) { 42509467b48Spatrick VariableMap[Key] = { DVI->getValue(), DVI->getExpression() }; 42609467b48Spatrick continue; 42709467b48Spatrick } 42809467b48Spatrick // Found an identical mapping. Remember the instruction for later removal. 42909467b48Spatrick ToBeRemoved.push_back(DVI); 43009467b48Spatrick } 43109467b48Spatrick } 43209467b48Spatrick 43309467b48Spatrick for (auto &Instr : ToBeRemoved) 43409467b48Spatrick Instr->eraseFromParent(); 43509467b48Spatrick 43609467b48Spatrick return !ToBeRemoved.empty(); 43709467b48Spatrick } 43809467b48Spatrick 43909467b48Spatrick bool llvm::RemoveRedundantDbgInstrs(BasicBlock *BB) { 44009467b48Spatrick bool MadeChanges = false; 44109467b48Spatrick // By using the "backward scan" strategy before the "forward scan" strategy we 44209467b48Spatrick // can remove both dbg.value (2) and (3) in a situation like this: 44309467b48Spatrick // 44409467b48Spatrick // (1) dbg.value V1, "x", DIExpression() 44509467b48Spatrick // ... 44609467b48Spatrick // (2) dbg.value V2, "x", DIExpression() 44709467b48Spatrick // (3) dbg.value V1, "x", DIExpression() 44809467b48Spatrick // 44909467b48Spatrick // The backward scan will remove (2), it is made obsolete by (3). After 45009467b48Spatrick // getting (2) out of the way, the foward scan will remove (3) since "x" 45109467b48Spatrick // already is described as having the value V1 at (1). 45209467b48Spatrick MadeChanges |= removeRedundantDbgInstrsUsingBackwardScan(BB); 45309467b48Spatrick MadeChanges |= removeRedundantDbgInstrsUsingForwardScan(BB); 45409467b48Spatrick 45509467b48Spatrick if (MadeChanges) 45609467b48Spatrick LLVM_DEBUG(dbgs() << "Removed redundant dbg instrs from: " 45709467b48Spatrick << BB->getName() << "\n"); 45809467b48Spatrick return MadeChanges; 45909467b48Spatrick } 46009467b48Spatrick 46109467b48Spatrick void llvm::ReplaceInstWithValue(BasicBlock::InstListType &BIL, 46209467b48Spatrick BasicBlock::iterator &BI, Value *V) { 46309467b48Spatrick Instruction &I = *BI; 46409467b48Spatrick // Replaces all of the uses of the instruction with uses of the value 46509467b48Spatrick I.replaceAllUsesWith(V); 46609467b48Spatrick 46709467b48Spatrick // Make sure to propagate a name if there is one already. 46809467b48Spatrick if (I.hasName() && !V->hasName()) 46909467b48Spatrick V->takeName(&I); 47009467b48Spatrick 47109467b48Spatrick // Delete the unnecessary instruction now... 47209467b48Spatrick BI = BIL.erase(BI); 47309467b48Spatrick } 47409467b48Spatrick 47509467b48Spatrick void llvm::ReplaceInstWithInst(BasicBlock::InstListType &BIL, 47609467b48Spatrick BasicBlock::iterator &BI, Instruction *I) { 47709467b48Spatrick assert(I->getParent() == nullptr && 47809467b48Spatrick "ReplaceInstWithInst: Instruction already inserted into basic block!"); 47909467b48Spatrick 48009467b48Spatrick // Copy debug location to newly added instruction, if it wasn't already set 48109467b48Spatrick // by the caller. 48209467b48Spatrick if (!I->getDebugLoc()) 48309467b48Spatrick I->setDebugLoc(BI->getDebugLoc()); 48409467b48Spatrick 48509467b48Spatrick // Insert the new instruction into the basic block... 48609467b48Spatrick BasicBlock::iterator New = BIL.insert(BI, I); 48709467b48Spatrick 48809467b48Spatrick // Replace all uses of the old instruction, and delete it. 48909467b48Spatrick ReplaceInstWithValue(BIL, BI, I); 49009467b48Spatrick 49109467b48Spatrick // Move BI back to point to the newly inserted instruction 49209467b48Spatrick BI = New; 49309467b48Spatrick } 49409467b48Spatrick 49509467b48Spatrick void llvm::ReplaceInstWithInst(Instruction *From, Instruction *To) { 49609467b48Spatrick BasicBlock::iterator BI(From); 49709467b48Spatrick ReplaceInstWithInst(From->getParent()->getInstList(), BI, To); 49809467b48Spatrick } 49909467b48Spatrick 50009467b48Spatrick BasicBlock *llvm::SplitEdge(BasicBlock *BB, BasicBlock *Succ, DominatorTree *DT, 50109467b48Spatrick LoopInfo *LI, MemorySSAUpdater *MSSAU) { 50209467b48Spatrick unsigned SuccNum = GetSuccessorNumber(BB, Succ); 50309467b48Spatrick 50409467b48Spatrick // If this is a critical edge, let SplitCriticalEdge do it. 50509467b48Spatrick Instruction *LatchTerm = BB->getTerminator(); 50609467b48Spatrick if (SplitCriticalEdge( 50709467b48Spatrick LatchTerm, SuccNum, 50809467b48Spatrick CriticalEdgeSplittingOptions(DT, LI, MSSAU).setPreserveLCSSA())) 50909467b48Spatrick return LatchTerm->getSuccessor(SuccNum); 51009467b48Spatrick 51109467b48Spatrick // If the edge isn't critical, then BB has a single successor or Succ has a 51209467b48Spatrick // single pred. Split the block. 51309467b48Spatrick if (BasicBlock *SP = Succ->getSinglePredecessor()) { 51409467b48Spatrick // If the successor only has a single pred, split the top of the successor 51509467b48Spatrick // block. 51609467b48Spatrick assert(SP == BB && "CFG broken"); 51709467b48Spatrick SP = nullptr; 51809467b48Spatrick return SplitBlock(Succ, &Succ->front(), DT, LI, MSSAU); 51909467b48Spatrick } 52009467b48Spatrick 52109467b48Spatrick // Otherwise, if BB has a single successor, split it at the bottom of the 52209467b48Spatrick // block. 52309467b48Spatrick assert(BB->getTerminator()->getNumSuccessors() == 1 && 52409467b48Spatrick "Should have a single succ!"); 52509467b48Spatrick return SplitBlock(BB, BB->getTerminator(), DT, LI, MSSAU); 52609467b48Spatrick } 52709467b48Spatrick 52809467b48Spatrick unsigned 52909467b48Spatrick llvm::SplitAllCriticalEdges(Function &F, 53009467b48Spatrick const CriticalEdgeSplittingOptions &Options) { 53109467b48Spatrick unsigned NumBroken = 0; 53209467b48Spatrick for (BasicBlock &BB : F) { 53309467b48Spatrick Instruction *TI = BB.getTerminator(); 53409467b48Spatrick if (TI->getNumSuccessors() > 1 && !isa<IndirectBrInst>(TI) && 53509467b48Spatrick !isa<CallBrInst>(TI)) 53609467b48Spatrick for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) 53709467b48Spatrick if (SplitCriticalEdge(TI, i, Options)) 53809467b48Spatrick ++NumBroken; 53909467b48Spatrick } 54009467b48Spatrick return NumBroken; 54109467b48Spatrick } 54209467b48Spatrick 54309467b48Spatrick BasicBlock *llvm::SplitBlock(BasicBlock *Old, Instruction *SplitPt, 54409467b48Spatrick DominatorTree *DT, LoopInfo *LI, 54509467b48Spatrick MemorySSAUpdater *MSSAU, const Twine &BBName) { 54609467b48Spatrick BasicBlock::iterator SplitIt = SplitPt->getIterator(); 54709467b48Spatrick while (isa<PHINode>(SplitIt) || SplitIt->isEHPad()) 54809467b48Spatrick ++SplitIt; 54909467b48Spatrick std::string Name = BBName.str(); 55009467b48Spatrick BasicBlock *New = Old->splitBasicBlock( 55109467b48Spatrick SplitIt, Name.empty() ? Old->getName() + ".split" : Name); 55209467b48Spatrick 55309467b48Spatrick // The new block lives in whichever loop the old one did. This preserves 55409467b48Spatrick // LCSSA as well, because we force the split point to be after any PHI nodes. 55509467b48Spatrick if (LI) 55609467b48Spatrick if (Loop *L = LI->getLoopFor(Old)) 55709467b48Spatrick L->addBasicBlockToLoop(New, *LI); 55809467b48Spatrick 55909467b48Spatrick if (DT) 56009467b48Spatrick // Old dominates New. New node dominates all other nodes dominated by Old. 56109467b48Spatrick if (DomTreeNode *OldNode = DT->getNode(Old)) { 56209467b48Spatrick std::vector<DomTreeNode *> Children(OldNode->begin(), OldNode->end()); 56309467b48Spatrick 56409467b48Spatrick DomTreeNode *NewNode = DT->addNewBlock(New, Old); 56509467b48Spatrick for (DomTreeNode *I : Children) 56609467b48Spatrick DT->changeImmediateDominator(I, NewNode); 56709467b48Spatrick } 56809467b48Spatrick 56909467b48Spatrick // Move MemoryAccesses still tracked in Old, but part of New now. 57009467b48Spatrick // Update accesses in successor blocks accordingly. 57109467b48Spatrick if (MSSAU) 57209467b48Spatrick MSSAU->moveAllAfterSpliceBlocks(Old, New, &*(New->begin())); 57309467b48Spatrick 57409467b48Spatrick return New; 57509467b48Spatrick } 57609467b48Spatrick 57709467b48Spatrick /// Update DominatorTree, LoopInfo, and LCCSA analysis information. 57809467b48Spatrick static void UpdateAnalysisInformation(BasicBlock *OldBB, BasicBlock *NewBB, 57909467b48Spatrick ArrayRef<BasicBlock *> Preds, 58009467b48Spatrick DominatorTree *DT, LoopInfo *LI, 58109467b48Spatrick MemorySSAUpdater *MSSAU, 58209467b48Spatrick bool PreserveLCSSA, bool &HasLoopExit) { 58309467b48Spatrick // Update dominator tree if available. 58409467b48Spatrick if (DT) { 58509467b48Spatrick if (OldBB == DT->getRootNode()->getBlock()) { 58609467b48Spatrick assert(NewBB == &NewBB->getParent()->getEntryBlock()); 58709467b48Spatrick DT->setNewRoot(NewBB); 58809467b48Spatrick } else { 58909467b48Spatrick // Split block expects NewBB to have a non-empty set of predecessors. 59009467b48Spatrick DT->splitBlock(NewBB); 59109467b48Spatrick } 59209467b48Spatrick } 59309467b48Spatrick 59409467b48Spatrick // Update MemoryPhis after split if MemorySSA is available 59509467b48Spatrick if (MSSAU) 59609467b48Spatrick MSSAU->wireOldPredecessorsToNewImmediatePredecessor(OldBB, NewBB, Preds); 59709467b48Spatrick 59809467b48Spatrick // The rest of the logic is only relevant for updating the loop structures. 59909467b48Spatrick if (!LI) 60009467b48Spatrick return; 60109467b48Spatrick 60209467b48Spatrick assert(DT && "DT should be available to update LoopInfo!"); 60309467b48Spatrick Loop *L = LI->getLoopFor(OldBB); 60409467b48Spatrick 60509467b48Spatrick // If we need to preserve loop analyses, collect some information about how 60609467b48Spatrick // this split will affect loops. 60709467b48Spatrick bool IsLoopEntry = !!L; 60809467b48Spatrick bool SplitMakesNewLoopHeader = false; 60909467b48Spatrick for (BasicBlock *Pred : Preds) { 61009467b48Spatrick // Preds that are not reachable from entry should not be used to identify if 61109467b48Spatrick // OldBB is a loop entry or if SplitMakesNewLoopHeader. Unreachable blocks 61209467b48Spatrick // are not within any loops, so we incorrectly mark SplitMakesNewLoopHeader 61309467b48Spatrick // as true and make the NewBB the header of some loop. This breaks LI. 61409467b48Spatrick if (!DT->isReachableFromEntry(Pred)) 61509467b48Spatrick continue; 61609467b48Spatrick // If we need to preserve LCSSA, determine if any of the preds is a loop 61709467b48Spatrick // exit. 61809467b48Spatrick if (PreserveLCSSA) 61909467b48Spatrick if (Loop *PL = LI->getLoopFor(Pred)) 62009467b48Spatrick if (!PL->contains(OldBB)) 62109467b48Spatrick HasLoopExit = true; 62209467b48Spatrick 62309467b48Spatrick // If we need to preserve LoopInfo, note whether any of the preds crosses 62409467b48Spatrick // an interesting loop boundary. 62509467b48Spatrick if (!L) 62609467b48Spatrick continue; 62709467b48Spatrick if (L->contains(Pred)) 62809467b48Spatrick IsLoopEntry = false; 62909467b48Spatrick else 63009467b48Spatrick SplitMakesNewLoopHeader = true; 63109467b48Spatrick } 63209467b48Spatrick 63309467b48Spatrick // Unless we have a loop for OldBB, nothing else to do here. 63409467b48Spatrick if (!L) 63509467b48Spatrick return; 63609467b48Spatrick 63709467b48Spatrick if (IsLoopEntry) { 63809467b48Spatrick // Add the new block to the nearest enclosing loop (and not an adjacent 63909467b48Spatrick // loop). To find this, examine each of the predecessors and determine which 64009467b48Spatrick // loops enclose them, and select the most-nested loop which contains the 64109467b48Spatrick // loop containing the block being split. 64209467b48Spatrick Loop *InnermostPredLoop = nullptr; 64309467b48Spatrick for (BasicBlock *Pred : Preds) { 64409467b48Spatrick if (Loop *PredLoop = LI->getLoopFor(Pred)) { 64509467b48Spatrick // Seek a loop which actually contains the block being split (to avoid 64609467b48Spatrick // adjacent loops). 64709467b48Spatrick while (PredLoop && !PredLoop->contains(OldBB)) 64809467b48Spatrick PredLoop = PredLoop->getParentLoop(); 64909467b48Spatrick 65009467b48Spatrick // Select the most-nested of these loops which contains the block. 65109467b48Spatrick if (PredLoop && PredLoop->contains(OldBB) && 65209467b48Spatrick (!InnermostPredLoop || 65309467b48Spatrick InnermostPredLoop->getLoopDepth() < PredLoop->getLoopDepth())) 65409467b48Spatrick InnermostPredLoop = PredLoop; 65509467b48Spatrick } 65609467b48Spatrick } 65709467b48Spatrick 65809467b48Spatrick if (InnermostPredLoop) 65909467b48Spatrick InnermostPredLoop->addBasicBlockToLoop(NewBB, *LI); 66009467b48Spatrick } else { 66109467b48Spatrick L->addBasicBlockToLoop(NewBB, *LI); 66209467b48Spatrick if (SplitMakesNewLoopHeader) 66309467b48Spatrick L->moveToHeader(NewBB); 66409467b48Spatrick } 66509467b48Spatrick } 66609467b48Spatrick 66709467b48Spatrick /// Update the PHI nodes in OrigBB to include the values coming from NewBB. 66809467b48Spatrick /// This also updates AliasAnalysis, if available. 66909467b48Spatrick static void UpdatePHINodes(BasicBlock *OrigBB, BasicBlock *NewBB, 67009467b48Spatrick ArrayRef<BasicBlock *> Preds, BranchInst *BI, 67109467b48Spatrick bool HasLoopExit) { 67209467b48Spatrick // Otherwise, create a new PHI node in NewBB for each PHI node in OrigBB. 67309467b48Spatrick SmallPtrSet<BasicBlock *, 16> PredSet(Preds.begin(), Preds.end()); 67409467b48Spatrick for (BasicBlock::iterator I = OrigBB->begin(); isa<PHINode>(I); ) { 67509467b48Spatrick PHINode *PN = cast<PHINode>(I++); 67609467b48Spatrick 67709467b48Spatrick // Check to see if all of the values coming in are the same. If so, we 67809467b48Spatrick // don't need to create a new PHI node, unless it's needed for LCSSA. 67909467b48Spatrick Value *InVal = nullptr; 68009467b48Spatrick if (!HasLoopExit) { 68109467b48Spatrick InVal = PN->getIncomingValueForBlock(Preds[0]); 68209467b48Spatrick for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) { 68309467b48Spatrick if (!PredSet.count(PN->getIncomingBlock(i))) 68409467b48Spatrick continue; 68509467b48Spatrick if (!InVal) 68609467b48Spatrick InVal = PN->getIncomingValue(i); 68709467b48Spatrick else if (InVal != PN->getIncomingValue(i)) { 68809467b48Spatrick InVal = nullptr; 68909467b48Spatrick break; 69009467b48Spatrick } 69109467b48Spatrick } 69209467b48Spatrick } 69309467b48Spatrick 69409467b48Spatrick if (InVal) { 69509467b48Spatrick // If all incoming values for the new PHI would be the same, just don't 69609467b48Spatrick // make a new PHI. Instead, just remove the incoming values from the old 69709467b48Spatrick // PHI. 69809467b48Spatrick 69909467b48Spatrick // NOTE! This loop walks backwards for a reason! First off, this minimizes 70009467b48Spatrick // the cost of removal if we end up removing a large number of values, and 70109467b48Spatrick // second off, this ensures that the indices for the incoming values 70209467b48Spatrick // aren't invalidated when we remove one. 70309467b48Spatrick for (int64_t i = PN->getNumIncomingValues() - 1; i >= 0; --i) 70409467b48Spatrick if (PredSet.count(PN->getIncomingBlock(i))) 70509467b48Spatrick PN->removeIncomingValue(i, false); 70609467b48Spatrick 70709467b48Spatrick // Add an incoming value to the PHI node in the loop for the preheader 70809467b48Spatrick // edge. 70909467b48Spatrick PN->addIncoming(InVal, NewBB); 71009467b48Spatrick continue; 71109467b48Spatrick } 71209467b48Spatrick 71309467b48Spatrick // If the values coming into the block are not the same, we need a new 71409467b48Spatrick // PHI. 71509467b48Spatrick // Create the new PHI node, insert it into NewBB at the end of the block 71609467b48Spatrick PHINode *NewPHI = 71709467b48Spatrick PHINode::Create(PN->getType(), Preds.size(), PN->getName() + ".ph", BI); 71809467b48Spatrick 71909467b48Spatrick // NOTE! This loop walks backwards for a reason! First off, this minimizes 72009467b48Spatrick // the cost of removal if we end up removing a large number of values, and 72109467b48Spatrick // second off, this ensures that the indices for the incoming values aren't 72209467b48Spatrick // invalidated when we remove one. 72309467b48Spatrick for (int64_t i = PN->getNumIncomingValues() - 1; i >= 0; --i) { 72409467b48Spatrick BasicBlock *IncomingBB = PN->getIncomingBlock(i); 72509467b48Spatrick if (PredSet.count(IncomingBB)) { 72609467b48Spatrick Value *V = PN->removeIncomingValue(i, false); 72709467b48Spatrick NewPHI->addIncoming(V, IncomingBB); 72809467b48Spatrick } 72909467b48Spatrick } 73009467b48Spatrick 73109467b48Spatrick PN->addIncoming(NewPHI, NewBB); 73209467b48Spatrick } 73309467b48Spatrick } 73409467b48Spatrick 73509467b48Spatrick BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB, 73609467b48Spatrick ArrayRef<BasicBlock *> Preds, 73709467b48Spatrick const char *Suffix, DominatorTree *DT, 73809467b48Spatrick LoopInfo *LI, MemorySSAUpdater *MSSAU, 73909467b48Spatrick bool PreserveLCSSA) { 74009467b48Spatrick // Do not attempt to split that which cannot be split. 74109467b48Spatrick if (!BB->canSplitPredecessors()) 74209467b48Spatrick return nullptr; 74309467b48Spatrick 74409467b48Spatrick // For the landingpads we need to act a bit differently. 74509467b48Spatrick // Delegate this work to the SplitLandingPadPredecessors. 74609467b48Spatrick if (BB->isLandingPad()) { 74709467b48Spatrick SmallVector<BasicBlock*, 2> NewBBs; 74809467b48Spatrick std::string NewName = std::string(Suffix) + ".split-lp"; 74909467b48Spatrick 75009467b48Spatrick SplitLandingPadPredecessors(BB, Preds, Suffix, NewName.c_str(), NewBBs, DT, 75109467b48Spatrick LI, MSSAU, PreserveLCSSA); 75209467b48Spatrick return NewBBs[0]; 75309467b48Spatrick } 75409467b48Spatrick 75509467b48Spatrick // Create new basic block, insert right before the original block. 75609467b48Spatrick BasicBlock *NewBB = BasicBlock::Create( 75709467b48Spatrick BB->getContext(), BB->getName() + Suffix, BB->getParent(), BB); 75809467b48Spatrick 75909467b48Spatrick // The new block unconditionally branches to the old block. 76009467b48Spatrick BranchInst *BI = BranchInst::Create(BB, NewBB); 76109467b48Spatrick // Splitting the predecessors of a loop header creates a preheader block. 76209467b48Spatrick if (LI && LI->isLoopHeader(BB)) 76309467b48Spatrick // Using the loop start line number prevents debuggers stepping into the 76409467b48Spatrick // loop body for this instruction. 76509467b48Spatrick BI->setDebugLoc(LI->getLoopFor(BB)->getStartLoc()); 76609467b48Spatrick else 76709467b48Spatrick BI->setDebugLoc(BB->getFirstNonPHIOrDbg()->getDebugLoc()); 76809467b48Spatrick 76909467b48Spatrick // Move the edges from Preds to point to NewBB instead of BB. 77009467b48Spatrick for (unsigned i = 0, e = Preds.size(); i != e; ++i) { 77109467b48Spatrick // This is slightly more strict than necessary; the minimum requirement 77209467b48Spatrick // is that there be no more than one indirectbr branching to BB. And 77309467b48Spatrick // all BlockAddress uses would need to be updated. 77409467b48Spatrick assert(!isa<IndirectBrInst>(Preds[i]->getTerminator()) && 77509467b48Spatrick "Cannot split an edge from an IndirectBrInst"); 77609467b48Spatrick assert(!isa<CallBrInst>(Preds[i]->getTerminator()) && 77709467b48Spatrick "Cannot split an edge from a CallBrInst"); 77809467b48Spatrick Preds[i]->getTerminator()->replaceUsesOfWith(BB, NewBB); 77909467b48Spatrick } 78009467b48Spatrick 78109467b48Spatrick // Insert a new PHI node into NewBB for every PHI node in BB and that new PHI 78209467b48Spatrick // node becomes an incoming value for BB's phi node. However, if the Preds 78309467b48Spatrick // list is empty, we need to insert dummy entries into the PHI nodes in BB to 78409467b48Spatrick // account for the newly created predecessor. 78509467b48Spatrick if (Preds.empty()) { 78609467b48Spatrick // Insert dummy values as the incoming value. 78709467b48Spatrick for (BasicBlock::iterator I = BB->begin(); isa<PHINode>(I); ++I) 78809467b48Spatrick cast<PHINode>(I)->addIncoming(UndefValue::get(I->getType()), NewBB); 78909467b48Spatrick } 79009467b48Spatrick 79109467b48Spatrick // Update DominatorTree, LoopInfo, and LCCSA analysis information. 79209467b48Spatrick bool HasLoopExit = false; 79309467b48Spatrick UpdateAnalysisInformation(BB, NewBB, Preds, DT, LI, MSSAU, PreserveLCSSA, 79409467b48Spatrick HasLoopExit); 79509467b48Spatrick 79609467b48Spatrick if (!Preds.empty()) { 79709467b48Spatrick // Update the PHI nodes in BB with the values coming from NewBB. 79809467b48Spatrick UpdatePHINodes(BB, NewBB, Preds, BI, HasLoopExit); 79909467b48Spatrick } 80009467b48Spatrick 80109467b48Spatrick return NewBB; 80209467b48Spatrick } 80309467b48Spatrick 80409467b48Spatrick void llvm::SplitLandingPadPredecessors(BasicBlock *OrigBB, 80509467b48Spatrick ArrayRef<BasicBlock *> Preds, 80609467b48Spatrick const char *Suffix1, const char *Suffix2, 80709467b48Spatrick SmallVectorImpl<BasicBlock *> &NewBBs, 80809467b48Spatrick DominatorTree *DT, LoopInfo *LI, 80909467b48Spatrick MemorySSAUpdater *MSSAU, 81009467b48Spatrick bool PreserveLCSSA) { 81109467b48Spatrick assert(OrigBB->isLandingPad() && "Trying to split a non-landing pad!"); 81209467b48Spatrick 81309467b48Spatrick // Create a new basic block for OrigBB's predecessors listed in Preds. Insert 81409467b48Spatrick // it right before the original block. 81509467b48Spatrick BasicBlock *NewBB1 = BasicBlock::Create(OrigBB->getContext(), 81609467b48Spatrick OrigBB->getName() + Suffix1, 81709467b48Spatrick OrigBB->getParent(), OrigBB); 81809467b48Spatrick NewBBs.push_back(NewBB1); 81909467b48Spatrick 82009467b48Spatrick // The new block unconditionally branches to the old block. 82109467b48Spatrick BranchInst *BI1 = BranchInst::Create(OrigBB, NewBB1); 82209467b48Spatrick BI1->setDebugLoc(OrigBB->getFirstNonPHI()->getDebugLoc()); 82309467b48Spatrick 82409467b48Spatrick // Move the edges from Preds to point to NewBB1 instead of OrigBB. 82509467b48Spatrick for (unsigned i = 0, e = Preds.size(); i != e; ++i) { 82609467b48Spatrick // This is slightly more strict than necessary; the minimum requirement 82709467b48Spatrick // is that there be no more than one indirectbr branching to BB. And 82809467b48Spatrick // all BlockAddress uses would need to be updated. 82909467b48Spatrick assert(!isa<IndirectBrInst>(Preds[i]->getTerminator()) && 83009467b48Spatrick "Cannot split an edge from an IndirectBrInst"); 83109467b48Spatrick Preds[i]->getTerminator()->replaceUsesOfWith(OrigBB, NewBB1); 83209467b48Spatrick } 83309467b48Spatrick 83409467b48Spatrick bool HasLoopExit = false; 83509467b48Spatrick UpdateAnalysisInformation(OrigBB, NewBB1, Preds, DT, LI, MSSAU, PreserveLCSSA, 83609467b48Spatrick HasLoopExit); 83709467b48Spatrick 83809467b48Spatrick // Update the PHI nodes in OrigBB with the values coming from NewBB1. 83909467b48Spatrick UpdatePHINodes(OrigBB, NewBB1, Preds, BI1, HasLoopExit); 84009467b48Spatrick 84109467b48Spatrick // Move the remaining edges from OrigBB to point to NewBB2. 84209467b48Spatrick SmallVector<BasicBlock*, 8> NewBB2Preds; 84309467b48Spatrick for (pred_iterator i = pred_begin(OrigBB), e = pred_end(OrigBB); 84409467b48Spatrick i != e; ) { 84509467b48Spatrick BasicBlock *Pred = *i++; 84609467b48Spatrick if (Pred == NewBB1) continue; 84709467b48Spatrick assert(!isa<IndirectBrInst>(Pred->getTerminator()) && 84809467b48Spatrick "Cannot split an edge from an IndirectBrInst"); 84909467b48Spatrick NewBB2Preds.push_back(Pred); 85009467b48Spatrick e = pred_end(OrigBB); 85109467b48Spatrick } 85209467b48Spatrick 85309467b48Spatrick BasicBlock *NewBB2 = nullptr; 85409467b48Spatrick if (!NewBB2Preds.empty()) { 85509467b48Spatrick // Create another basic block for the rest of OrigBB's predecessors. 85609467b48Spatrick NewBB2 = BasicBlock::Create(OrigBB->getContext(), 85709467b48Spatrick OrigBB->getName() + Suffix2, 85809467b48Spatrick OrigBB->getParent(), OrigBB); 85909467b48Spatrick NewBBs.push_back(NewBB2); 86009467b48Spatrick 86109467b48Spatrick // The new block unconditionally branches to the old block. 86209467b48Spatrick BranchInst *BI2 = BranchInst::Create(OrigBB, NewBB2); 86309467b48Spatrick BI2->setDebugLoc(OrigBB->getFirstNonPHI()->getDebugLoc()); 86409467b48Spatrick 86509467b48Spatrick // Move the remaining edges from OrigBB to point to NewBB2. 86609467b48Spatrick for (BasicBlock *NewBB2Pred : NewBB2Preds) 86709467b48Spatrick NewBB2Pred->getTerminator()->replaceUsesOfWith(OrigBB, NewBB2); 86809467b48Spatrick 86909467b48Spatrick // Update DominatorTree, LoopInfo, and LCCSA analysis information. 87009467b48Spatrick HasLoopExit = false; 87109467b48Spatrick UpdateAnalysisInformation(OrigBB, NewBB2, NewBB2Preds, DT, LI, MSSAU, 87209467b48Spatrick PreserveLCSSA, HasLoopExit); 87309467b48Spatrick 87409467b48Spatrick // Update the PHI nodes in OrigBB with the values coming from NewBB2. 87509467b48Spatrick UpdatePHINodes(OrigBB, NewBB2, NewBB2Preds, BI2, HasLoopExit); 87609467b48Spatrick } 87709467b48Spatrick 87809467b48Spatrick LandingPadInst *LPad = OrigBB->getLandingPadInst(); 87909467b48Spatrick Instruction *Clone1 = LPad->clone(); 88009467b48Spatrick Clone1->setName(Twine("lpad") + Suffix1); 88109467b48Spatrick NewBB1->getInstList().insert(NewBB1->getFirstInsertionPt(), Clone1); 88209467b48Spatrick 88309467b48Spatrick if (NewBB2) { 88409467b48Spatrick Instruction *Clone2 = LPad->clone(); 88509467b48Spatrick Clone2->setName(Twine("lpad") + Suffix2); 88609467b48Spatrick NewBB2->getInstList().insert(NewBB2->getFirstInsertionPt(), Clone2); 88709467b48Spatrick 88809467b48Spatrick // Create a PHI node for the two cloned landingpad instructions only 88909467b48Spatrick // if the original landingpad instruction has some uses. 89009467b48Spatrick if (!LPad->use_empty()) { 89109467b48Spatrick assert(!LPad->getType()->isTokenTy() && 89209467b48Spatrick "Split cannot be applied if LPad is token type. Otherwise an " 89309467b48Spatrick "invalid PHINode of token type would be created."); 89409467b48Spatrick PHINode *PN = PHINode::Create(LPad->getType(), 2, "lpad.phi", LPad); 89509467b48Spatrick PN->addIncoming(Clone1, NewBB1); 89609467b48Spatrick PN->addIncoming(Clone2, NewBB2); 89709467b48Spatrick LPad->replaceAllUsesWith(PN); 89809467b48Spatrick } 89909467b48Spatrick LPad->eraseFromParent(); 90009467b48Spatrick } else { 90109467b48Spatrick // There is no second clone. Just replace the landing pad with the first 90209467b48Spatrick // clone. 90309467b48Spatrick LPad->replaceAllUsesWith(Clone1); 90409467b48Spatrick LPad->eraseFromParent(); 90509467b48Spatrick } 90609467b48Spatrick } 90709467b48Spatrick 90809467b48Spatrick ReturnInst *llvm::FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB, 90909467b48Spatrick BasicBlock *Pred, 91009467b48Spatrick DomTreeUpdater *DTU) { 91109467b48Spatrick Instruction *UncondBranch = Pred->getTerminator(); 91209467b48Spatrick // Clone the return and add it to the end of the predecessor. 91309467b48Spatrick Instruction *NewRet = RI->clone(); 91409467b48Spatrick Pred->getInstList().push_back(NewRet); 91509467b48Spatrick 91609467b48Spatrick // If the return instruction returns a value, and if the value was a 91709467b48Spatrick // PHI node in "BB", propagate the right value into the return. 91809467b48Spatrick for (User::op_iterator i = NewRet->op_begin(), e = NewRet->op_end(); 91909467b48Spatrick i != e; ++i) { 92009467b48Spatrick Value *V = *i; 92109467b48Spatrick Instruction *NewBC = nullptr; 92209467b48Spatrick if (BitCastInst *BCI = dyn_cast<BitCastInst>(V)) { 92309467b48Spatrick // Return value might be bitcasted. Clone and insert it before the 92409467b48Spatrick // return instruction. 92509467b48Spatrick V = BCI->getOperand(0); 92609467b48Spatrick NewBC = BCI->clone(); 92709467b48Spatrick Pred->getInstList().insert(NewRet->getIterator(), NewBC); 92809467b48Spatrick *i = NewBC; 92909467b48Spatrick } 930*097a140dSpatrick 931*097a140dSpatrick Instruction *NewEV = nullptr; 932*097a140dSpatrick if (ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(V)) { 933*097a140dSpatrick V = EVI->getOperand(0); 934*097a140dSpatrick NewEV = EVI->clone(); 935*097a140dSpatrick if (NewBC) { 936*097a140dSpatrick NewBC->setOperand(0, NewEV); 937*097a140dSpatrick Pred->getInstList().insert(NewBC->getIterator(), NewEV); 938*097a140dSpatrick } else { 939*097a140dSpatrick Pred->getInstList().insert(NewRet->getIterator(), NewEV); 940*097a140dSpatrick *i = NewEV; 941*097a140dSpatrick } 942*097a140dSpatrick } 943*097a140dSpatrick 94409467b48Spatrick if (PHINode *PN = dyn_cast<PHINode>(V)) { 94509467b48Spatrick if (PN->getParent() == BB) { 946*097a140dSpatrick if (NewEV) { 947*097a140dSpatrick NewEV->setOperand(0, PN->getIncomingValueForBlock(Pred)); 948*097a140dSpatrick } else if (NewBC) 94909467b48Spatrick NewBC->setOperand(0, PN->getIncomingValueForBlock(Pred)); 95009467b48Spatrick else 95109467b48Spatrick *i = PN->getIncomingValueForBlock(Pred); 95209467b48Spatrick } 95309467b48Spatrick } 95409467b48Spatrick } 95509467b48Spatrick 95609467b48Spatrick // Update any PHI nodes in the returning block to realize that we no 95709467b48Spatrick // longer branch to them. 95809467b48Spatrick BB->removePredecessor(Pred); 95909467b48Spatrick UncondBranch->eraseFromParent(); 96009467b48Spatrick 96109467b48Spatrick if (DTU) 96209467b48Spatrick DTU->applyUpdates({{DominatorTree::Delete, Pred, BB}}); 96309467b48Spatrick 96409467b48Spatrick return cast<ReturnInst>(NewRet); 96509467b48Spatrick } 96609467b48Spatrick 96709467b48Spatrick Instruction *llvm::SplitBlockAndInsertIfThen(Value *Cond, 96809467b48Spatrick Instruction *SplitBefore, 96909467b48Spatrick bool Unreachable, 97009467b48Spatrick MDNode *BranchWeights, 97109467b48Spatrick DominatorTree *DT, LoopInfo *LI, 97209467b48Spatrick BasicBlock *ThenBlock) { 97309467b48Spatrick BasicBlock *Head = SplitBefore->getParent(); 97409467b48Spatrick BasicBlock *Tail = Head->splitBasicBlock(SplitBefore->getIterator()); 97509467b48Spatrick Instruction *HeadOldTerm = Head->getTerminator(); 97609467b48Spatrick LLVMContext &C = Head->getContext(); 97709467b48Spatrick Instruction *CheckTerm; 97809467b48Spatrick bool CreateThenBlock = (ThenBlock == nullptr); 97909467b48Spatrick if (CreateThenBlock) { 98009467b48Spatrick ThenBlock = BasicBlock::Create(C, "", Head->getParent(), Tail); 98109467b48Spatrick if (Unreachable) 98209467b48Spatrick CheckTerm = new UnreachableInst(C, ThenBlock); 98309467b48Spatrick else 98409467b48Spatrick CheckTerm = BranchInst::Create(Tail, ThenBlock); 98509467b48Spatrick CheckTerm->setDebugLoc(SplitBefore->getDebugLoc()); 98609467b48Spatrick } else 98709467b48Spatrick CheckTerm = ThenBlock->getTerminator(); 98809467b48Spatrick BranchInst *HeadNewTerm = 98909467b48Spatrick BranchInst::Create(/*ifTrue*/ThenBlock, /*ifFalse*/Tail, Cond); 99009467b48Spatrick HeadNewTerm->setMetadata(LLVMContext::MD_prof, BranchWeights); 99109467b48Spatrick ReplaceInstWithInst(HeadOldTerm, HeadNewTerm); 99209467b48Spatrick 99309467b48Spatrick if (DT) { 99409467b48Spatrick if (DomTreeNode *OldNode = DT->getNode(Head)) { 99509467b48Spatrick std::vector<DomTreeNode *> Children(OldNode->begin(), OldNode->end()); 99609467b48Spatrick 99709467b48Spatrick DomTreeNode *NewNode = DT->addNewBlock(Tail, Head); 99809467b48Spatrick for (DomTreeNode *Child : Children) 99909467b48Spatrick DT->changeImmediateDominator(Child, NewNode); 100009467b48Spatrick 100109467b48Spatrick // Head dominates ThenBlock. 100209467b48Spatrick if (CreateThenBlock) 100309467b48Spatrick DT->addNewBlock(ThenBlock, Head); 100409467b48Spatrick else 100509467b48Spatrick DT->changeImmediateDominator(ThenBlock, Head); 100609467b48Spatrick } 100709467b48Spatrick } 100809467b48Spatrick 100909467b48Spatrick if (LI) { 101009467b48Spatrick if (Loop *L = LI->getLoopFor(Head)) { 101109467b48Spatrick L->addBasicBlockToLoop(ThenBlock, *LI); 101209467b48Spatrick L->addBasicBlockToLoop(Tail, *LI); 101309467b48Spatrick } 101409467b48Spatrick } 101509467b48Spatrick 101609467b48Spatrick return CheckTerm; 101709467b48Spatrick } 101809467b48Spatrick 101909467b48Spatrick void llvm::SplitBlockAndInsertIfThenElse(Value *Cond, Instruction *SplitBefore, 102009467b48Spatrick Instruction **ThenTerm, 102109467b48Spatrick Instruction **ElseTerm, 102209467b48Spatrick MDNode *BranchWeights) { 102309467b48Spatrick BasicBlock *Head = SplitBefore->getParent(); 102409467b48Spatrick BasicBlock *Tail = Head->splitBasicBlock(SplitBefore->getIterator()); 102509467b48Spatrick Instruction *HeadOldTerm = Head->getTerminator(); 102609467b48Spatrick LLVMContext &C = Head->getContext(); 102709467b48Spatrick BasicBlock *ThenBlock = BasicBlock::Create(C, "", Head->getParent(), Tail); 102809467b48Spatrick BasicBlock *ElseBlock = BasicBlock::Create(C, "", Head->getParent(), Tail); 102909467b48Spatrick *ThenTerm = BranchInst::Create(Tail, ThenBlock); 103009467b48Spatrick (*ThenTerm)->setDebugLoc(SplitBefore->getDebugLoc()); 103109467b48Spatrick *ElseTerm = BranchInst::Create(Tail, ElseBlock); 103209467b48Spatrick (*ElseTerm)->setDebugLoc(SplitBefore->getDebugLoc()); 103309467b48Spatrick BranchInst *HeadNewTerm = 103409467b48Spatrick BranchInst::Create(/*ifTrue*/ThenBlock, /*ifFalse*/ElseBlock, Cond); 103509467b48Spatrick HeadNewTerm->setMetadata(LLVMContext::MD_prof, BranchWeights); 103609467b48Spatrick ReplaceInstWithInst(HeadOldTerm, HeadNewTerm); 103709467b48Spatrick } 103809467b48Spatrick 103909467b48Spatrick Value *llvm::GetIfCondition(BasicBlock *BB, BasicBlock *&IfTrue, 104009467b48Spatrick BasicBlock *&IfFalse) { 104109467b48Spatrick PHINode *SomePHI = dyn_cast<PHINode>(BB->begin()); 104209467b48Spatrick BasicBlock *Pred1 = nullptr; 104309467b48Spatrick BasicBlock *Pred2 = nullptr; 104409467b48Spatrick 104509467b48Spatrick if (SomePHI) { 104609467b48Spatrick if (SomePHI->getNumIncomingValues() != 2) 104709467b48Spatrick return nullptr; 104809467b48Spatrick Pred1 = SomePHI->getIncomingBlock(0); 104909467b48Spatrick Pred2 = SomePHI->getIncomingBlock(1); 105009467b48Spatrick } else { 105109467b48Spatrick pred_iterator PI = pred_begin(BB), PE = pred_end(BB); 105209467b48Spatrick if (PI == PE) // No predecessor 105309467b48Spatrick return nullptr; 105409467b48Spatrick Pred1 = *PI++; 105509467b48Spatrick if (PI == PE) // Only one predecessor 105609467b48Spatrick return nullptr; 105709467b48Spatrick Pred2 = *PI++; 105809467b48Spatrick if (PI != PE) // More than two predecessors 105909467b48Spatrick return nullptr; 106009467b48Spatrick } 106109467b48Spatrick 106209467b48Spatrick // We can only handle branches. Other control flow will be lowered to 106309467b48Spatrick // branches if possible anyway. 106409467b48Spatrick BranchInst *Pred1Br = dyn_cast<BranchInst>(Pred1->getTerminator()); 106509467b48Spatrick BranchInst *Pred2Br = dyn_cast<BranchInst>(Pred2->getTerminator()); 106609467b48Spatrick if (!Pred1Br || !Pred2Br) 106709467b48Spatrick return nullptr; 106809467b48Spatrick 106909467b48Spatrick // Eliminate code duplication by ensuring that Pred1Br is conditional if 107009467b48Spatrick // either are. 107109467b48Spatrick if (Pred2Br->isConditional()) { 107209467b48Spatrick // If both branches are conditional, we don't have an "if statement". In 107309467b48Spatrick // reality, we could transform this case, but since the condition will be 107409467b48Spatrick // required anyway, we stand no chance of eliminating it, so the xform is 107509467b48Spatrick // probably not profitable. 107609467b48Spatrick if (Pred1Br->isConditional()) 107709467b48Spatrick return nullptr; 107809467b48Spatrick 107909467b48Spatrick std::swap(Pred1, Pred2); 108009467b48Spatrick std::swap(Pred1Br, Pred2Br); 108109467b48Spatrick } 108209467b48Spatrick 108309467b48Spatrick if (Pred1Br->isConditional()) { 108409467b48Spatrick // The only thing we have to watch out for here is to make sure that Pred2 108509467b48Spatrick // doesn't have incoming edges from other blocks. If it does, the condition 108609467b48Spatrick // doesn't dominate BB. 108709467b48Spatrick if (!Pred2->getSinglePredecessor()) 108809467b48Spatrick return nullptr; 108909467b48Spatrick 109009467b48Spatrick // If we found a conditional branch predecessor, make sure that it branches 109109467b48Spatrick // to BB and Pred2Br. If it doesn't, this isn't an "if statement". 109209467b48Spatrick if (Pred1Br->getSuccessor(0) == BB && 109309467b48Spatrick Pred1Br->getSuccessor(1) == Pred2) { 109409467b48Spatrick IfTrue = Pred1; 109509467b48Spatrick IfFalse = Pred2; 109609467b48Spatrick } else if (Pred1Br->getSuccessor(0) == Pred2 && 109709467b48Spatrick Pred1Br->getSuccessor(1) == BB) { 109809467b48Spatrick IfTrue = Pred2; 109909467b48Spatrick IfFalse = Pred1; 110009467b48Spatrick } else { 110109467b48Spatrick // We know that one arm of the conditional goes to BB, so the other must 110209467b48Spatrick // go somewhere unrelated, and this must not be an "if statement". 110309467b48Spatrick return nullptr; 110409467b48Spatrick } 110509467b48Spatrick 110609467b48Spatrick return Pred1Br->getCondition(); 110709467b48Spatrick } 110809467b48Spatrick 110909467b48Spatrick // Ok, if we got here, both predecessors end with an unconditional branch to 111009467b48Spatrick // BB. Don't panic! If both blocks only have a single (identical) 111109467b48Spatrick // predecessor, and THAT is a conditional branch, then we're all ok! 111209467b48Spatrick BasicBlock *CommonPred = Pred1->getSinglePredecessor(); 111309467b48Spatrick if (CommonPred == nullptr || CommonPred != Pred2->getSinglePredecessor()) 111409467b48Spatrick return nullptr; 111509467b48Spatrick 111609467b48Spatrick // Otherwise, if this is a conditional branch, then we can use it! 111709467b48Spatrick BranchInst *BI = dyn_cast<BranchInst>(CommonPred->getTerminator()); 111809467b48Spatrick if (!BI) return nullptr; 111909467b48Spatrick 112009467b48Spatrick assert(BI->isConditional() && "Two successors but not conditional?"); 112109467b48Spatrick if (BI->getSuccessor(0) == Pred1) { 112209467b48Spatrick IfTrue = Pred1; 112309467b48Spatrick IfFalse = Pred2; 112409467b48Spatrick } else { 112509467b48Spatrick IfTrue = Pred2; 112609467b48Spatrick IfFalse = Pred1; 112709467b48Spatrick } 112809467b48Spatrick return BI->getCondition(); 112909467b48Spatrick } 1130*097a140dSpatrick 1131*097a140dSpatrick // After creating a control flow hub, the operands of PHINodes in an outgoing 1132*097a140dSpatrick // block Out no longer match the predecessors of that block. Predecessors of Out 1133*097a140dSpatrick // that are incoming blocks to the hub are now replaced by just one edge from 1134*097a140dSpatrick // the hub. To match this new control flow, the corresponding values from each 1135*097a140dSpatrick // PHINode must now be moved a new PHINode in the first guard block of the hub. 1136*097a140dSpatrick // 1137*097a140dSpatrick // This operation cannot be performed with SSAUpdater, because it involves one 1138*097a140dSpatrick // new use: If the block Out is in the list of Incoming blocks, then the newly 1139*097a140dSpatrick // created PHI in the Hub will use itself along that edge from Out to Hub. 1140*097a140dSpatrick static void reconnectPhis(BasicBlock *Out, BasicBlock *GuardBlock, 1141*097a140dSpatrick const SetVector<BasicBlock *> &Incoming, 1142*097a140dSpatrick BasicBlock *FirstGuardBlock) { 1143*097a140dSpatrick auto I = Out->begin(); 1144*097a140dSpatrick while (I != Out->end() && isa<PHINode>(I)) { 1145*097a140dSpatrick auto Phi = cast<PHINode>(I); 1146*097a140dSpatrick auto NewPhi = 1147*097a140dSpatrick PHINode::Create(Phi->getType(), Incoming.size(), 1148*097a140dSpatrick Phi->getName() + ".moved", &FirstGuardBlock->back()); 1149*097a140dSpatrick for (auto In : Incoming) { 1150*097a140dSpatrick Value *V = UndefValue::get(Phi->getType()); 1151*097a140dSpatrick if (In == Out) { 1152*097a140dSpatrick V = NewPhi; 1153*097a140dSpatrick } else if (Phi->getBasicBlockIndex(In) != -1) { 1154*097a140dSpatrick V = Phi->removeIncomingValue(In, false); 1155*097a140dSpatrick } 1156*097a140dSpatrick NewPhi->addIncoming(V, In); 1157*097a140dSpatrick } 1158*097a140dSpatrick assert(NewPhi->getNumIncomingValues() == Incoming.size()); 1159*097a140dSpatrick if (Phi->getNumOperands() == 0) { 1160*097a140dSpatrick Phi->replaceAllUsesWith(NewPhi); 1161*097a140dSpatrick I = Phi->eraseFromParent(); 1162*097a140dSpatrick continue; 1163*097a140dSpatrick } 1164*097a140dSpatrick Phi->addIncoming(NewPhi, GuardBlock); 1165*097a140dSpatrick ++I; 1166*097a140dSpatrick } 1167*097a140dSpatrick } 1168*097a140dSpatrick 1169*097a140dSpatrick using BBPredicates = DenseMap<BasicBlock *, PHINode *>; 1170*097a140dSpatrick using BBSetVector = SetVector<BasicBlock *>; 1171*097a140dSpatrick 1172*097a140dSpatrick // Redirects the terminator of the incoming block to the first guard 1173*097a140dSpatrick // block in the hub. The condition of the original terminator (if it 1174*097a140dSpatrick // was conditional) and its original successors are returned as a 1175*097a140dSpatrick // tuple <condition, succ0, succ1>. The function additionally filters 1176*097a140dSpatrick // out successors that are not in the set of outgoing blocks. 1177*097a140dSpatrick // 1178*097a140dSpatrick // - condition is non-null iff the branch is conditional. 1179*097a140dSpatrick // - Succ1 is non-null iff the sole/taken target is an outgoing block. 1180*097a140dSpatrick // - Succ2 is non-null iff condition is non-null and the fallthrough 1181*097a140dSpatrick // target is an outgoing block. 1182*097a140dSpatrick static std::tuple<Value *, BasicBlock *, BasicBlock *> 1183*097a140dSpatrick redirectToHub(BasicBlock *BB, BasicBlock *FirstGuardBlock, 1184*097a140dSpatrick const BBSetVector &Outgoing) { 1185*097a140dSpatrick auto Branch = cast<BranchInst>(BB->getTerminator()); 1186*097a140dSpatrick auto Condition = Branch->isConditional() ? Branch->getCondition() : nullptr; 1187*097a140dSpatrick 1188*097a140dSpatrick BasicBlock *Succ0 = Branch->getSuccessor(0); 1189*097a140dSpatrick BasicBlock *Succ1 = nullptr; 1190*097a140dSpatrick Succ0 = Outgoing.count(Succ0) ? Succ0 : nullptr; 1191*097a140dSpatrick 1192*097a140dSpatrick if (Branch->isUnconditional()) { 1193*097a140dSpatrick Branch->setSuccessor(0, FirstGuardBlock); 1194*097a140dSpatrick assert(Succ0); 1195*097a140dSpatrick } else { 1196*097a140dSpatrick Succ1 = Branch->getSuccessor(1); 1197*097a140dSpatrick Succ1 = Outgoing.count(Succ1) ? Succ1 : nullptr; 1198*097a140dSpatrick assert(Succ0 || Succ1); 1199*097a140dSpatrick if (Succ0 && !Succ1) { 1200*097a140dSpatrick Branch->setSuccessor(0, FirstGuardBlock); 1201*097a140dSpatrick } else if (Succ1 && !Succ0) { 1202*097a140dSpatrick Branch->setSuccessor(1, FirstGuardBlock); 1203*097a140dSpatrick } else { 1204*097a140dSpatrick Branch->eraseFromParent(); 1205*097a140dSpatrick BranchInst::Create(FirstGuardBlock, BB); 1206*097a140dSpatrick } 1207*097a140dSpatrick } 1208*097a140dSpatrick 1209*097a140dSpatrick assert(Succ0 || Succ1); 1210*097a140dSpatrick return std::make_tuple(Condition, Succ0, Succ1); 1211*097a140dSpatrick } 1212*097a140dSpatrick 1213*097a140dSpatrick // Capture the existing control flow as guard predicates, and redirect 1214*097a140dSpatrick // control flow from every incoming block to the first guard block in 1215*097a140dSpatrick // the hub. 1216*097a140dSpatrick // 1217*097a140dSpatrick // There is one guard predicate for each outgoing block OutBB. The 1218*097a140dSpatrick // predicate is a PHINode with one input for each InBB which 1219*097a140dSpatrick // represents whether the hub should transfer control flow to OutBB if 1220*097a140dSpatrick // it arrived from InBB. These predicates are NOT ORTHOGONAL. The Hub 1221*097a140dSpatrick // evaluates them in the same order as the Outgoing set-vector, and 1222*097a140dSpatrick // control branches to the first outgoing block whose predicate 1223*097a140dSpatrick // evaluates to true. 1224*097a140dSpatrick static void convertToGuardPredicates( 1225*097a140dSpatrick BasicBlock *FirstGuardBlock, BBPredicates &GuardPredicates, 1226*097a140dSpatrick SmallVectorImpl<WeakVH> &DeletionCandidates, const BBSetVector &Incoming, 1227*097a140dSpatrick const BBSetVector &Outgoing) { 1228*097a140dSpatrick auto &Context = Incoming.front()->getContext(); 1229*097a140dSpatrick auto BoolTrue = ConstantInt::getTrue(Context); 1230*097a140dSpatrick auto BoolFalse = ConstantInt::getFalse(Context); 1231*097a140dSpatrick 1232*097a140dSpatrick // The predicate for the last outgoing is trivially true, and so we 1233*097a140dSpatrick // process only the first N-1 successors. 1234*097a140dSpatrick for (int i = 0, e = Outgoing.size() - 1; i != e; ++i) { 1235*097a140dSpatrick auto Out = Outgoing[i]; 1236*097a140dSpatrick LLVM_DEBUG(dbgs() << "Creating guard for " << Out->getName() << "\n"); 1237*097a140dSpatrick auto Phi = 1238*097a140dSpatrick PHINode::Create(Type::getInt1Ty(Context), Incoming.size(), 1239*097a140dSpatrick StringRef("Guard.") + Out->getName(), FirstGuardBlock); 1240*097a140dSpatrick GuardPredicates[Out] = Phi; 1241*097a140dSpatrick } 1242*097a140dSpatrick 1243*097a140dSpatrick for (auto In : Incoming) { 1244*097a140dSpatrick Value *Condition; 1245*097a140dSpatrick BasicBlock *Succ0; 1246*097a140dSpatrick BasicBlock *Succ1; 1247*097a140dSpatrick std::tie(Condition, Succ0, Succ1) = 1248*097a140dSpatrick redirectToHub(In, FirstGuardBlock, Outgoing); 1249*097a140dSpatrick 1250*097a140dSpatrick // Optimization: Consider an incoming block A with both successors 1251*097a140dSpatrick // Succ0 and Succ1 in the set of outgoing blocks. The predicates 1252*097a140dSpatrick // for Succ0 and Succ1 complement each other. If Succ0 is visited 1253*097a140dSpatrick // first in the loop below, control will branch to Succ0 using the 1254*097a140dSpatrick // corresponding predicate. But if that branch is not taken, then 1255*097a140dSpatrick // control must reach Succ1, which means that the predicate for 1256*097a140dSpatrick // Succ1 is always true. 1257*097a140dSpatrick bool OneSuccessorDone = false; 1258*097a140dSpatrick for (int i = 0, e = Outgoing.size() - 1; i != e; ++i) { 1259*097a140dSpatrick auto Out = Outgoing[i]; 1260*097a140dSpatrick auto Phi = GuardPredicates[Out]; 1261*097a140dSpatrick if (Out != Succ0 && Out != Succ1) { 1262*097a140dSpatrick Phi->addIncoming(BoolFalse, In); 1263*097a140dSpatrick continue; 1264*097a140dSpatrick } 1265*097a140dSpatrick // Optimization: When only one successor is an outgoing block, 1266*097a140dSpatrick // the predicate is always true. 1267*097a140dSpatrick if (!Succ0 || !Succ1 || OneSuccessorDone) { 1268*097a140dSpatrick Phi->addIncoming(BoolTrue, In); 1269*097a140dSpatrick continue; 1270*097a140dSpatrick } 1271*097a140dSpatrick assert(Succ0 && Succ1); 1272*097a140dSpatrick OneSuccessorDone = true; 1273*097a140dSpatrick if (Out == Succ0) { 1274*097a140dSpatrick Phi->addIncoming(Condition, In); 1275*097a140dSpatrick continue; 1276*097a140dSpatrick } 1277*097a140dSpatrick auto Inverted = invertCondition(Condition); 1278*097a140dSpatrick DeletionCandidates.push_back(Condition); 1279*097a140dSpatrick Phi->addIncoming(Inverted, In); 1280*097a140dSpatrick } 1281*097a140dSpatrick } 1282*097a140dSpatrick } 1283*097a140dSpatrick 1284*097a140dSpatrick // For each outgoing block OutBB, create a guard block in the Hub. The 1285*097a140dSpatrick // first guard block was already created outside, and available as the 1286*097a140dSpatrick // first element in the vector of guard blocks. 1287*097a140dSpatrick // 1288*097a140dSpatrick // Each guard block terminates in a conditional branch that transfers 1289*097a140dSpatrick // control to the corresponding outgoing block or the next guard 1290*097a140dSpatrick // block. The last guard block has two outgoing blocks as successors 1291*097a140dSpatrick // since the condition for the final outgoing block is trivially 1292*097a140dSpatrick // true. So we create one less block (including the first guard block) 1293*097a140dSpatrick // than the number of outgoing blocks. 1294*097a140dSpatrick static void createGuardBlocks(SmallVectorImpl<BasicBlock *> &GuardBlocks, 1295*097a140dSpatrick Function *F, const BBSetVector &Outgoing, 1296*097a140dSpatrick BBPredicates &GuardPredicates, StringRef Prefix) { 1297*097a140dSpatrick for (int i = 0, e = Outgoing.size() - 2; i != e; ++i) { 1298*097a140dSpatrick GuardBlocks.push_back( 1299*097a140dSpatrick BasicBlock::Create(F->getContext(), Prefix + ".guard", F)); 1300*097a140dSpatrick } 1301*097a140dSpatrick assert(GuardBlocks.size() == GuardPredicates.size()); 1302*097a140dSpatrick 1303*097a140dSpatrick // To help keep the loop simple, temporarily append the last 1304*097a140dSpatrick // outgoing block to the list of guard blocks. 1305*097a140dSpatrick GuardBlocks.push_back(Outgoing.back()); 1306*097a140dSpatrick 1307*097a140dSpatrick for (int i = 0, e = GuardBlocks.size() - 1; i != e; ++i) { 1308*097a140dSpatrick auto Out = Outgoing[i]; 1309*097a140dSpatrick assert(GuardPredicates.count(Out)); 1310*097a140dSpatrick BranchInst::Create(Out, GuardBlocks[i + 1], GuardPredicates[Out], 1311*097a140dSpatrick GuardBlocks[i]); 1312*097a140dSpatrick } 1313*097a140dSpatrick 1314*097a140dSpatrick // Remove the last block from the guard list. 1315*097a140dSpatrick GuardBlocks.pop_back(); 1316*097a140dSpatrick } 1317*097a140dSpatrick 1318*097a140dSpatrick BasicBlock *llvm::CreateControlFlowHub( 1319*097a140dSpatrick DomTreeUpdater *DTU, SmallVectorImpl<BasicBlock *> &GuardBlocks, 1320*097a140dSpatrick const BBSetVector &Incoming, const BBSetVector &Outgoing, 1321*097a140dSpatrick const StringRef Prefix) { 1322*097a140dSpatrick auto F = Incoming.front()->getParent(); 1323*097a140dSpatrick auto FirstGuardBlock = 1324*097a140dSpatrick BasicBlock::Create(F->getContext(), Prefix + ".guard", F); 1325*097a140dSpatrick 1326*097a140dSpatrick SmallVector<DominatorTree::UpdateType, 16> Updates; 1327*097a140dSpatrick if (DTU) { 1328*097a140dSpatrick for (auto In : Incoming) { 1329*097a140dSpatrick for (auto Succ : successors(In)) { 1330*097a140dSpatrick if (Outgoing.count(Succ)) 1331*097a140dSpatrick Updates.push_back({DominatorTree::Delete, In, Succ}); 1332*097a140dSpatrick } 1333*097a140dSpatrick Updates.push_back({DominatorTree::Insert, In, FirstGuardBlock}); 1334*097a140dSpatrick } 1335*097a140dSpatrick } 1336*097a140dSpatrick 1337*097a140dSpatrick BBPredicates GuardPredicates; 1338*097a140dSpatrick SmallVector<WeakVH, 8> DeletionCandidates; 1339*097a140dSpatrick convertToGuardPredicates(FirstGuardBlock, GuardPredicates, DeletionCandidates, 1340*097a140dSpatrick Incoming, Outgoing); 1341*097a140dSpatrick 1342*097a140dSpatrick GuardBlocks.push_back(FirstGuardBlock); 1343*097a140dSpatrick createGuardBlocks(GuardBlocks, F, Outgoing, GuardPredicates, Prefix); 1344*097a140dSpatrick 1345*097a140dSpatrick // Update the PHINodes in each outgoing block to match the new control flow. 1346*097a140dSpatrick for (int i = 0, e = GuardBlocks.size(); i != e; ++i) { 1347*097a140dSpatrick reconnectPhis(Outgoing[i], GuardBlocks[i], Incoming, FirstGuardBlock); 1348*097a140dSpatrick } 1349*097a140dSpatrick reconnectPhis(Outgoing.back(), GuardBlocks.back(), Incoming, FirstGuardBlock); 1350*097a140dSpatrick 1351*097a140dSpatrick if (DTU) { 1352*097a140dSpatrick int NumGuards = GuardBlocks.size(); 1353*097a140dSpatrick assert((int)Outgoing.size() == NumGuards + 1); 1354*097a140dSpatrick for (int i = 0; i != NumGuards - 1; ++i) { 1355*097a140dSpatrick Updates.push_back({DominatorTree::Insert, GuardBlocks[i], Outgoing[i]}); 1356*097a140dSpatrick Updates.push_back( 1357*097a140dSpatrick {DominatorTree::Insert, GuardBlocks[i], GuardBlocks[i + 1]}); 1358*097a140dSpatrick } 1359*097a140dSpatrick Updates.push_back({DominatorTree::Insert, GuardBlocks[NumGuards - 1], 1360*097a140dSpatrick Outgoing[NumGuards - 1]}); 1361*097a140dSpatrick Updates.push_back({DominatorTree::Insert, GuardBlocks[NumGuards - 1], 1362*097a140dSpatrick Outgoing[NumGuards]}); 1363*097a140dSpatrick DTU->applyUpdates(Updates); 1364*097a140dSpatrick } 1365*097a140dSpatrick 1366*097a140dSpatrick for (auto I : DeletionCandidates) { 1367*097a140dSpatrick if (I->use_empty()) 1368*097a140dSpatrick if (auto Inst = dyn_cast_or_null<Instruction>(I)) 1369*097a140dSpatrick Inst->eraseFromParent(); 1370*097a140dSpatrick } 1371*097a140dSpatrick 1372*097a140dSpatrick return FirstGuardBlock; 1373*097a140dSpatrick } 1374