1 | //===- BreakCriticalEdges.cpp - Critical Edge Elimination Pass ------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // BreakCriticalEdges pass - Break all of the critical edges in the CFG by |
10 | // inserting a dummy basic block. This pass may be "required" by passes that |
11 | // cannot deal with critical edges. For this usage, the structure type is |
12 | // forward declared. This pass obviously invalidates the CFG, but can update |
13 | // dominator trees. |
14 | // |
15 | //===----------------------------------------------------------------------===// |
16 | |
17 | #include "llvm/Transforms/Utils/BreakCriticalEdges.h" |
18 | #include "llvm/ADT/SetVector.h" |
19 | #include "llvm/ADT/SmallVector.h" |
20 | #include "llvm/ADT/Statistic.h" |
21 | #include "llvm/Analysis/BlockFrequencyInfo.h" |
22 | #include "llvm/Analysis/BranchProbabilityInfo.h" |
23 | #include "llvm/Analysis/CFG.h" |
24 | #include "llvm/Analysis/LoopInfo.h" |
25 | #include "llvm/Analysis/MemorySSAUpdater.h" |
26 | #include "llvm/Analysis/PostDominators.h" |
27 | #include "llvm/IR/CFG.h" |
28 | #include "llvm/IR/Dominators.h" |
29 | #include "llvm/IR/Instructions.h" |
30 | #include "llvm/InitializePasses.h" |
31 | #include "llvm/Transforms/Utils.h" |
32 | #include "llvm/Transforms/Utils/BasicBlockUtils.h" |
33 | #include "llvm/Transforms/Utils/Cloning.h" |
34 | #include "llvm/Transforms/Utils/ValueMapper.h" |
35 | using namespace llvm; |
36 | |
37 | #define DEBUG_TYPE "break-crit-edges" |
38 | |
39 | STATISTIC(NumBroken, "Number of blocks inserted" ); |
40 | |
41 | namespace { |
42 | struct BreakCriticalEdges : public FunctionPass { |
43 | static char ID; // Pass identification, replacement for typeid |
44 | BreakCriticalEdges() : FunctionPass(ID) { |
45 | initializeBreakCriticalEdgesPass(*PassRegistry::getPassRegistry()); |
46 | } |
47 | |
48 | bool runOnFunction(Function &F) override { |
49 | auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>(); |
50 | auto *DT = DTWP ? &DTWP->getDomTree() : nullptr; |
51 | |
52 | auto *PDTWP = getAnalysisIfAvailable<PostDominatorTreeWrapperPass>(); |
53 | auto *PDT = PDTWP ? &PDTWP->getPostDomTree() : nullptr; |
54 | |
55 | auto *LIWP = getAnalysisIfAvailable<LoopInfoWrapperPass>(); |
56 | auto *LI = LIWP ? &LIWP->getLoopInfo() : nullptr; |
57 | unsigned N = |
58 | SplitAllCriticalEdges(F, Options: CriticalEdgeSplittingOptions(DT, LI, nullptr, PDT)); |
59 | NumBroken += N; |
60 | return N > 0; |
61 | } |
62 | |
63 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
64 | AU.addPreserved<DominatorTreeWrapperPass>(); |
65 | AU.addPreserved<LoopInfoWrapperPass>(); |
66 | |
67 | // No loop canonicalization guarantees are broken by this pass. |
68 | AU.addPreservedID(ID&: LoopSimplifyID); |
69 | } |
70 | }; |
71 | } |
72 | |
73 | char BreakCriticalEdges::ID = 0; |
74 | INITIALIZE_PASS(BreakCriticalEdges, "break-crit-edges" , |
75 | "Break critical edges in CFG" , false, false) |
76 | |
77 | // Publicly exposed interface to pass... |
78 | char &llvm::BreakCriticalEdgesID = BreakCriticalEdges::ID; |
79 | FunctionPass *llvm::createBreakCriticalEdgesPass() { |
80 | return new BreakCriticalEdges(); |
81 | } |
82 | |
83 | PreservedAnalyses BreakCriticalEdgesPass::run(Function &F, |
84 | FunctionAnalysisManager &AM) { |
85 | auto *DT = AM.getCachedResult<DominatorTreeAnalysis>(IR&: F); |
86 | auto *LI = AM.getCachedResult<LoopAnalysis>(IR&: F); |
87 | unsigned N = SplitAllCriticalEdges(F, Options: CriticalEdgeSplittingOptions(DT, LI)); |
88 | NumBroken += N; |
89 | if (N == 0) |
90 | return PreservedAnalyses::all(); |
91 | PreservedAnalyses PA; |
92 | PA.preserve<DominatorTreeAnalysis>(); |
93 | PA.preserve<LoopAnalysis>(); |
94 | return PA; |
95 | } |
96 | |
97 | //===----------------------------------------------------------------------===// |
98 | // Implementation of the external critical edge manipulation functions |
99 | //===----------------------------------------------------------------------===// |
100 | |
101 | BasicBlock *llvm::SplitCriticalEdge(Instruction *TI, unsigned SuccNum, |
102 | const CriticalEdgeSplittingOptions &Options, |
103 | const Twine &BBName) { |
104 | if (!isCriticalEdge(TI, SuccNum, AllowIdenticalEdges: Options.MergeIdenticalEdges)) |
105 | return nullptr; |
106 | |
107 | return SplitKnownCriticalEdge(TI, SuccNum, Options, BBName); |
108 | } |
109 | |
110 | BasicBlock * |
111 | llvm::SplitKnownCriticalEdge(Instruction *TI, unsigned SuccNum, |
112 | const CriticalEdgeSplittingOptions &Options, |
113 | const Twine &BBName) { |
114 | assert(!isa<IndirectBrInst>(TI) && |
115 | "Cannot split critical edge from IndirectBrInst" ); |
116 | |
117 | BasicBlock *TIBB = TI->getParent(); |
118 | BasicBlock *DestBB = TI->getSuccessor(Idx: SuccNum); |
119 | |
120 | // Splitting the critical edge to a pad block is non-trivial. Don't do |
121 | // it in this generic function. |
122 | if (DestBB->isEHPad()) return nullptr; |
123 | |
124 | if (Options.IgnoreUnreachableDests && |
125 | isa<UnreachableInst>(Val: DestBB->getFirstNonPHIOrDbgOrLifetime())) |
126 | return nullptr; |
127 | |
128 | auto *LI = Options.LI; |
129 | SmallVector<BasicBlock *, 4> LoopPreds; |
130 | // Check if extra modifications will be required to preserve loop-simplify |
131 | // form after splitting. If it would require splitting blocks with IndirectBr |
132 | // terminators, bail out if preserving loop-simplify form is requested. |
133 | if (LI) { |
134 | if (Loop *TIL = LI->getLoopFor(BB: TIBB)) { |
135 | |
136 | // The only way that we can break LoopSimplify form by splitting a |
137 | // critical edge is if after the split there exists some edge from TIL to |
138 | // DestBB *and* the only edge into DestBB from outside of TIL is that of |
139 | // NewBB. If the first isn't true, then LoopSimplify still holds, NewBB |
140 | // is the new exit block and it has no non-loop predecessors. If the |
141 | // second isn't true, then DestBB was not in LoopSimplify form prior to |
142 | // the split as it had a non-loop predecessor. In both of these cases, |
143 | // the predecessor must be directly in TIL, not in a subloop, or again |
144 | // LoopSimplify doesn't hold. |
145 | for (BasicBlock *P : predecessors(BB: DestBB)) { |
146 | if (P == TIBB) |
147 | continue; // The new block is known. |
148 | if (LI->getLoopFor(BB: P) != TIL) { |
149 | // No need to re-simplify, it wasn't to start with. |
150 | LoopPreds.clear(); |
151 | break; |
152 | } |
153 | LoopPreds.push_back(Elt: P); |
154 | } |
155 | // Loop-simplify form can be preserved, if we can split all in-loop |
156 | // predecessors. |
157 | if (any_of(Range&: LoopPreds, P: [](BasicBlock *Pred) { |
158 | return isa<IndirectBrInst>(Val: Pred->getTerminator()); |
159 | })) { |
160 | if (Options.PreserveLoopSimplify) |
161 | return nullptr; |
162 | LoopPreds.clear(); |
163 | } |
164 | } |
165 | } |
166 | |
167 | // Create a new basic block, linking it into the CFG. |
168 | BasicBlock *NewBB = nullptr; |
169 | if (BBName.str() != "" ) |
170 | NewBB = BasicBlock::Create(Context&: TI->getContext(), Name: BBName); |
171 | else |
172 | NewBB = BasicBlock::Create(Context&: TI->getContext(), Name: TIBB->getName() + "." + |
173 | DestBB->getName() + |
174 | "_crit_edge" ); |
175 | // Create our unconditional branch. |
176 | BranchInst *NewBI = BranchInst::Create(IfTrue: DestBB, InsertBefore: NewBB); |
177 | NewBI->setDebugLoc(TI->getDebugLoc()); |
178 | if (auto *LoopMD = TI->getMetadata(KindID: LLVMContext::MD_loop)) |
179 | NewBI->setMetadata(KindID: LLVMContext::MD_loop, Node: LoopMD); |
180 | |
181 | // Insert the block into the function... right after the block TI lives in. |
182 | Function &F = *TIBB->getParent(); |
183 | Function::iterator FBBI = TIBB->getIterator(); |
184 | F.insert(Position: ++FBBI, BB: NewBB); |
185 | |
186 | // Branch to the new block, breaking the edge. |
187 | TI->setSuccessor(Idx: SuccNum, BB: NewBB); |
188 | |
189 | // If there are any PHI nodes in DestBB, we need to update them so that they |
190 | // merge incoming values from NewBB instead of from TIBB. |
191 | { |
192 | unsigned BBIdx = 0; |
193 | for (BasicBlock::iterator I = DestBB->begin(); isa<PHINode>(Val: I); ++I) { |
194 | // We no longer enter through TIBB, now we come in through NewBB. |
195 | // Revector exactly one entry in the PHI node that used to come from |
196 | // TIBB to come from NewBB. |
197 | PHINode *PN = cast<PHINode>(Val&: I); |
198 | |
199 | // Reuse the previous value of BBIdx if it lines up. In cases where we |
200 | // have multiple phi nodes with *lots* of predecessors, this is a speed |
201 | // win because we don't have to scan the PHI looking for TIBB. This |
202 | // happens because the BB list of PHI nodes are usually in the same |
203 | // order. |
204 | if (PN->getIncomingBlock(i: BBIdx) != TIBB) |
205 | BBIdx = PN->getBasicBlockIndex(BB: TIBB); |
206 | PN->setIncomingBlock(i: BBIdx, BB: NewBB); |
207 | } |
208 | } |
209 | |
210 | unsigned NumSplitIdenticalEdges = 1; |
211 | |
212 | // If there are any other edges from TIBB to DestBB, update those to go |
213 | // through the split block, making those edges non-critical as well (and |
214 | // reducing the number of phi entries in the DestBB if relevant). |
215 | if (Options.MergeIdenticalEdges) { |
216 | for (unsigned i = SuccNum+1, e = TI->getNumSuccessors(); i != e; ++i) { |
217 | if (TI->getSuccessor(Idx: i) != DestBB) continue; |
218 | |
219 | // Remove an entry for TIBB from DestBB phi nodes. |
220 | DestBB->removePredecessor(Pred: TIBB, KeepOneInputPHIs: Options.KeepOneInputPHIs); |
221 | |
222 | // We found another edge to DestBB, go to NewBB instead. |
223 | TI->setSuccessor(Idx: i, BB: NewBB); |
224 | |
225 | // Record the number of split identical edges to DestBB. |
226 | NumSplitIdenticalEdges++; |
227 | } |
228 | } |
229 | |
230 | // If we have nothing to update, just return. |
231 | auto *DT = Options.DT; |
232 | auto *PDT = Options.PDT; |
233 | auto *MSSAU = Options.MSSAU; |
234 | if (MSSAU) |
235 | MSSAU->wireOldPredecessorsToNewImmediatePredecessor( |
236 | Old: DestBB, New: NewBB, Preds: {TIBB}, IdenticalEdgesWereMerged: Options.MergeIdenticalEdges); |
237 | |
238 | if (!DT && !PDT && !LI) |
239 | return NewBB; |
240 | |
241 | if (DT || PDT) { |
242 | // Update the DominatorTree. |
243 | // ---> NewBB -----\ |
244 | // / V |
245 | // TIBB -------\\------> DestBB |
246 | // |
247 | // First, inform the DT about the new path from TIBB to DestBB via NewBB, |
248 | // then delete the old edge from TIBB to DestBB. By doing this in that order |
249 | // DestBB stays reachable in the DT the whole time and its subtree doesn't |
250 | // get disconnected. |
251 | SmallVector<DominatorTree::UpdateType, 3> Updates; |
252 | Updates.push_back(Elt: {DominatorTree::Insert, TIBB, NewBB}); |
253 | Updates.push_back(Elt: {DominatorTree::Insert, NewBB, DestBB}); |
254 | if (!llvm::is_contained(Range: successors(BB: TIBB), Element: DestBB)) |
255 | Updates.push_back(Elt: {DominatorTree::Delete, TIBB, DestBB}); |
256 | |
257 | if (DT) |
258 | DT->applyUpdates(Updates); |
259 | if (PDT) |
260 | PDT->applyUpdates(Updates); |
261 | } |
262 | |
263 | // Update LoopInfo if it is around. |
264 | if (LI) { |
265 | if (Loop *TIL = LI->getLoopFor(BB: TIBB)) { |
266 | // If one or the other blocks were not in a loop, the new block is not |
267 | // either, and thus LI doesn't need to be updated. |
268 | if (Loop *DestLoop = LI->getLoopFor(BB: DestBB)) { |
269 | if (TIL == DestLoop) { |
270 | // Both in the same loop, the NewBB joins loop. |
271 | DestLoop->addBasicBlockToLoop(NewBB, LI&: *LI); |
272 | } else if (TIL->contains(L: DestLoop)) { |
273 | // Edge from an outer loop to an inner loop. Add to the outer loop. |
274 | TIL->addBasicBlockToLoop(NewBB, LI&: *LI); |
275 | } else if (DestLoop->contains(L: TIL)) { |
276 | // Edge from an inner loop to an outer loop. Add to the outer loop. |
277 | DestLoop->addBasicBlockToLoop(NewBB, LI&: *LI); |
278 | } else { |
279 | // Edge from two loops with no containment relation. Because these |
280 | // are natural loops, we know that the destination block must be the |
281 | // header of its loop (adding a branch into a loop elsewhere would |
282 | // create an irreducible loop). |
283 | assert(DestLoop->getHeader() == DestBB && |
284 | "Should not create irreducible loops!" ); |
285 | if (Loop *P = DestLoop->getParentLoop()) |
286 | P->addBasicBlockToLoop(NewBB, LI&: *LI); |
287 | } |
288 | } |
289 | |
290 | // If TIBB is in a loop and DestBB is outside of that loop, we may need |
291 | // to update LoopSimplify form and LCSSA form. |
292 | if (!TIL->contains(BB: DestBB)) { |
293 | assert(!TIL->contains(NewBB) && |
294 | "Split point for loop exit is contained in loop!" ); |
295 | |
296 | // Update LCSSA form in the newly created exit block. |
297 | if (Options.PreserveLCSSA) { |
298 | // If > 1 identical edges to be split, we need to introduce the same |
299 | // number of the incoming blocks for the new PHINode. |
300 | createPHIsForSplitLoopExit( |
301 | Preds: SmallVector<BasicBlock *, 4>(NumSplitIdenticalEdges, TIBB), SplitBB: NewBB, |
302 | DestBB); |
303 | } |
304 | |
305 | if (!LoopPreds.empty()) { |
306 | assert(!DestBB->isEHPad() && "We don't split edges to EH pads!" ); |
307 | BasicBlock *NewExitBB = SplitBlockPredecessors( |
308 | BB: DestBB, Preds: LoopPreds, Suffix: "split" , DT, LI, MSSAU, PreserveLCSSA: Options.PreserveLCSSA); |
309 | if (Options.PreserveLCSSA) |
310 | createPHIsForSplitLoopExit(Preds: LoopPreds, SplitBB: NewExitBB, DestBB); |
311 | } |
312 | } |
313 | } |
314 | } |
315 | |
316 | return NewBB; |
317 | } |
318 | |
319 | // Return the unique indirectbr predecessor of a block. This may return null |
320 | // even if such a predecessor exists, if it's not useful for splitting. |
321 | // If a predecessor is found, OtherPreds will contain all other (non-indirectbr) |
322 | // predecessors of BB. |
323 | static BasicBlock * |
324 | findIBRPredecessor(BasicBlock *BB, SmallVectorImpl<BasicBlock *> &OtherPreds) { |
325 | // Verify we have exactly one IBR predecessor. |
326 | // Conservatively bail out if one of the other predecessors is not a "regular" |
327 | // terminator (that is, not a switch or a br). |
328 | BasicBlock *IBB = nullptr; |
329 | for (BasicBlock *PredBB : predecessors(BB)) { |
330 | Instruction *PredTerm = PredBB->getTerminator(); |
331 | switch (PredTerm->getOpcode()) { |
332 | case Instruction::IndirectBr: |
333 | if (IBB) |
334 | return nullptr; |
335 | IBB = PredBB; |
336 | break; |
337 | case Instruction::Br: |
338 | case Instruction::Switch: |
339 | OtherPreds.push_back(Elt: PredBB); |
340 | continue; |
341 | default: |
342 | return nullptr; |
343 | } |
344 | } |
345 | |
346 | return IBB; |
347 | } |
348 | |
349 | bool llvm::SplitIndirectBrCriticalEdges(Function &F, |
350 | bool IgnoreBlocksWithoutPHI, |
351 | BranchProbabilityInfo *BPI, |
352 | BlockFrequencyInfo *BFI) { |
353 | // Check whether the function has any indirectbrs, and collect which blocks |
354 | // they may jump to. Since most functions don't have indirect branches, |
355 | // this lowers the common case's overhead to O(Blocks) instead of O(Edges). |
356 | SmallSetVector<BasicBlock *, 16> Targets; |
357 | for (auto &BB : F) { |
358 | if (isa<IndirectBrInst>(Val: BB.getTerminator())) |
359 | Targets.insert_range(R: successors(BB: &BB)); |
360 | } |
361 | |
362 | if (Targets.empty()) |
363 | return false; |
364 | |
365 | bool ShouldUpdateAnalysis = BPI && BFI; |
366 | bool Changed = false; |
367 | for (BasicBlock *Target : Targets) { |
368 | if (IgnoreBlocksWithoutPHI && Target->phis().empty()) |
369 | continue; |
370 | |
371 | SmallVector<BasicBlock *, 16> OtherPreds; |
372 | BasicBlock *IBRPred = findIBRPredecessor(BB: Target, OtherPreds); |
373 | // If we did not found an indirectbr, or the indirectbr is the only |
374 | // incoming edge, this isn't the kind of edge we're looking for. |
375 | if (!IBRPred || OtherPreds.empty()) |
376 | continue; |
377 | |
378 | // Don't even think about ehpads/landingpads. |
379 | auto FirstNonPHIIt = Target->getFirstNonPHIIt(); |
380 | if (FirstNonPHIIt->isEHPad() || Target->isLandingPad()) |
381 | continue; |
382 | |
383 | // Remember edge probabilities if needed. |
384 | SmallVector<BranchProbability, 4> EdgeProbabilities; |
385 | if (ShouldUpdateAnalysis) { |
386 | EdgeProbabilities.reserve(N: Target->getTerminator()->getNumSuccessors()); |
387 | for (unsigned I = 0, E = Target->getTerminator()->getNumSuccessors(); |
388 | I < E; ++I) |
389 | EdgeProbabilities.emplace_back(Args: BPI->getEdgeProbability(Src: Target, IndexInSuccessors: I)); |
390 | BPI->eraseBlock(BB: Target); |
391 | } |
392 | |
393 | BasicBlock *BodyBlock = Target->splitBasicBlock(I: FirstNonPHIIt, BBName: ".split" ); |
394 | if (ShouldUpdateAnalysis) { |
395 | // Copy the BFI/BPI from Target to BodyBlock. |
396 | BPI->setEdgeProbability(Src: BodyBlock, Probs: EdgeProbabilities); |
397 | BFI->setBlockFreq(BB: BodyBlock, Freq: BFI->getBlockFreq(BB: Target)); |
398 | } |
399 | // It's possible Target was its own successor through an indirectbr. |
400 | // In this case, the indirectbr now comes from BodyBlock. |
401 | if (IBRPred == Target) |
402 | IBRPred = BodyBlock; |
403 | |
404 | // At this point Target only has PHIs, and BodyBlock has the rest of the |
405 | // block's body. Create a copy of Target that will be used by the "direct" |
406 | // preds. |
407 | ValueToValueMapTy VMap; |
408 | BasicBlock *DirectSucc = CloneBasicBlock(BB: Target, VMap, NameSuffix: ".clone" , F: &F); |
409 | if (!VMap.AtomMap.empty()) |
410 | for (Instruction &I : *DirectSucc) |
411 | RemapSourceAtom(I: &I, VM&: VMap); |
412 | |
413 | BlockFrequency BlockFreqForDirectSucc; |
414 | for (BasicBlock *Pred : OtherPreds) { |
415 | // If the target is a loop to itself, then the terminator of the split |
416 | // block (BodyBlock) needs to be updated. |
417 | BasicBlock *Src = Pred != Target ? Pred : BodyBlock; |
418 | Src->getTerminator()->replaceUsesOfWith(From: Target, To: DirectSucc); |
419 | if (ShouldUpdateAnalysis) |
420 | BlockFreqForDirectSucc += BFI->getBlockFreq(BB: Src) * |
421 | BPI->getEdgeProbability(Src, Dst: DirectSucc); |
422 | } |
423 | if (ShouldUpdateAnalysis) { |
424 | BFI->setBlockFreq(BB: DirectSucc, Freq: BlockFreqForDirectSucc); |
425 | BlockFrequency NewBlockFreqForTarget = |
426 | BFI->getBlockFreq(BB: Target) - BlockFreqForDirectSucc; |
427 | BFI->setBlockFreq(BB: Target, Freq: NewBlockFreqForTarget); |
428 | } |
429 | |
430 | // Ok, now fix up the PHIs. We know the two blocks only have PHIs, and that |
431 | // they are clones, so the number of PHIs are the same. |
432 | // (a) Remove the edge coming from IBRPred from the "Direct" PHI |
433 | // (b) Leave that as the only edge in the "Indirect" PHI. |
434 | // (c) Merge the two in the body block. |
435 | BasicBlock::iterator Indirect = Target->begin(), |
436 | End = Target->getFirstNonPHIIt(); |
437 | BasicBlock::iterator Direct = DirectSucc->begin(); |
438 | BasicBlock::iterator MergeInsert = BodyBlock->getFirstInsertionPt(); |
439 | |
440 | assert(&*End == Target->getTerminator() && |
441 | "Block was expected to only contain PHIs" ); |
442 | |
443 | while (Indirect != End) { |
444 | PHINode *DirPHI = cast<PHINode>(Val&: Direct); |
445 | PHINode *IndPHI = cast<PHINode>(Val&: Indirect); |
446 | BasicBlock::iterator InsertPt = Indirect; |
447 | |
448 | // Now, clean up - the direct block shouldn't get the indirect value, |
449 | // and vice versa. |
450 | DirPHI->removeIncomingValue(BB: IBRPred); |
451 | Direct++; |
452 | |
453 | // Advance the pointer here, to avoid invalidation issues when the old |
454 | // PHI is erased. |
455 | Indirect++; |
456 | |
457 | PHINode *NewIndPHI = PHINode::Create(Ty: IndPHI->getType(), NumReservedValues: 1, NameStr: "ind" , InsertBefore: InsertPt); |
458 | NewIndPHI->addIncoming(V: IndPHI->getIncomingValueForBlock(BB: IBRPred), |
459 | BB: IBRPred); |
460 | NewIndPHI->setDebugLoc(IndPHI->getDebugLoc()); |
461 | |
462 | // Create a PHI in the body block, to merge the direct and indirect |
463 | // predecessors. |
464 | PHINode *MergePHI = PHINode::Create(Ty: IndPHI->getType(), NumReservedValues: 2, NameStr: "merge" ); |
465 | MergePHI->insertBefore(InsertPos: MergeInsert); |
466 | MergePHI->addIncoming(V: NewIndPHI, BB: Target); |
467 | MergePHI->addIncoming(V: DirPHI, BB: DirectSucc); |
468 | MergePHI->applyMergedLocation(LocA: DirPHI->getDebugLoc(), |
469 | LocB: IndPHI->getDebugLoc()); |
470 | |
471 | IndPHI->replaceAllUsesWith(V: MergePHI); |
472 | IndPHI->eraseFromParent(); |
473 | } |
474 | |
475 | Changed = true; |
476 | } |
477 | |
478 | return Changed; |
479 | } |
480 | |