LLVM 24.0.0git
PHIElimination.cpp
Go to the documentation of this file.
1//===- PhiElimination.cpp - Eliminate PHI nodes by inserting copies -------===//
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// This pass eliminates machine instruction PHI nodes by inserting copy
10// instructions. This destroys SSA information, but is the desired input for
11// some register allocators.
12//
13//===----------------------------------------------------------------------===//
14
16#include "PHIEliminationUtils.h"
17#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/SmallSet.h"
20#include "llvm/ADT/Statistic.h"
44#include "llvm/Pass.h"
46#include "llvm/Support/Debug.h"
48#include <cassert>
49#include <iterator>
50#include <utility>
51
52using namespace llvm;
53
54#define DEBUG_TYPE "phi-node-elimination"
55
56static cl::opt<bool>
57 DisableEdgeSplitting("disable-phi-elim-edge-splitting", cl::init(false),
59 cl::desc("Disable critical edge splitting "
60 "during PHI elimination"));
61
62static cl::opt<bool>
63 SplitAllCriticalEdges("phi-elim-split-all-critical-edges", cl::init(false),
65 cl::desc("Split all critical edges during "
66 "PHI elimination"));
67
69 "no-phi-elim-live-out-early-exit", cl::init(false), cl::Hidden,
70 cl::desc("Do not use an early exit if isLiveOutPastPHIs returns true."));
71
72namespace {
73
74class PHIEliminationImpl {
75 MachineRegisterInfo *MRI = nullptr; // Machine register information
76 SlotIndexes *SI = nullptr;
77 LiveIntervals *LIS = nullptr;
78 MachineLoopInfo *MLI = nullptr;
79 MachineDominatorTree *MDT = nullptr;
80 MachinePostDominatorTree *PDT = nullptr;
81 const MachineBranchProbabilityInfo *MBPI = nullptr;
82 MachineBlockFrequencyInfo *MBFI = nullptr;
83
84 /// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions
85 /// in predecessor basic blocks.
86 bool EliminatePHINodes(MachineFunction &MF, MachineBasicBlock &MBB);
87
88 void LowerPHINode(MachineBasicBlock &MBB,
90 bool AllEdgesCritical);
91
92 /// analyzePHINodes - Gather information about the PHI nodes in
93 /// here. In particular, we want to map the number of uses of a virtual
94 /// register which is used in a PHI node. We map that to the BB the
95 /// vreg is coming from. This is used later to determine when the vreg
96 /// is killed in the BB.
97 void analyzePHINodes(const MachineFunction &MF);
98
99 /// Split critical edges where necessary for good coalescer performance.
100 bool SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB,
102
103 void computeLiveOutSets(const MachineFunction &MF);
104
105 bool isLiveIn(Register Reg, const MachineBasicBlock *MBB);
106 bool isLiveOutPastPHIs(Register Reg, const MachineBasicBlock *MBB);
107
108 using BBVRegPair = std::pair<unsigned, Register>;
109 using VRegPHIUse = DenseMap<BBVRegPair, unsigned>;
110
111 // Count the number of non-undef PHI uses of each register in each BB.
112 VRegPHIUse VRegPHIUseCount;
113
114 // PHI source registers whose subranges must be shrunk to their own uses once
115 // all PHIs are gone.
116 SmallSet<Register, 8> PHISrcRegsToShrink;
117
118 // Defs of PHI sources which are implicit_def.
120
121 // Map reusable lowered PHI node -> incoming join register.
122 using LoweredPHIMap =
124 LoweredPHIMap LoweredPHIs;
125
126 // A set of live-out regs for each MBB which is used to update LIS
127 // efficiently also with large functions.
128 std::vector<SparseBitVector<>> LiveOutSets;
129
130public:
131 PHIEliminationImpl(MachineFunctionPass *P) {
132 auto *SIWrapper = P->getAnalysisIfAvailable<SlotIndexesWrapperPass>();
133 auto *LISWrapper = P->getAnalysisIfAvailable<LiveIntervalsWrapperPass>();
134 auto *MLIWrapper = P->getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
135 auto *MDTWrapper =
136 P->getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();
137 auto *PDTWrapper =
138 P->getAnalysisIfAvailable<MachinePostDominatorTreeWrapperPass>();
139 auto *MBPIWrapper =
140 P->getAnalysisIfAvailable<MachineBranchProbabilityInfoWrapperPass>();
141 auto *MBFIWrapper =
142 P->getAnalysisIfAvailable<MachineBlockFrequencyInfoWrapperPass>();
143
144 SI = SIWrapper ? &SIWrapper->getSI() : nullptr;
145 LIS = LISWrapper ? &LISWrapper->getLIS() : nullptr;
146 MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
147 MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
148 PDT = PDTWrapper ? &PDTWrapper->getPostDomTree() : nullptr;
149 MBPI = MBPIWrapper ? &MBPIWrapper->getMBPI() : nullptr;
150 MBFI = MBFIWrapper ? &MBFIWrapper->getMBFI() : nullptr;
151 }
152
153 PHIEliminationImpl(MachineFunction &MF, MachineFunctionAnalysisManager &AM)
154 : SI(AM.getCachedResult<SlotIndexesAnalysis>(MF)),
155 LIS(AM.getCachedResult<LiveIntervalsAnalysis>(MF)),
156 MLI(AM.getCachedResult<MachineLoopAnalysis>(MF)),
157 MDT(AM.getCachedResult<MachineDominatorTreeAnalysis>(MF)),
158 PDT(AM.getCachedResult<MachinePostDominatorTreeAnalysis>(MF)),
159 MBPI(AM.getCachedResult<MachineBranchProbabilityAnalysis>(MF)),
160 MBFI(AM.getCachedResult<MachineBlockFrequencyAnalysis>(MF)) {}
161
162 bool run(MachineFunction &MF);
163};
164
165class PHIElimination : public MachineFunctionPass {
166public:
167 static char ID; // Pass identification, replacement for typeid
168
169 PHIElimination() : MachineFunctionPass(ID) {}
170
171 bool runOnMachineFunction(MachineFunction &MF) override {
172 PHIEliminationImpl Impl(this);
173 return Impl.run(MF);
174 }
175
176 MachineFunctionProperties getSetProperties() const override {
177 return MachineFunctionProperties().setNoPHIs();
178 }
179
180 void getAnalysisUsage(AnalysisUsage &AU) const override;
181};
182
183} // end anonymous namespace
184
188 PHIEliminationImpl Impl(MF, MFAM);
189 bool Changed = Impl.run(MF);
190 if (!Changed)
191 return PreservedAnalyses::all();
193 PA.preserve<LiveIntervalsAnalysis>();
194 PA.preserve<SlotIndexesAnalysis>();
195 PA.preserve<MachineDominatorTreeAnalysis>();
197 PA.preserve<MachineLoopAnalysis>();
198 PA.preserve<MachineBlockFrequencyAnalysis>();
199 return PA;
200}
201
202STATISTIC(NumLowered, "Number of phis lowered");
203STATISTIC(NumCriticalEdgesSplit, "Number of critical edges split");
204STATISTIC(NumReused, "Number of reused lowered phis");
205
206char PHIElimination::ID = 0;
207
208char &llvm::PHIEliminationID = PHIElimination::ID;
209
211 "Eliminate PHI nodes for register allocation", false,
212 false)
218 "Eliminate PHI nodes for register allocation", false, false)
219
220void PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const {
221 AU.addUsedIfAvailable<SlotIndexesWrapperPass>();
222 AU.addUsedIfAvailable<LiveIntervalsWrapperPass>();
223 AU.addUsedIfAvailable<MachineLoopInfoWrapperPass>();
224 AU.addPreserved<SlotIndexesWrapperPass>();
225 AU.addPreserved<LiveIntervalsWrapperPass>();
226 AU.addPreserved<MachineDominatorTreeWrapperPass>();
227 AU.addPreserved<MachinePostDominatorTreeWrapperPass>();
228 AU.addPreserved<MachineLoopInfoWrapperPass>();
229 AU.addPreserved<MachineBlockFrequencyInfoWrapperPass>();
230 AU.addPreserved<MachineRegisterClassInfoWrapperPass>();
232}
233
234bool PHIEliminationImpl::run(MachineFunction &MF) {
235 MRI = &MF.getRegInfo();
236
237 MachineDomTreeUpdater MDTU(MDT, PDT,
238 MachineDomTreeUpdater::UpdateStrategy::Lazy);
239
240 bool Changed = false;
241
242 // Split critical edges to help the coalescer.
243 if (!DisableEdgeSplitting && LIS) {
244 for (auto &MBB : MF)
245 Changed |= SplitPHIEdges(MF, MBB, MLI, MDTU);
246 }
247
248 // This pass takes the function out of SSA form.
249 MRI->leaveSSA();
250
251 // Populate VRegPHIUseCount
252 if (LIS)
253 analyzePHINodes(MF);
254
255 // Eliminate PHI instructions by inserting copies into predecessor blocks.
256 for (auto &MBB : MF)
257 Changed |= EliminatePHINodes(MF, MBB);
258
259 // Remove dead IMPLICIT_DEF instructions.
260 for (MachineInstr *DefMI : ImpDefs) {
261 Register DefReg = DefMI->getOperand(0).getReg();
262 if (MRI->use_nodbg_empty(DefReg)) {
263 if (SI)
264 SI->removeMachineInstrFromMaps(*DefMI);
266 }
267 }
268
269 // Clean up the lowered PHI instructions.
270 for (auto &I : LoweredPHIs) {
271 if (SI)
272 SI->removeMachineInstrFromMaps(*I.first);
273 MF.deleteMachineInstr(I.first);
274 }
275
276 LoweredPHIs.clear();
277
278 // Different lanes may be used by different PHI source copies, or may already
279 // be dead in a predecessor. The main range's last use is therefore not a
280 // valid endpoint for every subrange. Wait until all PHIs have been removed
281 // before shrinking subranges to their remaining lane-specific uses.
282 for (Register Reg : PHISrcRegsToShrink) {
283 LiveInterval &LI = LIS->getInterval(Reg);
284 for (LiveInterval::SubRange &SR : LI.subranges())
285 LIS->shrinkToUses(SR, Reg);
286 }
287 PHISrcRegsToShrink.clear();
288
289 ImpDefs.clear();
290 VRegPHIUseCount.clear();
291
292 MF.getProperties().setNoPHIs();
293
294 return Changed;
295}
296
297/// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions in
298/// predecessor basic blocks.
299bool PHIEliminationImpl::EliminatePHINodes(MachineFunction &MF,
301 if (MBB.empty() || !MBB.front().isPHI())
302 return false; // Quick exit for basic blocks without PHIs.
303
304 // Get an iterator to the last PHI node.
306 std::prev(MBB.SkipPHIsAndLabels(MBB.begin()));
307
308 // If all incoming edges are critical, we try to deduplicate identical PHIs so
309 // that we generate fewer copies. If at any edge is non-critical, we either
310 // have less than two predecessors (=> no PHIs) or a predecessor has only us
311 // as a successor (=> identical PHI node can't occur in different block).
312 bool AllEdgesCritical = MBB.pred_size() >= 2;
313 for (MachineBasicBlock *Pred : MBB.predecessors()) {
314 if (Pred->succ_size() < 2) {
315 AllEdgesCritical = false;
316 break;
317 }
318 }
319
320 while (MBB.front().isPHI())
321 LowerPHINode(MBB, LastPHIIt, AllEdgesCritical);
322
323 return true;
324}
325
326/// Return true if all defs of VirtReg are implicit-defs.
327/// This includes registers with no defs.
328static bool isImplicitlyDefined(Register VirtReg,
329 const MachineRegisterInfo &MRI) {
330 for (MachineInstr &DI : MRI.def_instructions(VirtReg))
331 if (!DI.isImplicitDef())
332 return false;
333 return true;
334}
335
336/// Return true if all sources of the phi node are implicit_def's, or undef's.
337static bool allPhiOperandsUndefined(const MachineInstr &MPhi,
338 const MachineRegisterInfo &MRI) {
339 for (unsigned I = 1, E = MPhi.getNumOperands(); I != E; I += 2) {
340 const MachineOperand &MO = MPhi.getOperand(I);
341 if (!isImplicitlyDefined(MO.getReg(), MRI) && !MO.isUndef())
342 return false;
343 }
344 return true;
345}
346/// LowerPHINode - Lower the PHI node at the top of the specified block.
347void PHIEliminationImpl::LowerPHINode(MachineBasicBlock &MBB,
349 bool AllEdgesCritical) {
350 ++NumLowered;
351
352 MachineBasicBlock::iterator AfterPHIsIt = std::next(LastPHIIt);
353
354 // Unlink the PHI node from the basic block, but don't delete the PHI yet.
355 MachineInstr *MPhi = MBB.remove(&*MBB.begin());
356
357 unsigned NumSrcs = (MPhi->getNumOperands() - 1) / 2;
358 Register DestReg = MPhi->getOperand(0).getReg();
359 assert(MPhi->getOperand(0).getSubReg() == 0 && "Can't handle sub-reg PHIs");
360
361 // Create a new register for the incoming PHI arguments.
363 Register IncomingReg;
364 bool EliminateNow = true; // delay elimination of nodes in LoweredPHIs
365 bool reusedIncoming = false; // Is IncomingReg reused from an earlier PHI?
366
367 // Insert a register to register copy at the top of the current block (but
368 // after any remaining phi nodes) which copies the new incoming register
369 // into the phi node destination.
370 MachineInstr *PHICopy = nullptr;
372 if (allPhiOperandsUndefined(*MPhi, *MRI))
373 // If all sources of a PHI node are implicit_def or undef uses, just emit an
374 // implicit_def instead of a copy.
375 PHICopy = BuildMI(MBB, AfterPHIsIt, MPhi->getDebugLoc(),
376 TII->get(TargetOpcode::IMPLICIT_DEF), DestReg);
377 else {
378 // Can we reuse an earlier PHI node? This only happens for critical edges,
379 // typically those created by tail duplication. Typically, an identical PHI
380 // node can't occur, so avoid hashing/storing such PHIs, which is somewhat
381 // expensive.
382 Register *Entry = nullptr;
383 if (AllEdgesCritical)
384 Entry = &LoweredPHIs[MPhi];
385 if (Entry && *Entry) {
386 // An identical PHI node was already lowered. Reuse the incoming register.
387 IncomingReg = *Entry;
388 reusedIncoming = true;
389 ++NumReused;
390 LLVM_DEBUG(dbgs() << "Reusing " << printReg(IncomingReg) << " for "
391 << *MPhi);
392 } else {
393 const TargetRegisterClass *RC = MF.getRegInfo().getRegClass(DestReg);
394 IncomingReg = MF.getRegInfo().createVirtualRegister(RC);
395 if (Entry) {
396 EliminateNow = false;
397 *Entry = IncomingReg;
398 }
399 }
400
401 // Give the target possiblity to handle special cases fallthrough otherwise
402 PHICopy = TII->createPHIDestinationCopy(
403 MBB, AfterPHIsIt, MPhi->getDebugLoc(), IncomingReg, DestReg);
404 }
405
406 if (MPhi->peekDebugInstrNum() && IncomingReg) {
407 // If referred to by debug-info, store where this PHI was.
409 unsigned ID = MPhi->peekDebugInstrNum();
410 auto P = MachineFunction::DebugPHIRegallocPos(&MBB, IncomingReg, 0);
411 auto Res = MF->DebugPHIPositions.insert({ID, P});
412 assert(Res.second);
413 (void)Res;
414 }
415
416 // Update LiveIntervals for the new copy or implicit def.
417 SlotIndex DestCopyIndex;
418 if (SI)
419 DestCopyIndex = SI->insertMachineInstrInMaps(*PHICopy);
420
421 if (LIS) {
422 assert(DestCopyIndex.isValid() &&
423 "Expected a valid SlotIndex if LIS is available.");
424 SlotIndex MBBStartIndex = LIS->getMBBStartIdx(&MBB);
425 if (IncomingReg) {
426 // Add the region from the beginning of MBB to the copy instruction to
427 // IncomingReg's live interval.
428 LiveInterval &IncomingLI = LIS->getOrCreateEmptyInterval(IncomingReg);
429 VNInfo *IncomingVNI = IncomingLI.getVNInfoAt(MBBStartIndex);
430 if (!IncomingVNI)
431 IncomingVNI =
432 IncomingLI.getNextValue(MBBStartIndex, LIS->getVNInfoAllocator());
434 MBBStartIndex, DestCopyIndex.getRegSlot(), IncomingVNI));
435 }
436
437 LiveInterval &DestLI = LIS->getInterval(DestReg);
438 assert(!DestLI.empty() && "PHIs should have non-empty LiveIntervals.");
439
440 // Make sure the instruction's dead flag matches the dead range created
441 // below.
442 if (DestLI.endIndex().isDead())
443 PHICopy->getOperand(0).setIsDead();
444
445 SlotIndex NewStart = DestCopyIndex.getRegSlot();
446
447 SmallVector<LiveRange *> ToUpdate({&DestLI});
448 for (auto &SR : DestLI.subranges())
449 ToUpdate.push_back(&SR);
450
451 for (auto LR : ToUpdate) {
452 auto DestSegment = LR->find(MBBStartIndex);
453 assert(DestSegment != LR->end() &&
454 "PHI destination must be live in block");
455
456 if (LR->endIndex().isDead()) {
457 // A dead PHI's live range begins and ends at the start of the MBB, but
458 // the lowered copy, which will still be dead, needs to begin and end at
459 // the copy instruction.
460 VNInfo *OrigDestVNI = LR->getVNInfoAt(DestSegment->start);
461 assert(OrigDestVNI && "PHI destination should be live at block entry.");
462 LR->removeSegment(DestSegment->start, DestSegment->start.getDeadSlot());
463 LR->createDeadDef(NewStart, LIS->getVNInfoAllocator());
464 LR->removeValNo(OrigDestVNI);
465 continue;
466 }
467
468 // Destination copies are not inserted in the same order as the PHI nodes
469 // they replace. Hence the start of the live range may need to be adjusted
470 // to match the actual slot index of the copy.
471 if (DestSegment->start > NewStart) {
472 VNInfo *VNI = LR->getVNInfoAt(DestSegment->start);
473 assert(VNI && "value should be defined for known segment");
474 LR->addSegment(
475 LiveInterval::Segment(NewStart, DestSegment->start, VNI));
476 } else if (DestSegment->start < NewStart) {
477 assert(DestSegment->start >= MBBStartIndex);
478 assert(DestSegment->end >= DestCopyIndex.getRegSlot());
479 LR->removeSegment(DestSegment->start, NewStart);
480 }
481 VNInfo *DestVNI = LR->getVNInfoAt(NewStart);
482 assert(DestVNI && "PHI destination should be live at its definition.");
483 DestVNI->def = NewStart;
484 }
485 }
486
487 // Adjust the VRegPHIUseCount map to account for the removal of this PHI node.
488 if (LIS) {
489 for (unsigned i = 1; i != MPhi->getNumOperands(); i += 2) {
490 if (!MPhi->getOperand(i).isUndef()) {
491 --VRegPHIUseCount[BBVRegPair(
492 MPhi->getOperand(i + 1).getMBB()->getNumber(),
493 MPhi->getOperand(i).getReg())];
494 }
495 }
496 }
497
498 // Now loop over all of the incoming arguments, changing them to copy into the
499 // IncomingReg register in the corresponding predecessor basic block.
501 for (int i = NumSrcs - 1; i >= 0; --i) {
502 Register SrcReg = MPhi->getOperand(i * 2 + 1).getReg();
503 unsigned SrcSubReg = MPhi->getOperand(i * 2 + 1).getSubReg();
504 bool SrcUndef = MPhi->getOperand(i * 2 + 1).isUndef() ||
505 isImplicitlyDefined(SrcReg, *MRI);
506 assert(SrcReg.isVirtual() &&
507 "Machine PHI Operands must all be virtual registers!");
508
509 // Get the MachineBasicBlock equivalent of the BasicBlock that is the source
510 // path the PHI.
511 MachineBasicBlock &opBlock = *MPhi->getOperand(i * 2 + 2).getMBB();
512
513 // Check to make sure we haven't already emitted the copy for this block.
514 // This can happen because PHI nodes may have multiple entries for the same
515 // basic block.
516 if (!MBBsInsertedInto.insert(&opBlock).second)
517 continue; // If the copy has already been emitted, we're done.
518
519 MachineInstr *SrcRegDef = MRI->getVRegDef(SrcReg);
520 if (SrcRegDef && TII->isUnspillableTerminator(SrcRegDef)) {
521 assert(SrcRegDef->getOperand(0).isReg() &&
522 SrcRegDef->getOperand(0).isDef() &&
523 "Expected operand 0 to be a reg def!");
524 // Now that the PHI's use has been removed (as the instruction was
525 // removed) there should be no other uses of the SrcReg.
526 assert(MRI->use_empty(SrcReg) &&
527 "Expected a single use from UnspillableTerminator");
528 SrcRegDef->getOperand(0).setReg(IncomingReg);
529
530 if (LIS) {
531 LiveInterval &SrcLI = LIS->getInterval(SrcReg);
532 SlotIndex DefIdx = LIS->getInstructionIndex(*SrcRegDef).getRegSlot();
533 LiveInterval &IncomingLI = LIS->getOrCreateEmptyInterval(IncomingReg);
534 VNInfo *VNI =
535 IncomingLI.getNextValue(DefIdx, LIS->getVNInfoAllocator());
536 for (const LiveInterval::Segment &S : SrcLI)
537 IncomingLI.addSegment(LiveInterval::Segment(S.start, S.end, VNI));
538 LIS->removeInterval(SrcReg);
539 }
540
541 continue;
542 }
543
544 // Find a safe location to insert the copy, this may be the first terminator
545 // in the block (or end()).
547 findPHICopyInsertPoint(&opBlock, &MBB, SrcReg);
548
549 // Insert the copy.
550 MachineInstr *NewSrcInstr = nullptr;
551 if (!reusedIncoming && IncomingReg) {
552 if (SrcUndef) {
553 // The source register is undefined, so there is no need for a real
554 // COPY, but we still need to ensure joint dominance by defs.
555 // Insert an IMPLICIT_DEF instruction.
556 NewSrcInstr =
557 BuildMI(opBlock, InsertPos, MPhi->getDebugLoc(),
558 TII->get(TargetOpcode::IMPLICIT_DEF), IncomingReg);
559
560 // Clean up the old implicit-def, if there even was one.
561 if (MachineInstr *DefMI = MRI->getVRegDef(SrcReg))
562 if (DefMI->isImplicitDef())
563 ImpDefs.insert(DefMI);
564 } else {
565 // Delete the debug location, since the copy is inserted into a
566 // different basic block.
567 NewSrcInstr = TII->createPHISourceCopy(opBlock, InsertPos, nullptr,
568 SrcReg, SrcSubReg, IncomingReg);
569 }
570 }
571
572 if (SI && NewSrcInstr)
573 SI->insertMachineInstrInMaps(*NewSrcInstr);
574
575 if (LIS) {
576 if (NewSrcInstr) {
577 assert(
578 SI &&
579 "Expected SI to be available to insert new MI if LIS is available");
580 LIS->addSegmentToEndOfBlock(IncomingReg, *NewSrcInstr);
581 }
582
583 if (!SrcUndef &&
584 !VRegPHIUseCount[BBVRegPair(opBlock.getNumber(), SrcReg)]) {
585 LiveInterval &SrcLI = LIS->getInterval(SrcReg);
586 if (SrcLI.hasSubRanges())
587 PHISrcRegsToShrink.insert(SrcReg);
588
589 bool isLiveOut = false;
590 for (MachineBasicBlock *Succ : opBlock.successors()) {
591 SlotIndex startIdx = LIS->getMBBStartIdx(Succ);
592 VNInfo *VNI = SrcLI.getVNInfoAt(startIdx);
593
594 // Definitions by other PHIs are not truly live-in for our purposes.
595 if (VNI && VNI->def != startIdx) {
596 isLiveOut = true;
597 break;
598 }
599 }
600
601 if (!isLiveOut) {
602 MachineBasicBlock::iterator KillInst = opBlock.end();
603 for (MachineBasicBlock::iterator Term = InsertPos;
604 Term != opBlock.end(); ++Term) {
605 if (Term->readsRegister(SrcReg, /*TRI=*/nullptr))
606 KillInst = Term;
607 }
608
609 if (KillInst == opBlock.end()) {
610 // No terminator uses the register.
611
612 if (reusedIncoming || !IncomingReg) {
613 // We may have to rewind a bit if we didn't just insert a copy.
614 KillInst = InsertPos;
615 while (KillInst != opBlock.begin()) {
616 --KillInst;
617 if (KillInst->isDebugInstr())
618 continue;
619 if (KillInst->readsRegister(SrcReg, /*TRI=*/nullptr))
620 break;
621 }
622 } else {
623 // We just inserted this copy.
624 KillInst = std::prev(InsertPos);
625 }
626 }
627 assert(KillInst->readsRegister(SrcReg, /*TRI=*/nullptr) &&
628 "Cannot find kill instruction");
629
630 SlotIndex LastUseIndex = LIS->getInstructionIndex(*KillInst);
631 SrcLI.removeSegment(LastUseIndex.getRegSlot(),
632 LIS->getMBBEndIdx(&opBlock));
633 }
634 }
635 }
636 }
637
638 // Really delete the PHI instruction now, if it is not in the LoweredPHIs map.
639 if (EliminateNow) {
640 if (SI)
641 SI->removeMachineInstrFromMaps(*MPhi);
642 MF.deleteMachineInstr(MPhi);
643 }
644}
645
646/// analyzePHINodes - Gather information about the PHI nodes in here. In
647/// particular, we want to map the number of uses of a virtual register which is
648/// used in a PHI node. We map that to the BB the vreg is coming from. This is
649/// used later to determine when the vreg is killed in the BB.
650void PHIEliminationImpl::analyzePHINodes(const MachineFunction &MF) {
651 for (const auto &MBB : MF) {
652 for (const auto &BBI : MBB) {
653 if (!BBI.isPHI())
654 break;
655 for (unsigned i = 1, e = BBI.getNumOperands(); i != e; i += 2) {
656 if (!BBI.getOperand(i).isUndef()) {
657 ++VRegPHIUseCount[BBVRegPair(
658 BBI.getOperand(i + 1).getMBB()->getNumber(),
659 BBI.getOperand(i).getReg())];
660 }
661 }
662 }
663 }
664}
665
666bool PHIEliminationImpl::SplitPHIEdges(MachineFunction &MF,
668 MachineLoopInfo *MLI,
669 MachineDomTreeUpdater &MDTU) {
670 if (MBB.empty() || !MBB.front().isPHI() || MBB.isEHPad())
671 return false; // Quick exit for basic blocks without PHIs.
672
673 const MachineLoop *CurLoop = MLI ? MLI->getLoopFor(&MBB) : nullptr;
674 bool IsLoopHeader = CurLoop && &MBB == CurLoop->getHeader();
675
676 bool Changed = false;
677 for (MachineBasicBlock::iterator BBI = MBB.begin(), BBE = MBB.end();
678 BBI != BBE && BBI->isPHI(); ++BBI) {
679 for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2) {
680 Register Reg = BBI->getOperand(i).getReg();
681 MachineBasicBlock *PreMBB = BBI->getOperand(i + 1).getMBB();
682 // Is there a critical edge from PreMBB to MBB?
683 if (PreMBB->succ_size() == 1)
684 continue;
685
686 // Avoid splitting backedges of loops. It would introduce small
687 // out-of-line blocks into the loop which is very bad for code placement.
688 if (PreMBB == &MBB && !SplitAllCriticalEdges)
689 continue;
690 const MachineLoop *PreLoop = MLI ? MLI->getLoopFor(PreMBB) : nullptr;
691 if (IsLoopHeader && PreLoop == CurLoop && !SplitAllCriticalEdges)
692 continue;
693
694 // isLiveOutPastPHIs only returns true when the source register is
695 // live-out for some other reason than a phi use. That means the copy we
696 // will insert in PreMBB won't be a kill, and there is a risk it may not
697 // be coalesced away.
698 //
699 // If the copy would be a kill, there is no need to split the edge.
700 bool ShouldSplit = isLiveOutPastPHIs(Reg, PreMBB);
701 if (!ShouldSplit && !NoPhiElimLiveOutEarlyExit)
702 continue;
703 if (ShouldSplit) {
704 LLVM_DEBUG(dbgs() << printReg(Reg) << " live-out before critical edge "
705 << printMBBReference(*PreMBB) << " -> "
706 << printMBBReference(MBB) << ": " << *BBI);
707 }
708
709 // If Reg is not live-in to MBB, it means it must be live-in to some
710 // other PreMBB successor, and we can avoid the interference by splitting
711 // the edge.
712 //
713 // If Reg *is* live-in to MBB, the interference is inevitable and a copy
714 // is likely to be left after coalescing. If we are looking at a loop
715 // exiting edge, split it so we won't insert code in the loop, otherwise
716 // don't bother.
717 ShouldSplit = ShouldSplit && !isLiveIn(Reg, &MBB);
718
719 // Check for a loop exiting edge.
720 if (!ShouldSplit && CurLoop != PreLoop) {
721 LLVM_DEBUG({
722 dbgs() << "Split wouldn't help, maybe avoid loop copies?\n";
723 if (PreLoop)
724 dbgs() << "PreLoop: " << *PreLoop;
725 if (CurLoop)
726 dbgs() << "CurLoop: " << *CurLoop;
727 });
728 // This edge could be entering a loop, exiting a loop, or it could be
729 // both: Jumping directly form one loop to the header of a sibling
730 // loop.
731 // Split unless this edge is entering CurLoop from an outer loop.
732 ShouldSplit = PreLoop && !PreLoop->contains(CurLoop);
733 }
734 if (!ShouldSplit && !SplitAllCriticalEdges)
735 continue;
736 if (LiveOutSets.empty())
737 computeLiveOutSets(MF);
738 MachineBasicBlock *NewBB =
739 PreMBB->SplitCriticalEdge(&MBB, {LIS, SI, MLI, &LiveOutSets}, &MDTU);
740 if (!NewBB) {
741 LLVM_DEBUG(dbgs() << "Failed to split critical edge.\n");
742 continue;
743 }
744
745 // Patch up MBFI after split if it is available.
746 if (MBFI) {
747 assert(MBPI);
748 MBFI->onEdgeSplit(*PreMBB, *NewBB, *MBPI);
749 }
750
751 Changed = true;
752 ++NumCriticalEdgesSplit;
753 }
754 }
755 return Changed;
756}
757
758void PHIEliminationImpl::computeLiveOutSets(const MachineFunction &MF) {
759 LiveOutSets.resize(MF.getNumBlockIDs());
760 for (unsigned Idx = 0, NumVRegs = MRI->getNumVirtRegs(); Idx != NumVRegs;
761 ++Idx) {
763 if (!LIS->hasInterval(Reg))
764 continue;
765 for (const LiveRange::Segment &S : LIS->getInterval(Reg)) {
766 for (const MachineBasicBlock *MBB = LIS->getMBBFromIndex(S.start);
767 MBB && LIS->getMBBEndIdx(MBB) <= S.end; MBB = MBB->getNextNode())
768 LiveOutSets[MBB->getNumber()].set(Idx);
769 }
770 }
771}
772
773bool PHIEliminationImpl::isLiveIn(Register Reg, const MachineBasicBlock *MBB) {
774 assert(LIS && "isLiveIn() requires LiveIntervals");
775 return LIS->isLiveInToMBB(LIS->getInterval(Reg), MBB);
776}
777
778bool PHIEliminationImpl::isLiveOutPastPHIs(Register Reg,
779 const MachineBasicBlock *MBB) {
780 assert(LIS && "isLiveOutPastPHIs() requires LiveIntervals");
781 // LiveIntervals considers uses in PHIs to be on the edge rather than in the
782 // predecessor basic block, so that a register used only in a PHI is live out
783 // of the block.
784 const LiveInterval &LI = LIS->getInterval(Reg);
785 for (const MachineBasicBlock *SI : MBB->successors())
786 if (LI.liveAt(LIS->getMBBStartIdx(SI)))
787 return true;
788 return false;
789}
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseMap class.
#define DEBUG_TYPE
const HexagonInstrInfo * TII
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
#define P(N)
static bool allPhiOperandsUndefined(const MachineInstr &MPhi, const MachineRegisterInfo &MRI)
Return true if all sources of the phi node are implicit_def's, or undef's.
static cl::opt< bool > NoPhiElimLiveOutEarlyExit("no-phi-elim-live-out-early-exit", cl::init(false), cl::Hidden, cl::desc("Do not use an early exit if isLiveOutPastPHIs returns true."))
static bool isImplicitlyDefined(Register VirtReg, const MachineRegisterInfo &MRI)
Return true if all defs of VirtReg are implicit-defs.
static cl::opt< bool > DisableEdgeSplitting("disable-phi-elim-edge-splitting", cl::init(false), cl::Hidden, cl::desc("Disable critical edge splitting " "during PHI elimination"))
static cl::opt< bool > SplitAllCriticalEdges("phi-elim-split-all-critical-edges", cl::init(false), cl::Hidden, cl::desc("Split all critical edges during " "PHI elimination"))
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
static bool isLiveOut(const MachineBasicBlock &MBB, unsigned Reg)
This file defines the SmallPtrSet class.
This file defines the SmallSet class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
Represent the analysis usage information of a pass.
A live range for subregisters.
LiveInterval - This class represents the liveness of a register, or stack slot.
bool hasSubRanges() const
Returns true if subregister liveness information is available.
iterator_range< subrange_iterator > subranges()
bool hasInterval(Register Reg) const
SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const
Return the first index in the given basic block.
LiveInterval & getOrCreateEmptyInterval(Register Reg)
Return an existing interval for Reg.
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
VNInfo::Allocator & getVNInfoAllocator()
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
LiveInterval & getInterval(Register Reg)
void removeInterval(Register Reg)
Interval removal.
LLVM_ABI LiveInterval::Segment addSegmentToEndOfBlock(Register Reg, MachineInstr &startInst)
Given a register and an instruction, adds a live segment from that instruction to the end of its MBB.
LLVM_ABI bool shrinkToUses(LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=nullptr)
After removing some uses of a register, shrink its live range to just the remaining uses.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
bool isLiveInToMBB(const LiveRange &LR, const MachineBasicBlock *mbb) const
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
bool liveAt(SlotIndex index) const
bool empty() const
SlotIndex endIndex() const
endNumber - return the maximum point of the range of the whole, exclusive.
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
LLVM_ABI void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
BlockT * getHeader() const
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
const MachineBlockFrequencyInfo & getMBFI() const
Definition MBFIWrapper.h:37
bool isEHPad() const
Returns true if the block is a landing pad.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
LLVM_ABI iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
MachineInstr * remove(MachineInstr *I)
Remove the unbundled instruction from the instruction list without deleting it.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineBasicBlock * SplitCriticalEdge(MachineBasicBlock *Succ, Pass &P, MachineDomTreeUpdater *MDTU=nullptr)
iterator_range< succ_iterator > successors()
iterator_range< pred_iterator > predecessors()
MachineInstrBundleIterator< MachineInstr > iterator
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
LLVM_ABI void onEdgeSplit(const MachineBasicBlock &NewPredecessor, const MachineBasicBlock &NewSuccessor, const MachineBranchProbabilityInfo &MBPI)
incrementally calculate block frequencies when we split edges, to avoid full CFG traversal.
Analysis pass which computes a MachineDominatorTree.
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
Location of a PHI instruction that is also a debug-info variable value, for the duration of register ...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
DenseMap< unsigned, DebugPHIRegallocPos > DebugPHIPositions
Map of debug instruction numbers to the position of their PHI instructions during register allocation...
Representation of each machine instruction.
bool isImplicitDef() const
unsigned getNumOperands() const
Retuns the total number of operands.
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI MachineInstrBundleIterator< MachineInstr > eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
Analysis pass that exposes the MachineLoopInfo for a machine function.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
void setIsDead(bool Val=true)
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
Register getReg() const
getReg - Returns the register number.
MachinePostDominatorTree - an analysis pass wrapper for DominatorTree used to compute the post-domina...
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI LLVM_READONLY MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
iterator_range< def_instr_iterator > def_instructions(Register Reg) const
bool use_nodbg_empty(Register RegNo) const
use_nodbg_empty - Return true if there are no non-Debug instructions using the specified register.
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
bool use_empty(Register RegNo) const
use_empty - Return true if there are no instructions using the specified register.
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
Wrapper class representing virtual and physical registers.
Definition Register.h:20
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
Definition Register.h:72
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
SlotIndex - An opaque wrapper around machine indexes.
Definition SlotIndexes.h:66
bool isValid() const
Returns true if this is a valid index.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
bool isDead() const
isDead - Returns true if this is a dead def kill slot.
SlotIndexes pass.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:134
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
virtual const TargetInstrInfo * getInstrInfo() const
VNInfo - Value Number Information.
SlotIndex def
The index of the defining instruction.
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition ilist_node.h:348
Changed
@ Entry
Definition COFF.h:862
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
MachineBasicBlock::iterator findPHICopyInsertPoint(MachineBasicBlock *MBB, MachineBasicBlock *SuccMBB, Register SrcReg)
findPHICopyInsertPoint - Find a safe place in MBB to insert a copy from SrcReg when following the CFG...
LLVM_ABI unsigned SplitAllCriticalEdges(Function &F, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions())
Loop over all of the edges in the CFG, breaking critical edges as they are found.
LLVM_ABI char & PHIEliminationID
PHIElimination - This pass eliminates machine instruction PHI nodes by inserting copy instructions.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
This represents a simple continuous liveness interval for a value.