LLVM 22.0.0git
TailDuplicator.cpp
Go to the documentation of this file.
1//===- TailDuplicator.cpp - Duplicate blocks into predecessors' tails -----===//
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 utility class duplicates basic blocks ending in unconditional branches
10// into the tails of their predecessors.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/DenseMap.h"
16#include "llvm/ADT/DenseSet.h"
17#include "llvm/ADT/STLExtras.h"
18#include "llvm/ADT/SetVector.h"
21#include "llvm/ADT/Statistic.h"
34#include "llvm/IR/DebugLoc.h"
35#include "llvm/IR/Function.h"
37#include "llvm/Support/Debug.h"
41#include <cassert>
42#include <iterator>
43#include <utility>
44
45using namespace llvm;
46
47#define DEBUG_TYPE "tailduplication"
48
49STATISTIC(NumTails, "Number of tails duplicated");
50STATISTIC(NumTailDups, "Number of tail duplicated blocks");
51STATISTIC(NumTailDupAdded,
52 "Number of instructions added due to tail duplication");
53STATISTIC(NumTailDupRemoved,
54 "Number of instructions removed due to tail duplication");
55STATISTIC(NumDeadBlocks, "Number of dead blocks removed");
56STATISTIC(NumAddedPHIs, "Number of phis added");
57
58// Heuristic for tail duplication.
60 "tail-dup-size",
61 cl::desc("Maximum instructions to consider tail duplicating"), cl::init(2),
63
65 "tail-dup-indirect-size",
66 cl::desc("Maximum instructions to consider tail duplicating blocks that "
67 "end with indirect branches."), cl::init(20),
69
71 TailDupPredSize("tail-dup-pred-size",
72 cl::desc("Maximum predecessors (maximum successors at the "
73 "same time) to consider tail duplicating blocks."),
74 cl::init(16), cl::Hidden);
75
77 TailDupSuccSize("tail-dup-succ-size",
78 cl::desc("Maximum successors (maximum predecessors at the "
79 "same time) to consider tail duplicating blocks."),
80 cl::init(16), cl::Hidden);
81
82static cl::opt<bool>
83 TailDupVerify("tail-dup-verify",
84 cl::desc("Verify sanity of PHI instructions during taildup"),
85 cl::init(false), cl::Hidden);
86
87static cl::opt<unsigned> TailDupLimit("tail-dup-limit", cl::init(~0U),
89
90void TailDuplicator::initMF(MachineFunction &MFin, bool PreRegAlloc,
91 const MachineBranchProbabilityInfo *MBPIin,
92 MBFIWrapper *MBFIin,
93 ProfileSummaryInfo *PSIin,
94 bool LayoutModeIn, unsigned TailDupSizeIn) {
95 MF = &MFin;
96 TII = MF->getSubtarget().getInstrInfo();
97 TRI = MF->getSubtarget().getRegisterInfo();
98 MRI = &MF->getRegInfo();
99 MBPI = MBPIin;
100 MBFI = MBFIin;
101 PSI = PSIin;
102 TailDupSize = TailDupSizeIn;
103
104 assert(MBPI != nullptr && "Machine Branch Probability Info required");
105
106 LayoutMode = LayoutModeIn;
107 this->PreRegAlloc = PreRegAlloc;
108}
109
110static void VerifyPHIs(MachineFunction &MF, bool CheckExtra) {
113 MBB.pred_end());
115 while (MI != MBB.end()) {
116 if (!MI->isPHI())
117 break;
118 for (MachineBasicBlock *PredBB : Preds) {
119 bool Found = false;
120 for (unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2) {
121 MachineBasicBlock *PHIBB = MI->getOperand(i + 1).getMBB();
122 if (PHIBB == PredBB) {
123 Found = true;
124 break;
125 }
126 }
127 if (!Found) {
128 dbgs() << "Malformed PHI in " << printMBBReference(MBB) << ": "
129 << *MI;
130 dbgs() << " missing input from predecessor "
131 << printMBBReference(*PredBB) << '\n';
132 llvm_unreachable(nullptr);
133 }
134 }
135
136 for (unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2) {
137 MachineBasicBlock *PHIBB = MI->getOperand(i + 1).getMBB();
138 if (CheckExtra && !Preds.count(PHIBB)) {
139 dbgs() << "Warning: malformed PHI in " << printMBBReference(MBB)
140 << ": " << *MI;
141 dbgs() << " extra input from predecessor "
142 << printMBBReference(*PHIBB) << '\n';
143 llvm_unreachable(nullptr);
144 }
145 if (PHIBB->getNumber() < 0) {
146 dbgs() << "Malformed PHI in " << printMBBReference(MBB) << ": "
147 << *MI;
148 dbgs() << " non-existing " << printMBBReference(*PHIBB) << '\n';
149 llvm_unreachable(nullptr);
150 }
151 }
152 ++MI;
153 }
154 }
155}
156
157/// Tail duplicate the block and cleanup.
158/// \p IsSimple - return value of isSimpleBB
159/// \p MBB - block to be duplicated
160/// \p ForcedLayoutPred - If non-null, treat this block as the layout
161/// predecessor, instead of using the ordering in MF
162/// \p DuplicatedPreds - if non-null, \p DuplicatedPreds will contain a list of
163/// all Preds that received a copy of \p MBB.
164/// \p RemovalCallback - if non-null, called just before MBB is deleted.
166 bool IsSimple, MachineBasicBlock *MBB,
167 MachineBasicBlock *ForcedLayoutPred,
169 function_ref<void(MachineBasicBlock *)> *RemovalCallback,
171 // Save the successors list.
173 MBB->succ_end());
174
177 if (!tailDuplicate(IsSimple, MBB, ForcedLayoutPred,
178 TDBBs, Copies, CandidatePtr))
179 return false;
180
181 ++NumTails;
182
184 MachineSSAUpdater SSAUpdate(*MF, &NewPHIs);
185
186 // TailBB's immediate successors are now successors of those predecessors
187 // which duplicated TailBB. Add the predecessors as sources to the PHI
188 // instructions.
189 bool isDead = MBB->pred_empty() && !MBB->hasAddressTaken();
190 if (PreRegAlloc)
191 updateSuccessorsPHIs(MBB, isDead, TDBBs, Succs);
192
193 // If it is dead, remove it.
194 if (isDead) {
195 NumTailDupRemoved += MBB->size();
196 removeDeadBlock(MBB, RemovalCallback);
197 ++NumDeadBlocks;
198 }
199
200 // Update SSA form.
201 if (!SSAUpdateVRs.empty()) {
202 for (Register VReg : SSAUpdateVRs) {
203 SSAUpdate.Initialize(VReg);
204
205 // If the original definition is still around, add it as an available
206 // value.
207 MachineInstr *DefMI = MRI->getVRegDef(VReg);
208 MachineBasicBlock *DefBB = nullptr;
209 if (DefMI) {
210 DefBB = DefMI->getParent();
211 SSAUpdate.AddAvailableValue(DefBB, VReg);
212 }
213
214 // Add the new vregs as available values.
216 SSAUpdateVals.find(VReg);
217 for (std::pair<MachineBasicBlock *, Register> &J : LI->second) {
218 MachineBasicBlock *SrcBB = J.first;
219 Register SrcReg = J.second;
220 SSAUpdate.AddAvailableValue(SrcBB, SrcReg);
221 }
222
224 // Rewrite uses that are outside of the original def's block.
225 for (MachineOperand &UseMO :
227 MachineInstr *UseMI = UseMO.getParent();
228 // Rewrite debug uses last so that they can take advantage of any
229 // register mappings introduced by other users in its BB, since we
230 // cannot create new register definitions specifically for the debug
231 // instruction (as debug instructions should not affect CodeGen).
232 if (UseMI->isDebugValue()) {
233 DebugUses.push_back(&UseMO);
234 continue;
235 }
236 if (UseMI->getParent() == DefBB && !UseMI->isPHI())
237 continue;
238 SSAUpdate.RewriteUse(UseMO);
239 }
240 for (auto *UseMO : DebugUses) {
241 MachineInstr *UseMI = UseMO->getParent();
242 UseMO->setReg(
243 SSAUpdate.GetValueInMiddleOfBlock(UseMI->getParent(), true));
244 }
245 }
246
247 SSAUpdateVRs.clear();
248 SSAUpdateVals.clear();
249 }
250
251 // Eliminate some of the copies inserted by tail duplication to maintain
252 // SSA form.
253 for (MachineInstr *Copy : Copies) {
254 if (!Copy->isCopy())
255 continue;
256 Register Dst = Copy->getOperand(0).getReg();
257 Register Src = Copy->getOperand(1).getReg();
258 if (MRI->hasOneNonDBGUse(Src) &&
259 MRI->constrainRegClass(Src, MRI->getRegClass(Dst))) {
260 // Copy is the only use. Do trivial copy propagation here.
261 MRI->replaceRegWith(Dst, Src);
262 Copy->eraseFromParent();
263 }
264 }
265
266 if (NewPHIs.size())
267 NumAddedPHIs += NewPHIs.size();
268
269 if (DuplicatedPreds)
270 *DuplicatedPreds = std::move(TDBBs);
271
272 return true;
273}
274
275/// Look for small blocks that are unconditionally branched to and do not fall
276/// through. Tail-duplicate their instructions into their predecessors to
277/// eliminate (dynamic) branches.
279 bool MadeChange = false;
280
281 if (PreRegAlloc && TailDupVerify) {
282 LLVM_DEBUG(dbgs() << "\n*** Before tail-duplicating\n");
283 VerifyPHIs(*MF, true);
284 }
285
286 for (MachineBasicBlock &MBB :
288 if (NumTails == TailDupLimit)
289 break;
290
291 bool IsSimple = isSimpleBB(&MBB);
292
293 if (!shouldTailDuplicate(IsSimple, MBB))
294 continue;
295
296 MadeChange |= tailDuplicateAndUpdate(IsSimple, &MBB, nullptr);
297 }
298
299 if (PreRegAlloc && TailDupVerify)
300 VerifyPHIs(*MF, false);
301
302 return MadeChange;
303}
304
306 const MachineRegisterInfo *MRI) {
307 for (MachineInstr &UseMI : MRI->use_instructions(Reg)) {
308 if (UseMI.isDebugValue())
309 continue;
310 if (UseMI.getParent() != BB)
311 return true;
312 }
313 return false;
314}
315
317 for (unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2)
318 if (MI->getOperand(i + 1).getMBB() == SrcBB)
319 return i;
320 return 0;
321}
322
323// Remember which registers are used by phis in this block. This is
324// used to determine which registers are liveout while modifying the
325// block (which is why we need to copy the information).
327 DenseSet<Register> *UsedByPhi) {
328 for (const auto &MI : BB) {
329 if (!MI.isPHI())
330 break;
331 for (unsigned i = 1, e = MI.getNumOperands(); i != e; i += 2) {
332 Register SrcReg = MI.getOperand(i).getReg();
333 UsedByPhi->insert(SrcReg);
334 }
335 }
336}
337
338/// Add a definition and source virtual registers pair for SSA update.
339void TailDuplicator::addSSAUpdateEntry(Register OrigReg, Register NewReg,
340 MachineBasicBlock *BB) {
342 SSAUpdateVals.find(OrigReg);
343 if (LI != SSAUpdateVals.end())
344 LI->second.push_back(std::make_pair(BB, NewReg));
345 else {
346 AvailableValsTy Vals;
347 Vals.push_back(std::make_pair(BB, NewReg));
348 SSAUpdateVals.insert(std::make_pair(OrigReg, Vals));
349 SSAUpdateVRs.push_back(OrigReg);
350 }
351}
352
353/// Process PHI node in TailBB by turning it into a copy in PredBB. Remember the
354/// source register that's contributed by PredBB and update SSA update map.
355void TailDuplicator::processPHI(
358 SmallVectorImpl<std::pair<Register, RegSubRegPair>> &Copies,
359 const DenseSet<Register> &RegsUsedByPhi, bool Remove) {
360 Register DefReg = MI->getOperand(0).getReg();
361 unsigned SrcOpIdx = getPHISrcRegOpIdx(MI, PredBB);
362 assert(SrcOpIdx && "Unable to find matching PHI source?");
363 Register SrcReg = MI->getOperand(SrcOpIdx).getReg();
364 unsigned SrcSubReg = MI->getOperand(SrcOpIdx).getSubReg();
365 const TargetRegisterClass *RC = MRI->getRegClass(DefReg);
366 LocalVRMap.insert(std::make_pair(DefReg, RegSubRegPair(SrcReg, SrcSubReg)));
367
368 // Insert a copy from source to the end of the block. The def register is the
369 // available value liveout of the block.
370 Register NewDef = MRI->createVirtualRegister(RC);
371 Copies.push_back(std::make_pair(NewDef, RegSubRegPair(SrcReg, SrcSubReg)));
372 if (isDefLiveOut(DefReg, TailBB, MRI) || RegsUsedByPhi.count(DefReg))
373 addSSAUpdateEntry(DefReg, NewDef, PredBB);
374
375 if (!Remove)
376 return;
377
378 // Remove PredBB from the PHI node.
379 MI->removeOperand(SrcOpIdx + 1);
380 MI->removeOperand(SrcOpIdx);
381 if (MI->getNumOperands() == 1 && !TailBB->hasAddressTaken())
382 MI->eraseFromParent();
383 else if (MI->getNumOperands() == 1)
384 MI->setDesc(TII->get(TargetOpcode::IMPLICIT_DEF));
385}
386
387/// Duplicate a TailBB instruction to PredBB and update
388/// the source operands due to earlier PHI translation.
389void TailDuplicator::duplicateInstruction(
392 const DenseSet<Register> &UsedByPhi) {
393 // Allow duplication of CFI instructions.
394 if (MI->isCFIInstruction()) {
395 BuildMI(*PredBB, PredBB->end(), PredBB->findDebugLoc(PredBB->begin()),
396 TII->get(TargetOpcode::CFI_INSTRUCTION))
397 .addCFIIndex(MI->getOperand(0).getCFIIndex())
398 .setMIFlags(MI->getFlags());
399 return;
400 }
401 MachineInstr &NewMI = TII->duplicate(*PredBB, PredBB->end(), *MI);
402 if (!PreRegAlloc)
403 return;
404 for (unsigned i = 0, e = NewMI.getNumOperands(); i != e; ++i) {
405 MachineOperand &MO = NewMI.getOperand(i);
406 if (!MO.isReg())
407 continue;
408 Register Reg = MO.getReg();
409 if (!Reg.isVirtual())
410 continue;
411 if (MO.isDef()) {
412 const TargetRegisterClass *RC = MRI->getRegClass(Reg);
413 Register NewReg = MRI->createVirtualRegister(RC);
414 MO.setReg(NewReg);
415 LocalVRMap.insert(std::make_pair(Reg, RegSubRegPair(NewReg, 0)));
416 if (isDefLiveOut(Reg, TailBB, MRI) || UsedByPhi.count(Reg))
417 addSSAUpdateEntry(Reg, NewReg, PredBB);
418 continue;
419 }
420 auto VI = LocalVRMap.find(Reg);
421 if (VI == LocalVRMap.end())
422 continue;
423 // Need to make sure that the register class of the mapped register
424 // will satisfy the constraints of the class of the register being
425 // replaced.
426 auto *OrigRC = MRI->getRegClass(Reg);
427 auto *MappedRC = MRI->getRegClass(VI->second.Reg);
428 const TargetRegisterClass *ConstrRC;
429 if (VI->second.SubReg != 0) {
430 ConstrRC =
431 TRI->getMatchingSuperRegClass(MappedRC, OrigRC, VI->second.SubReg);
432 if (ConstrRC) {
433 // The actual constraining (as in "find appropriate new class")
434 // is done by getMatchingSuperRegClass, so now we only need to
435 // change the class of the mapped register.
436 MRI->setRegClass(VI->second.Reg, ConstrRC);
437 }
438 } else {
439 // For mapped registers that do not have sub-registers, simply
440 // restrict their class to match the original one.
441
442 // We don't want debug instructions affecting the resulting code so
443 // if we're cloning a debug instruction then just use MappedRC
444 // rather than constraining the register class further.
445 ConstrRC = NewMI.isDebugInstr()
446 ? MappedRC
447 : MRI->constrainRegClass(VI->second.Reg, OrigRC);
448 }
449
450 if (ConstrRC) {
451 // If the class constraining succeeded, we can simply replace
452 // the old register with the mapped one.
453 MO.setReg(VI->second.Reg);
454 // We have Reg -> VI.Reg:VI.SubReg, so if Reg is used with a
455 // sub-register, we need to compose the sub-register indices.
456 MO.setSubReg(
457 TRI->composeSubRegIndices(VI->second.SubReg, MO.getSubReg()));
458 } else {
459 // The direct replacement is not possible, due to failing register
460 // class constraints. An explicit COPY is necessary. Create one
461 // that can be reused.
462 Register NewReg = MRI->createVirtualRegister(OrigRC);
463 BuildMI(*PredBB, NewMI, NewMI.getDebugLoc(), TII->get(TargetOpcode::COPY),
464 NewReg)
465 .addReg(VI->second.Reg, 0, VI->second.SubReg);
466 LocalVRMap.erase(VI);
467 LocalVRMap.insert(std::make_pair(Reg, RegSubRegPair(NewReg, 0)));
468 MO.setReg(NewReg);
469 // The composed VI.Reg:VI.SubReg is replaced with NewReg, which
470 // is equivalent to the whole register Reg. Hence, Reg:subreg
471 // is same as NewReg:subreg, so keep the sub-register index
472 // unchanged.
473 }
474 // Clear any kill flags from this operand. The new register could
475 // have uses after this one, so kills are not valid here.
476 MO.setIsKill(false);
477 }
478}
479
480/// After FromBB is tail duplicated into its predecessor blocks, the successors
481/// have gained new predecessors. Update the PHI instructions in them
482/// accordingly.
483void TailDuplicator::updateSuccessorsPHIs(
484 MachineBasicBlock *FromBB, bool isDead,
487 for (MachineBasicBlock *SuccBB : Succs) {
488 for (MachineInstr &MI : *SuccBB) {
489 if (!MI.isPHI())
490 break;
491 MachineInstrBuilder MIB(*FromBB->getParent(), MI);
492 unsigned Idx = 0;
493 for (unsigned i = 1, e = MI.getNumOperands(); i != e; i += 2) {
494 MachineOperand &MO = MI.getOperand(i + 1);
495 if (MO.getMBB() == FromBB) {
496 Idx = i;
497 break;
498 }
499 }
500
501 assert(Idx != 0);
502 MachineOperand &MO0 = MI.getOperand(Idx);
503 Register Reg = MO0.getReg();
504 if (isDead) {
505 // Folded into the previous BB.
506 // There could be duplicate phi source entries. FIXME: Should sdisel
507 // or earlier pass fixed this?
508 for (unsigned i = MI.getNumOperands() - 2; i != Idx; i -= 2) {
509 MachineOperand &MO = MI.getOperand(i + 1);
510 if (MO.getMBB() == FromBB) {
511 MI.removeOperand(i + 1);
512 MI.removeOperand(i);
513 }
514 }
515 } else
516 Idx = 0;
517
518 // If Idx is set, the operands at Idx and Idx+1 must be removed.
519 // We reuse the location to avoid expensive removeOperand calls.
520
522 SSAUpdateVals.find(Reg);
523 if (LI != SSAUpdateVals.end()) {
524 // This register is defined in the tail block.
525 for (const std::pair<MachineBasicBlock *, Register> &J : LI->second) {
526 MachineBasicBlock *SrcBB = J.first;
527 // If we didn't duplicate a bb into a particular predecessor, we
528 // might still have added an entry to SSAUpdateVals to correcly
529 // recompute SSA. If that case, avoid adding a dummy extra argument
530 // this PHI.
531 if (!SrcBB->isSuccessor(SuccBB))
532 continue;
533
534 Register SrcReg = J.second;
535 if (Idx != 0) {
536 MI.getOperand(Idx).setReg(SrcReg);
537 MI.getOperand(Idx + 1).setMBB(SrcBB);
538 Idx = 0;
539 } else {
540 MIB.addReg(SrcReg).addMBB(SrcBB);
541 }
542 }
543 } else {
544 // Live in tail block, must also be live in predecessors.
545 for (MachineBasicBlock *SrcBB : TDBBs) {
546 if (Idx != 0) {
547 MI.getOperand(Idx).setReg(Reg);
548 MI.getOperand(Idx + 1).setMBB(SrcBB);
549 Idx = 0;
550 } else {
551 MIB.addReg(Reg).addMBB(SrcBB);
552 }
553 }
554 }
555 if (Idx != 0) {
556 MI.removeOperand(Idx + 1);
557 MI.removeOperand(Idx);
558 }
559 }
560 }
561}
562
563/// Determine if it is profitable to duplicate this block.
565 MachineBasicBlock &TailBB) {
566 // When doing tail-duplication during layout, the block ordering is in flux,
567 // so canFallThrough returns a result based on incorrect information and
568 // should just be ignored.
569 if (!LayoutMode && TailBB.canFallThrough())
570 return false;
571
572 // Don't try to tail-duplicate single-block loops.
573 if (TailBB.isSuccessor(&TailBB))
574 return false;
575
576 // Set the limit on the cost to duplicate. When optimizing for size,
577 // duplicate only one, because one branch instruction can be eliminated to
578 // compensate for the duplication.
579 unsigned MaxDuplicateCount;
580 if (TailDupSize == 0)
581 MaxDuplicateCount = TailDuplicateSize;
582 else
583 MaxDuplicateCount = TailDupSize;
584 if (llvm::shouldOptimizeForSize(&TailBB, PSI, MBFI))
585 MaxDuplicateCount = 1;
586
587 // If the block to be duplicated ends in an unanalyzable fallthrough, don't
588 // duplicate it.
589 // A similar check is necessary in MachineBlockPlacement to make sure pairs of
590 // blocks with unanalyzable fallthrough get layed out contiguously.
591 MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
593 if (TII->analyzeBranch(TailBB, PredTBB, PredFBB, PredCond) &&
594 TailBB.canFallThrough())
595 return false;
596
597 // If the target has hardware branch prediction that can handle indirect
598 // branches, duplicating them can often make them predictable when there
599 // are common paths through the code. The limit needs to be high enough
600 // to allow undoing the effects of tail merging and other optimizations
601 // that rearrange the predecessors of the indirect branch.
602
603 bool HasIndirectbr = false;
604 bool HasComputedGoto = false;
605 if (!TailBB.empty()) {
606 HasIndirectbr = TailBB.back().isIndirectBranch();
607 HasComputedGoto = TailBB.terminatorIsComputedGotoWithSuccessors();
608 }
609
610 if (HasIndirectbr && PreRegAlloc)
611 MaxDuplicateCount = TailDupIndirectBranchSize;
612
613 // Allow higher limits when the block has computed-gotos and running after
614 // register allocation. NB. This basically unfactors computed gotos that were
615 // factored early on in the compilation process to speed up edge based data
616 // flow. If we do not unfactor them again, it can seriously pessimize code
617 // with many computed jumps in the source code, such as interpreters.
618 // Therefore we do not restrict the computed gotos.
619 if (HasComputedGoto && !PreRegAlloc)
620 MaxDuplicateCount = std::max(MaxDuplicateCount, 10u);
621
622 // Check the instructions in the block to determine whether tail-duplication
623 // is invalid or unlikely to be profitable.
624 unsigned InstrCount = 0;
625 unsigned NumPhis = 0;
626 for (MachineInstr &MI : TailBB) {
627 // Non-duplicable things shouldn't be tail-duplicated.
628 // CFI instructions are marked as non-duplicable, because Darwin compact
629 // unwind info emission can't handle multiple prologue setups. In case of
630 // DWARF, allow them be duplicated, so that their existence doesn't prevent
631 // tail duplication of some basic blocks, that would be duplicated otherwise.
632 if (MI.isNotDuplicable() &&
634 !MI.isCFIInstruction()))
635 return false;
636
637 // Convergent instructions can be duplicated only if doing so doesn't add
638 // new control dependencies, which is what we're going to do here.
639 if (MI.isConvergent())
640 return false;
641
642 // Do not duplicate 'return' instructions if this is a pre-regalloc run.
643 // A return may expand into a lot more instructions (e.g. reload of callee
644 // saved registers) after PEI.
645 if (PreRegAlloc && MI.isReturn())
646 return false;
647
648 // Avoid duplicating calls before register allocation. Calls presents a
649 // barrier to register allocation so duplicating them may end up increasing
650 // spills.
651 if (PreRegAlloc && MI.isCall())
652 return false;
653
654 // TailDuplicator::appendCopies will erroneously place COPYs after
655 // INLINEASM_BR instructions after 4b0aa5724fea, which demonstrates the same
656 // bug that was fixed in f7a53d82c090.
657 // FIXME: Use findPHICopyInsertPoint() to find the correct insertion point
658 // for the COPY when replacing PHIs.
659 if (MI.getOpcode() == TargetOpcode::INLINEASM_BR)
660 return false;
661
662 if (MI.isBundle())
663 InstrCount += MI.getBundleSize();
664 else if (!MI.isPHI() && !MI.isMetaInstruction())
665 InstrCount += 1;
666
667 if (InstrCount > MaxDuplicateCount)
668 return false;
669 NumPhis += MI.isPHI();
670 }
671
672 // Duplicating a BB which has both multiple predecessors and successors will
673 // may cause huge amount of PHI nodes. If we want to remove this limitation,
674 // we have to address https://github.com/llvm/llvm-project/issues/78578.
675 if (PreRegAlloc && TailBB.pred_size() > TailDupPredSize &&
676 TailBB.succ_size() > TailDupSuccSize) {
677 // If TailBB or any of its successors contains a phi, we may have to add a
678 // large number of additional phis with additional incoming values.
679 if (NumPhis != 0 || any_of(TailBB.successors(), [](MachineBasicBlock *MBB) {
680 return any_of(*MBB, [](MachineInstr &MI) { return MI.isPHI(); });
681 }))
682 return false;
683 }
684
685 // Check if any of the successors of TailBB has a PHI node in which the
686 // value corresponding to TailBB uses a subregister.
687 // If a phi node uses a register paired with a subregister, the actual
688 // "value type" of the phi may differ from the type of the register without
689 // any subregisters. Due to a bug, tail duplication may add a new operand
690 // without a necessary subregister, producing an invalid code. This is
691 // demonstrated by test/CodeGen/Hexagon/tail-dup-subreg-abort.ll.
692 // Disable tail duplication for this case for now, until the problem is
693 // fixed.
694 for (auto *SB : TailBB.successors()) {
695 for (auto &I : *SB) {
696 if (!I.isPHI())
697 break;
698 unsigned Idx = getPHISrcRegOpIdx(&I, &TailBB);
699 assert(Idx != 0);
700 MachineOperand &PU = I.getOperand(Idx);
701 if (PU.getSubReg() != 0)
702 return false;
703 }
704 }
705
706 if (HasIndirectbr && PreRegAlloc)
707 return true;
708
709 if (IsSimple)
710 return true;
711
712 if (!PreRegAlloc)
713 return true;
714
715 return canCompletelyDuplicateBB(TailBB);
716}
717
718/// True if this BB has only one unconditional jump.
720 if (TailBB->succ_size() != 1)
721 return false;
722 if (TailBB->pred_empty())
723 return false;
725 if (I == TailBB->end())
726 return true;
727 return I->isUnconditionalBranch();
728}
729
732 for (MachineBasicBlock *BB : A.successors())
733 if (SuccsB.count(BB) && !BB->empty() && BB->begin()->isPHI())
734 return true;
735
736 return false;
737}
738
739bool TailDuplicator::canCompletelyDuplicateBB(MachineBasicBlock &BB) {
740 for (MachineBasicBlock *PredBB : BB.predecessors()) {
741 if (PredBB->succ_size() > 1)
742 return false;
743
744 MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
746 if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond))
747 return false;
748
749 if (!PredCond.empty())
750 return false;
751 }
752 return true;
753}
754
755bool TailDuplicator::duplicateSimpleBB(
757 const DenseSet<Register> &UsedByPhi) {
759 TailBB->successors());
761 bool Changed = false;
762 for (MachineBasicBlock *PredBB : Preds) {
763 if (PredBB->hasEHPadSuccessor() || PredBB->mayHaveInlineAsmBr())
764 continue;
765
766 if (bothUsedInPHI(*PredBB, Succs))
767 continue;
768
769 MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
771 if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond))
772 continue;
773
774 Changed = true;
775 LLVM_DEBUG(dbgs() << "\nTail-duplicating into PredBB: " << *PredBB
776 << "From simple Succ: " << *TailBB);
777
778 MachineBasicBlock *NewTarget = *TailBB->succ_begin();
779 MachineBasicBlock *NextBB = PredBB->getNextNode();
780
781 // Make PredFBB explicit.
782 if (PredCond.empty())
783 PredFBB = PredTBB;
784
785 // Make fall through explicit.
786 if (!PredTBB)
787 PredTBB = NextBB;
788 if (!PredFBB)
789 PredFBB = NextBB;
790
791 // Redirect
792 if (PredFBB == TailBB)
793 PredFBB = NewTarget;
794 if (PredTBB == TailBB)
795 PredTBB = NewTarget;
796
797 // Make the branch unconditional if possible
798 if (PredTBB == PredFBB) {
799 PredCond.clear();
800 PredFBB = nullptr;
801 }
802
803 // Avoid adding fall through branches.
804 if (PredFBB == NextBB)
805 PredFBB = nullptr;
806 if (PredTBB == NextBB && PredFBB == nullptr)
807 PredTBB = nullptr;
808
809 auto DL = PredBB->findBranchDebugLoc();
810 TII->removeBranch(*PredBB);
811
812 if (!PredBB->isSuccessor(NewTarget))
813 PredBB->replaceSuccessor(TailBB, NewTarget);
814 else {
815 PredBB->removeSuccessor(TailBB, true);
816 assert(PredBB->succ_size() <= 1);
817 }
818
819 if (PredTBB)
820 TII->insertBranch(*PredBB, PredTBB, PredFBB, PredCond, DL);
821
822 TDBBs.push_back(PredBB);
823 }
824 return Changed;
825}
826
828 MachineBasicBlock *PredBB) {
829 // EH edges are ignored by analyzeBranch.
830 if (PredBB->succ_size() > 1)
831 return false;
832
833 MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
835 if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond))
836 return false;
837 if (!PredCond.empty())
838 return false;
839 // FIXME: This is overly conservative; it may be ok to relax this in the
840 // future under more specific conditions. If TailBB is an INLINEASM_BR
841 // indirect target, we need to see if the edge from PredBB to TailBB is from
842 // an INLINEASM_BR in PredBB, and then also if that edge was from the
843 // indirect target list, fallthrough/default target, or potentially both. If
844 // it's both, TailDuplicator::tailDuplicate will remove the edge, corrupting
845 // the successor list in PredBB and predecessor list in TailBB.
846 if (TailBB->isInlineAsmBrIndirectTarget())
847 return false;
848 return true;
849}
850
851/// If it is profitable, duplicate TailBB's contents in each
852/// of its predecessors.
853/// \p IsSimple result of isSimpleBB
854/// \p TailBB Block to be duplicated.
855/// \p ForcedLayoutPred When non-null, use this block as the layout predecessor
856/// instead of the previous block in MF's order.
857/// \p TDBBs A vector to keep track of all blocks tail-duplicated
858/// into.
859/// \p Copies A vector of copy instructions inserted. Used later to
860/// walk all the inserted copies and remove redundant ones.
861bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
862 MachineBasicBlock *ForcedLayoutPred,
866 LLVM_DEBUG(dbgs() << "\n*** Tail-duplicating " << printMBBReference(*TailBB)
867 << '\n');
868
869 bool ShouldUpdateTerminators = TailBB->canFallThrough();
870
871 DenseSet<Register> UsedByPhi;
872 getRegsUsedByPHIs(*TailBB, &UsedByPhi);
873
874 if (IsSimple)
875 return duplicateSimpleBB(TailBB, TDBBs, UsedByPhi);
876
877 // Iterate through all the unique predecessors and tail-duplicate this
878 // block into them, if possible. Copying the list ahead of time also
879 // avoids trouble with the predecessor list reallocating.
880 bool Changed = false;
882 if (CandidatePtr)
883 Preds.insert_range(*CandidatePtr);
884 else
885 Preds.insert_range(TailBB->predecessors());
886
887 for (MachineBasicBlock *PredBB : Preds) {
888 assert(TailBB != PredBB &&
889 "Single-block loop should have been rejected earlier!");
890
891 if (!canTailDuplicate(TailBB, PredBB))
892 continue;
893
894 // Don't duplicate into a fall-through predecessor (at least for now).
895 // If profile is available, findDuplicateCandidates can choose better
896 // fall-through predecessor.
897 if (!(MF->getFunction().hasProfileData() && LayoutMode)) {
898 bool IsLayoutSuccessor = false;
899 if (ForcedLayoutPred)
900 IsLayoutSuccessor = (ForcedLayoutPred == PredBB);
901 else if (PredBB->isLayoutSuccessor(TailBB) && PredBB->canFallThrough())
902 IsLayoutSuccessor = true;
903 if (IsLayoutSuccessor)
904 continue;
905 }
906
907 LLVM_DEBUG(dbgs() << "\nTail-duplicating into PredBB: " << *PredBB
908 << "From Succ: " << *TailBB);
909
910 TDBBs.push_back(PredBB);
911
912 // Remove PredBB's unconditional branch.
913 TII->removeBranch(*PredBB);
914
915 // Clone the contents of TailBB into PredBB.
918 for (MachineInstr &MI : llvm::make_early_inc_range(*TailBB)) {
919 if (MI.isPHI()) {
920 // Replace the uses of the def of the PHI with the register coming
921 // from PredBB.
922 processPHI(&MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi, true);
923 } else {
924 // Replace def of virtual registers with new registers, and update
925 // uses with PHI source register or the new registers.
926 duplicateInstruction(&MI, TailBB, PredBB, LocalVRMap, UsedByPhi);
927 }
928 }
929 appendCopies(PredBB, CopyInfos, Copies);
930
931 NumTailDupAdded += TailBB->size() - 1; // subtract one for removed branch
932
933 // Update the CFG.
934 PredBB->removeSuccessor(PredBB->succ_begin());
935 assert(PredBB->succ_empty() &&
936 "TailDuplicate called on block with multiple successors!");
937 for (MachineBasicBlock *Succ : TailBB->successors())
938 PredBB->addSuccessor(Succ, MBPI->getEdgeProbability(TailBB, Succ));
939
940 // Update branches in pred to jump to tail's layout successor if needed.
941 if (ShouldUpdateTerminators)
942 PredBB->updateTerminator(TailBB->getNextNode());
943
944 Changed = true;
945 ++NumTailDups;
946 }
947
948 // If TailBB was duplicated into all its predecessors except for the prior
949 // block, which falls through unconditionally, move the contents of this
950 // block into the prior block.
951 MachineBasicBlock *PrevBB = ForcedLayoutPred;
952 if (!PrevBB)
953 PrevBB = &*std::prev(TailBB->getIterator());
954 MachineBasicBlock *PriorTBB = nullptr, *PriorFBB = nullptr;
956 // This has to check PrevBB->succ_size() because EH edges are ignored by
957 // analyzeBranch.
958 if (PrevBB->succ_size() == 1 &&
959 // Layout preds are not always CFG preds. Check.
960 *PrevBB->succ_begin() == TailBB &&
961 !TII->analyzeBranch(*PrevBB, PriorTBB, PriorFBB, PriorCond) &&
962 PriorCond.empty() &&
963 (!PriorTBB || PriorTBB == TailBB) &&
964 TailBB->pred_size() == 1 &&
965 !TailBB->hasAddressTaken()) {
966 LLVM_DEBUG(dbgs() << "\nMerging into block: " << *PrevBB
967 << "From MBB: " << *TailBB);
968 // There may be a branch to the layout successor. This is unlikely but it
969 // happens. The correct thing to do is to remove the branch before
970 // duplicating the instructions in all cases.
971 bool RemovedBranches = TII->removeBranch(*PrevBB) != 0;
972
973 // If there are still tail instructions, abort the merge
974 if (PrevBB->getFirstTerminator() == PrevBB->end()) {
975 if (PreRegAlloc) {
979 // Process PHI instructions first.
980 while (I != TailBB->end() && I->isPHI()) {
981 // Replace the uses of the def of the PHI with the register coming
982 // from PredBB.
983 MachineInstr *MI = &*I++;
984 processPHI(MI, TailBB, PrevBB, LocalVRMap, CopyInfos, UsedByPhi,
985 true);
986 }
987
988 // Now copy the non-PHI instructions.
989 while (I != TailBB->end()) {
990 // Replace def of virtual registers with new registers, and update
991 // uses with PHI source register or the new registers.
992 MachineInstr *MI = &*I++;
993 assert(!MI->isBundle() && "Not expecting bundles before regalloc!");
994 duplicateInstruction(MI, TailBB, PrevBB, LocalVRMap, UsedByPhi);
995 MI->eraseFromParent();
996 }
997 appendCopies(PrevBB, CopyInfos, Copies);
998 } else {
999 TII->removeBranch(*PrevBB);
1000 // No PHIs to worry about, just splice the instructions over.
1001 PrevBB->splice(PrevBB->end(), TailBB, TailBB->begin(), TailBB->end());
1002 }
1003 PrevBB->removeSuccessor(PrevBB->succ_begin());
1004 assert(PrevBB->succ_empty());
1005 PrevBB->transferSuccessors(TailBB);
1006
1007 // Update branches in PrevBB based on Tail's layout successor.
1008 if (ShouldUpdateTerminators)
1009 PrevBB->updateTerminator(TailBB->getNextNode());
1010
1011 TDBBs.push_back(PrevBB);
1012 Changed = true;
1013 } else {
1014 LLVM_DEBUG(dbgs() << "Abort merging blocks, the predecessor still "
1015 "contains terminator instructions");
1016 // Return early if no changes were made
1017 if (!Changed)
1018 return RemovedBranches;
1019 }
1020 Changed |= RemovedBranches;
1021 }
1022
1023 // If this is after register allocation, there are no phis to fix.
1024 if (!PreRegAlloc)
1025 return Changed;
1026
1027 // If we made no changes so far, we are safe.
1028 if (!Changed)
1029 return Changed;
1030
1031 // Handle the nasty case in that we duplicated a block that is part of a loop
1032 // into some but not all of its predecessors. For example:
1033 // 1 -> 2 <-> 3 |
1034 // \ |
1035 // \---> rest |
1036 // if we duplicate 2 into 1 but not into 3, we end up with
1037 // 12 -> 3 <-> 2 -> rest |
1038 // \ / |
1039 // \----->-----/ |
1040 // If there was a "var = phi(1, 3)" in 2, it has to be ultimately replaced
1041 // with a phi in 3 (which now dominates 2).
1042 // What we do here is introduce a copy in 3 of the register defined by the
1043 // phi, just like when we are duplicating 2 into 3, but we don't copy any
1044 // real instructions or remove the 3 -> 2 edge from the phi in 2.
1045 for (MachineBasicBlock *PredBB : Preds) {
1046 if (is_contained(TDBBs, PredBB))
1047 continue;
1048
1049 // EH edges
1050 if (PredBB->succ_size() != 1)
1051 continue;
1052
1055 // Process PHI instructions first.
1056 for (MachineInstr &MI : make_early_inc_range(TailBB->phis())) {
1057 // Replace the uses of the def of the PHI with the register coming
1058 // from PredBB.
1059 processPHI(&MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi, false);
1060 }
1061 appendCopies(PredBB, CopyInfos, Copies);
1062 }
1063
1064 return Changed;
1065}
1066
1067/// At the end of the block \p MBB generate COPY instructions between registers
1068/// described by \p CopyInfos. Append resulting instructions to \p Copies.
1069void TailDuplicator::appendCopies(MachineBasicBlock *MBB,
1070 SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
1073 const MCInstrDesc &CopyD = TII->get(TargetOpcode::COPY);
1074 for (auto &CI : CopyInfos) {
1075 auto C = BuildMI(*MBB, Loc, DebugLoc(), CopyD, CI.first)
1076 .addReg(CI.second.Reg, 0, CI.second.SubReg);
1077 Copies.push_back(C);
1078 }
1079}
1080
1081/// Remove the specified dead machine basic block from the function, updating
1082/// the CFG.
1083void TailDuplicator::removeDeadBlock(
1085 function_ref<void(MachineBasicBlock *)> *RemovalCallback) {
1086 assert(MBB->pred_empty() && "MBB must be dead!");
1087 LLVM_DEBUG(dbgs() << "\nRemoving MBB: " << *MBB);
1088
1089 MachineFunction *MF = MBB->getParent();
1090 // Update the call info.
1091 for (const MachineInstr &MI : *MBB)
1092 if (MI.shouldUpdateAdditionalCallInfo())
1094
1095 if (RemovalCallback)
1096 (*RemovalCallback)(MBB);
1097
1098 // Remove all successors.
1099 while (!MBB->succ_empty())
1101
1102 // Remove the block.
1104}
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static unsigned InstrCount
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition: MD5.cpp:58
SI Lower i1 Copies
bool isDead(const MachineInstr &MI, const MachineRegisterInfo &MRI)
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector 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:167
#define LLVM_DEBUG(...)
Definition: Debug.h:119
static cl::opt< unsigned > TailDuplicateSize("tail-dup-size", cl::desc("Maximum instructions to consider tail duplicating"), cl::init(2), cl::Hidden)
static cl::opt< unsigned > TailDupLimit("tail-dup-limit", cl::init(~0U), cl::Hidden)
static cl::opt< unsigned > TailDupPredSize("tail-dup-pred-size", cl::desc("Maximum predecessors (maximum successors at the " "same time) to consider tail duplicating blocks."), cl::init(16), cl::Hidden)
static cl::opt< unsigned > TailDupSuccSize("tail-dup-succ-size", cl::desc("Maximum successors (maximum predecessors at the " "same time) to consider tail duplicating blocks."), cl::init(16), cl::Hidden)
static cl::opt< bool > TailDupVerify("tail-dup-verify", cl::desc("Verify sanity of PHI instructions during taildup"), cl::init(false), cl::Hidden)
static void VerifyPHIs(MachineFunction &MF, bool CheckExtra)
static bool bothUsedInPHI(const MachineBasicBlock &A, const SmallPtrSet< MachineBasicBlock *, 8 > &SuccsB)
static unsigned getPHISrcRegOpIdx(MachineInstr *MI, MachineBasicBlock *SrcBB)
static void getRegsUsedByPHIs(const MachineBasicBlock &BB, DenseSet< Register > *UsedByPhi)
static cl::opt< unsigned > TailDupIndirectBranchSize("tail-dup-indirect-size", cl::desc("Maximum instructions to consider tail duplicating blocks that " "end with indirect branches."), cl::init(20), cl::Hidden)
static bool isDefLiveOut(Register Reg, MachineBasicBlock *BB, const MachineRegisterInfo *MRI)
A debug info location.
Definition: DebugLoc.h:124
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:177
bool erase(const KeyT &Val)
Definition: DenseMap.h:319
iterator end()
Definition: DenseMap.h:87
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:230
Implements a dense probed hash-table based set.
Definition: DenseSet.h:263
bool hasProfileData(bool IncludeSynthetic=false) const
Return true if the function is annotated with profile data.
Definition: Function.h:334
Describe properties that are true of each instruction in the target description file.
Definition: MCInstrDesc.h:199
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
Definition: MCInstrInfo.h:64
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
unsigned pred_size() const
LLVM_ABI bool hasEHPadSuccessor() const
LLVM_ABI void replaceSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New)
Replace successor OLD with NEW and update probability info.
LLVM_ABI void transferSuccessors(MachineBasicBlock *FromMBB)
Transfers all the successors from MBB to this machine basic block (i.e., copies all the successors Fr...
iterator_range< iterator > phis()
Returns a range that iterates over the phis in the basic block.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
LLVM_ABI void updateTerminator(MachineBasicBlock *PreviousLayoutSuccessor)
Update the terminator instructions in block to account for changes to block layout which may have bee...
LLVM_ABI bool canFallThrough()
Return true if the block can implicitly transfer control to the block after it by falling off the end...
LLVM_ABI iterator getFirstNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the first non-debug instruction in the basic block, or end().
bool terminatorIsComputedGotoWithSuccessors() const
Returns true if the original IR terminator is an indirectbr with successor blocks.
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
unsigned succ_size() const
bool hasAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI DebugLoc findBranchDebugLoc()
Find and return the merged DebugLoc of the branch instructions of the block.
iterator_range< succ_iterator > successors()
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
LLVM_ABI bool mayHaveInlineAsmBr() const
Returns true if this block may have an INLINEASM_BR (overestimate, by checking if any of the successo...
BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
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.
Function & getFunction()
Return the LLVM function that this machine code represents.
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addCFIIndex(unsigned CFIIndex) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
Representation of each machine instruction.
Definition: MachineInstr.h:72
const MachineBasicBlock * getParent() const
Definition: MachineInstr.h:359
bool isDebugInstr() const
unsigned getNumOperands() const
Retuns the total number of operands.
Definition: MachineInstr.h:590
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
Definition: MachineInstr.h:511
bool isDebugValue() const
bool isPHI() const
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:595
bool isIndirectBranch(QueryType Type=AnyInBundle) const
Return true if this is an indirect branch, such as a branch through a register.
Definition: MachineInstr.h:988
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI bool hasOneNonDBGUse(Register RegNo) const
hasOneNonDBGUse - Return true if there is exactly one non-Debug use of the specified register.
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI void setRegClass(Register Reg, const TargetRegisterClass *RC)
setRegClass - Set the register class of the specified virtual register.
LLVM_ABI const TargetRegisterClass * constrainRegClass(Register Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
iterator_range< use_iterator > use_operands(Register Reg) const
LLVM_ABI void replaceRegWith(Register FromReg, Register ToReg)
replaceRegWith - Replace all instances of FromReg with ToReg in the machine function.
MachineSSAUpdater - This class updates SSA form for a set of virtual registers defined in multiple bl...
void Initialize(Register V)
Initialize - Reset this object to get ready for a new set of SSA updates.
Register GetValueInMiddleOfBlock(MachineBasicBlock *BB, bool ExistingValueOnly=false)
GetValueInMiddleOfBlock - Construct SSA form, materializing a value that is live in the middle of the...
void RewriteUse(MachineOperand &U)
RewriteUse - Rewrite a use of the symbolic value.
void AddAvailableValue(MachineBasicBlock *BB, Register V)
AddAvailableValue - Indicate that a rewritten value is available at the end of the specified block wi...
Analysis providing profile information.
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
void insert_range(Range &&R)
Definition: SetVector.h:193
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:470
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
A SetVector that performs no allocations if smaller than a certain size.
Definition: SetVector.h:356
bool empty() const
Definition: SmallVector.h:82
size_t size() const
Definition: SmallVector.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
void initMF(MachineFunction &MF, bool PreRegAlloc, const MachineBranchProbabilityInfo *MBPI, MBFIWrapper *MBFI, ProfileSummaryInfo *PSI, bool LayoutMode, unsigned TailDupSize=0)
Prepare to run on a specific machine function.
bool tailDuplicateBlocks()
Look for small blocks that are unconditionally branched to and do not fall through.
bool tailDuplicateAndUpdate(bool IsSimple, MachineBasicBlock *MBB, MachineBasicBlock *ForcedLayoutPred, SmallVectorImpl< MachineBasicBlock * > *DuplicatedPreds=nullptr, function_ref< void(MachineBasicBlock *)> *RemovalCallback=nullptr, SmallVectorImpl< MachineBasicBlock * > *CandidatePtr=nullptr)
Tail duplicate a single basic block into its predecessors, and then clean up.
static bool isSimpleBB(MachineBasicBlock *TailBB)
True if this BB has only one unconditional jump.
bool canTailDuplicate(MachineBasicBlock *TailBB, MachineBasicBlock *PredBB)
Returns true if TailBB can successfully be duplicated into PredBB.
bool shouldTailDuplicate(bool IsSimple, MachineBasicBlock &TailBB)
Determine if it is profitable to duplicate this block.
virtual unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const
Remove the branching code at the end of the specific MBB.
virtual bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
virtual unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const
Insert branch code into the end of the specified MachineBasicBlock.
virtual MachineInstr & duplicate(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig) const
Clones instruction or the whole instruction bundle Orig and insert into MBB before InsertBefore.
const Triple & getTargetTriple() const
unsigned composeSubRegIndices(unsigned a, unsigned b) const
Return the subregister index you get from composing two subregister indices.
virtual const TargetRegisterClass * getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const
Return a subclass of the specified register class A so that each register in it has a sub-register of...
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition: Triple.h:608
std::pair< iterator, bool > insert(const ValueT &V)
Definition: DenseSet.h:194
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition: DenseSet.h:174
An efficient, type-erasing, non-owning reference to a callable.
self_iterator getIterator()
Definition: ilist_node.h:134
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition: ilist_node.h:359
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
Reg
All possible values of the reg field in the ModR/M byte.
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition: STLExtras.h:338
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr from_range_t from_range
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition: STLExtras.h:663
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1751
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1916
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
A pair composed of a register and a sub-register index.