LLVM 20.0.0git
RegBankSelect.cpp
Go to the documentation of this file.
1//==- llvm/CodeGen/GlobalISel/RegBankSelect.cpp - RegBankSelect --*- C++ -*-==//
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/// \file
9/// This file implements the RegBankSelect class.
10//===----------------------------------------------------------------------===//
11
14#include "llvm/ADT/STLExtras.h"
32#include "llvm/Config/llvm-config.h"
33#include "llvm/IR/Function.h"
35#include "llvm/Pass.h"
39#include "llvm/Support/Debug.h"
42#include <algorithm>
43#include <cassert>
44#include <cstdint>
45#include <limits>
46#include <memory>
47#include <utility>
48
49#define DEBUG_TYPE "regbankselect"
50
51using namespace llvm;
52
54 cl::desc("Mode of the RegBankSelect pass"), cl::Hidden, cl::Optional,
55 cl::values(clEnumValN(RegBankSelect::Mode::Fast, "regbankselect-fast",
56 "Run the Fast mode (default mapping)"),
57 clEnumValN(RegBankSelect::Mode::Greedy, "regbankselect-greedy",
58 "Use the Greedy mode (best local mapping)")));
59
60char RegBankSelect::ID = 0;
61
63 "Assign register bank of generic virtual registers",
64 false, false);
69 "Assign register bank of generic virtual registers", false,
70 false)
71
72RegBankSelect::RegBankSelect(char &PassID, Mode RunningMode)
73 : MachineFunctionPass(PassID), OptMode(RunningMode) {
74 if (RegBankSelectMode.getNumOccurrences() != 0) {
75 OptMode = RegBankSelectMode;
76 if (RegBankSelectMode != RunningMode)
77 LLVM_DEBUG(dbgs() << "RegBankSelect mode overrided by command line\n");
78 }
79}
80
83 assert(RBI && "Cannot work without RegisterBankInfo");
84 MRI = &MF.getRegInfo();
86 TPC = &getAnalysis<TargetPassConfig>();
87 if (OptMode != Mode::Fast) {
88 MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI();
89 MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
90 } else {
91 MBFI = nullptr;
92 MBPI = nullptr;
93 }
94 MIRBuilder.setMF(MF);
95 MORE = std::make_unique<MachineOptimizationRemarkEmitter>(MF, MBFI);
96}
97
99 if (OptMode != Mode::Fast) {
100 // We could preserve the information from these two analysis but
101 // the APIs do not allow to do so yet.
104 }
108}
109
111 Register Reg, const RegisterBankInfo::ValueMapping &ValMapping,
112 bool &OnlyAssign) const {
113 // By default we assume we will have to repair something.
114 OnlyAssign = false;
115 // Each part of a break down needs to end up in a different register.
116 // In other word, Reg assignment does not match.
117 if (ValMapping.NumBreakDowns != 1)
118 return false;
119
120 const RegisterBank *CurRegBank = RBI->getRegBank(Reg, *MRI, *TRI);
121 const RegisterBank *DesiredRegBank = ValMapping.BreakDown[0].RegBank;
122 // Reg is free of assignment, a simple assignment will make the
123 // register bank to match.
124 OnlyAssign = CurRegBank == nullptr;
125 LLVM_DEBUG(dbgs() << "Does assignment already match: ";
126 if (CurRegBank) dbgs() << *CurRegBank; else dbgs() << "none";
127 dbgs() << " against ";
128 assert(DesiredRegBank && "The mapping must be valid");
129 dbgs() << *DesiredRegBank << '\n';);
130 return CurRegBank == DesiredRegBank;
131}
132
134 MachineOperand &MO, const RegisterBankInfo::ValueMapping &ValMapping,
137
138 assert(ValMapping.NumBreakDowns == (unsigned)size(NewVRegs) &&
139 "need new vreg for each breakdown");
140
141 // An empty range of new register means no repairing.
142 assert(!NewVRegs.empty() && "We should not have to repair");
143
145 if (ValMapping.NumBreakDowns == 1) {
146 // Assume we are repairing a use and thus, the original reg will be
147 // the source of the repairing.
148 Register Src = MO.getReg();
149 Register Dst = *NewVRegs.begin();
150
151 // If we repair a definition, swap the source and destination for
152 // the repairing.
153 if (MO.isDef())
154 std::swap(Src, Dst);
155
156 assert((RepairPt.getNumInsertPoints() == 1 || Dst.isPhysical()) &&
157 "We are about to create several defs for Dst");
158
159 // Build the instruction used to repair, then clone it at the right
160 // places. Avoiding buildCopy bypasses the check that Src and Dst have the
161 // same types because the type is a placeholder when this function is called.
162 MI = MIRBuilder.buildInstrNoInsert(TargetOpcode::COPY)
163 .addDef(Dst)
164 .addUse(Src);
165 LLVM_DEBUG(dbgs() << "Copy: " << printReg(Src) << ':'
166 << printRegClassOrBank(Src, *MRI, TRI)
167 << " to: " << printReg(Dst) << ':'
168 << printRegClassOrBank(Dst, *MRI, TRI) << '\n');
169 } else {
170 // TODO: Support with G_IMPLICIT_DEF + G_INSERT sequence or G_EXTRACT
171 // sequence.
172 assert(ValMapping.partsAllUniform() && "irregular breakdowns not supported");
173
174 LLT RegTy = MRI->getType(MO.getReg());
175 if (MO.isDef()) {
176 unsigned MergeOp;
177 if (RegTy.isVector()) {
178 if (ValMapping.NumBreakDowns == RegTy.getNumElements())
179 MergeOp = TargetOpcode::G_BUILD_VECTOR;
180 else {
181 assert(
182 (ValMapping.BreakDown[0].Length * ValMapping.NumBreakDowns ==
183 RegTy.getSizeInBits()) &&
184 (ValMapping.BreakDown[0].Length % RegTy.getScalarSizeInBits() ==
185 0) &&
186 "don't understand this value breakdown");
187
188 MergeOp = TargetOpcode::G_CONCAT_VECTORS;
189 }
190 } else
191 MergeOp = TargetOpcode::G_MERGE_VALUES;
192
193 auto MergeBuilder =
195 .addDef(MO.getReg());
196
197 for (Register SrcReg : NewVRegs)
198 MergeBuilder.addUse(SrcReg);
199
200 MI = MergeBuilder;
201 } else {
202 MachineInstrBuilder UnMergeBuilder =
203 MIRBuilder.buildInstrNoInsert(TargetOpcode::G_UNMERGE_VALUES);
204 for (Register DefReg : NewVRegs)
205 UnMergeBuilder.addDef(DefReg);
206
207 UnMergeBuilder.addUse(MO.getReg());
208 MI = UnMergeBuilder;
209 }
210 }
211
212 if (RepairPt.getNumInsertPoints() != 1)
213 report_fatal_error("need testcase to support multiple insertion points");
214
215 // TODO:
216 // Check if MI is legal. if not, we need to legalize all the
217 // instructions we are going to insert.
218 std::unique_ptr<MachineInstr *[]> NewInstrs(
219 new MachineInstr *[RepairPt.getNumInsertPoints()]);
220 bool IsFirst = true;
221 unsigned Idx = 0;
222 for (const std::unique_ptr<InsertPoint> &InsertPt : RepairPt) {
223 MachineInstr *CurMI;
224 if (IsFirst)
225 CurMI = MI;
226 else
228 InsertPt->insert(*CurMI);
229 NewInstrs[Idx++] = CurMI;
230 IsFirst = false;
231 }
232 // TODO:
233 // Legalize NewInstrs if need be.
234 return true;
235}
236
238 const MachineOperand &MO,
239 const RegisterBankInfo::ValueMapping &ValMapping) const {
240 assert(MO.isReg() && "We should only repair register operand");
241 assert(ValMapping.NumBreakDowns && "Nothing to map??");
242
243 bool IsSameNumOfValues = ValMapping.NumBreakDowns == 1;
244 const RegisterBank *CurRegBank = RBI->getRegBank(MO.getReg(), *MRI, *TRI);
245 // If MO does not have a register bank, we should have just been
246 // able to set one unless we have to break the value down.
247 assert(CurRegBank || MO.isDef());
248
249 // Def: Val <- NewDefs
250 // Same number of values: copy
251 // Different number: Val = build_sequence Defs1, Defs2, ...
252 // Use: NewSources <- Val.
253 // Same number of values: copy.
254 // Different number: Src1, Src2, ... =
255 // extract_value Val, Src1Begin, Src1Len, Src2Begin, Src2Len, ...
256 // We should remember that this value is available somewhere else to
257 // coalesce the value.
258
259 if (ValMapping.NumBreakDowns != 1)
260 return RBI->getBreakDownCost(ValMapping, CurRegBank);
261
262 if (IsSameNumOfValues) {
263 const RegisterBank *DesiredRegBank = ValMapping.BreakDown[0].RegBank;
264 // If we repair a definition, swap the source and destination for
265 // the repairing.
266 if (MO.isDef())
267 std::swap(CurRegBank, DesiredRegBank);
268 // TODO: It may be possible to actually avoid the copy.
269 // If we repair something where the source is defined by a copy
270 // and the source of that copy is on the right bank, we can reuse
271 // it for free.
272 // E.g.,
273 // RegToRepair<BankA> = copy AlternativeSrc<BankB>
274 // = op RegToRepair<BankA>
275 // We can simply propagate AlternativeSrc instead of copying RegToRepair
276 // into a new virtual register.
277 // We would also need to propagate this information in the
278 // repairing placement.
279 unsigned Cost = RBI->copyCost(*DesiredRegBank, *CurRegBank,
280 RBI->getSizeInBits(MO.getReg(), *MRI, *TRI));
281 // TODO: use a dedicated constant for ImpossibleCost.
282 if (Cost != std::numeric_limits<unsigned>::max())
283 return Cost;
284 // Return the legalization cost of that repairing.
285 }
286 return std::numeric_limits<unsigned>::max();
287}
288
292 assert(!PossibleMappings.empty() &&
293 "Do not know how to map this instruction");
294
295 const RegisterBankInfo::InstructionMapping *BestMapping = nullptr;
298 for (const RegisterBankInfo::InstructionMapping *CurMapping :
299 PossibleMappings) {
300 MappingCost CurCost =
301 computeMapping(MI, *CurMapping, LocalRepairPts, &Cost);
302 if (CurCost < Cost) {
303 LLVM_DEBUG(dbgs() << "New best: " << CurCost << '\n');
304 Cost = CurCost;
305 BestMapping = CurMapping;
306 RepairPts.clear();
307 for (RepairingPlacement &RepairPt : LocalRepairPts)
308 RepairPts.emplace_back(std::move(RepairPt));
309 }
310 }
311 if (!BestMapping && !TPC->isGlobalISelAbortEnabled()) {
312 // If none of the mapping worked that means they are all impossible.
313 // Thus, pick the first one and set an impossible repairing point.
314 // It will trigger the failed isel mode.
315 BestMapping = *PossibleMappings.begin();
316 RepairPts.emplace_back(
318 } else
319 assert(BestMapping && "No suitable mapping for instruction");
320 return *BestMapping;
321}
322
325 const RegisterBankInfo::ValueMapping &ValMapping) const {
326 const MachineInstr &MI = *MO.getParent();
327 assert(RepairPt.hasSplit() && "We should not have to adjust for split");
328 // Splitting should only occur for PHIs or between terminators,
329 // because we only do local repairing.
330 assert((MI.isPHI() || MI.isTerminator()) && "Why do we split?");
331
332 assert(&MI.getOperand(RepairPt.getOpIdx()) == &MO &&
333 "Repairing placement does not match operand");
334
335 // If we need splitting for phis, that means it is because we
336 // could not find an insertion point before the terminators of
337 // the predecessor block for this argument. In other words,
338 // the input value is defined by one of the terminators.
339 assert((!MI.isPHI() || !MO.isDef()) && "Need split for phi def?");
340
341 // We split to repair the use of a phi or a terminator.
342 if (!MO.isDef()) {
343 if (MI.isTerminator()) {
344 assert(&MI != &(*MI.getParent()->getFirstTerminator()) &&
345 "Need to split for the first terminator?!");
346 } else {
347 // For the PHI case, the split may not be actually required.
348 // In the copy case, a phi is already a copy on the incoming edge,
349 // therefore there is no need to split.
350 if (ValMapping.NumBreakDowns == 1)
351 // This is a already a copy, there is nothing to do.
353 }
354 return;
355 }
356
357 // At this point, we need to repair a defintion of a terminator.
358
359 // Technically we need to fix the def of MI on all outgoing
360 // edges of MI to keep the repairing local. In other words, we
361 // will create several definitions of the same register. This
362 // does not work for SSA unless that definition is a physical
363 // register.
364 // However, there are other cases where we can get away with
365 // that while still keeping the repairing local.
366 assert(MI.isTerminator() && MO.isDef() &&
367 "This code is for the def of a terminator");
368
369 // Since we use RPO traversal, if we need to repair a definition
370 // this means this definition could be:
371 // 1. Used by PHIs (i.e., this VReg has been visited as part of the
372 // uses of a phi.), or
373 // 2. Part of a target specific instruction (i.e., the target applied
374 // some register class constraints when creating the instruction.)
375 // If the constraints come for #2, the target said that another mapping
376 // is supported so we may just drop them. Indeed, if we do not change
377 // the number of registers holding that value, the uses will get fixed
378 // when we get to them.
379 // Uses in PHIs may have already been proceeded though.
380 // If the constraints come for #1, then, those are weak constraints and
381 // no actual uses may rely on them. However, the problem remains mainly
382 // the same as for #2. If the value stays in one register, we could
383 // just switch the register bank of the definition, but we would need to
384 // account for a repairing cost for each phi we silently change.
385 //
386 // In any case, if the value needs to be broken down into several
387 // registers, the repairing is not local anymore as we need to patch
388 // every uses to rebuild the value in just one register.
389 //
390 // To summarize:
391 // - If the value is in a physical register, we can do the split and
392 // fix locally.
393 // Otherwise if the value is in a virtual register:
394 // - If the value remains in one register, we do not have to split
395 // just switching the register bank would do, but we need to account
396 // in the repairing cost all the phi we changed.
397 // - If the value spans several registers, then we cannot do a local
398 // repairing.
399
400 // Check if this is a physical or virtual register.
401 Register Reg = MO.getReg();
402 if (Reg.isPhysical()) {
403 // We are going to split every outgoing edges.
404 // Check that this is possible.
405 // FIXME: The machine representation is currently broken
406 // since it also several terminators in one basic block.
407 // Because of that we would technically need a way to get
408 // the targets of just one terminator to know which edges
409 // we have to split.
410 // Assert that we do not hit the ill-formed representation.
411
412 // If there are other terminators before that one, some of
413 // the outgoing edges may not be dominated by this definition.
414 assert(&MI == &(*MI.getParent()->getFirstTerminator()) &&
415 "Do not know which outgoing edges are relevant");
416 const MachineInstr *Next = MI.getNextNode();
417 assert((!Next || Next->isUnconditionalBranch()) &&
418 "Do not know where each terminator ends up");
419 if (Next)
420 // If the next terminator uses Reg, this means we have
421 // to split right after MI and thus we need a way to ask
422 // which outgoing edges are affected.
423 assert(!Next->readsRegister(Reg, /*TRI=*/nullptr) &&
424 "Need to split between terminators");
425 // We will split all the edges and repair there.
426 } else {
427 // This is a virtual register defined by a terminator.
428 if (ValMapping.NumBreakDowns == 1) {
429 // There is nothing to repair, but we may actually lie on
430 // the repairing cost because of the PHIs already proceeded
431 // as already stated.
432 // Though the code will be correct.
433 assert(false && "Repairing cost may not be accurate");
434 } else {
435 // We need to do non-local repairing. Basically, patch all
436 // the uses (i.e., phis) that we already proceeded.
437 // For now, just say this mapping is not possible.
439 }
440 }
441}
442
446 const RegBankSelect::MappingCost *BestCost) {
447 assert((MBFI || !BestCost) && "Costs comparison require MBFI");
448
449 if (!InstrMapping.isValid())
451
452 // If mapped with InstrMapping, MI will have the recorded cost.
453 MappingCost Cost(MBFI ? MBFI->getBlockFreq(MI.getParent())
454 : BlockFrequency(1));
455 bool Saturated = Cost.addLocalCost(InstrMapping.getCost());
456 assert(!Saturated && "Possible mapping saturated the cost");
457 LLVM_DEBUG(dbgs() << "Evaluating mapping cost for: " << MI);
458 LLVM_DEBUG(dbgs() << "With: " << InstrMapping << '\n');
459 RepairPts.clear();
460 if (BestCost && Cost > *BestCost) {
461 LLVM_DEBUG(dbgs() << "Mapping is too expensive from the start\n");
462 return Cost;
463 }
464 const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
465
466 // Moreover, to realize this mapping, the register bank of each operand must
467 // match this mapping. In other words, we may need to locally reassign the
468 // register banks. Account for that repairing cost as well.
469 // In this context, local means in the surrounding of MI.
470 for (unsigned OpIdx = 0, EndOpIdx = InstrMapping.getNumOperands();
471 OpIdx != EndOpIdx; ++OpIdx) {
472 const MachineOperand &MO = MI.getOperand(OpIdx);
473 if (!MO.isReg())
474 continue;
475 Register Reg = MO.getReg();
476 if (!Reg)
477 continue;
478 LLT Ty = MRI.getType(Reg);
479 if (!Ty.isValid())
480 continue;
481
482 LLVM_DEBUG(dbgs() << "Opd" << OpIdx << '\n');
483 const RegisterBankInfo::ValueMapping &ValMapping =
484 InstrMapping.getOperandMapping(OpIdx);
485 // If Reg is already properly mapped, this is free.
486 bool Assign;
487 if (assignmentMatch(Reg, ValMapping, Assign)) {
488 LLVM_DEBUG(dbgs() << "=> is free (match).\n");
489 continue;
490 }
491 if (Assign) {
492 LLVM_DEBUG(dbgs() << "=> is free (simple assignment).\n");
493 RepairPts.emplace_back(RepairingPlacement(MI, OpIdx, *TRI, *this,
495 continue;
496 }
497
498 // Find the insertion point for the repairing code.
499 RepairPts.emplace_back(
501 RepairingPlacement &RepairPt = RepairPts.back();
502
503 // If we need to split a basic block to materialize this insertion point,
504 // we may give a higher cost to this mapping.
505 // Nevertheless, we may get away with the split, so try that first.
506 if (RepairPt.hasSplit())
507 tryAvoidingSplit(RepairPt, MO, ValMapping);
508
509 // Check that the materialization of the repairing is possible.
510 if (!RepairPt.canMaterialize()) {
511 LLVM_DEBUG(dbgs() << "Mapping involves impossible repairing\n");
513 }
514
515 // Account for the split cost and repair cost.
516 // Unless the cost is already saturated or we do not care about the cost.
517 if (!BestCost || Saturated)
518 continue;
519
520 // To get accurate information we need MBFI and MBPI.
521 // Thus, if we end up here this information should be here.
522 assert(MBFI && MBPI && "Cost computation requires MBFI and MBPI");
523
524 // FIXME: We will have to rework the repairing cost model.
525 // The repairing cost depends on the register bank that MO has.
526 // However, when we break down the value into different values,
527 // MO may not have a register bank while still needing repairing.
528 // For the fast mode, we don't compute the cost so that is fine,
529 // but still for the repairing code, we will have to make a choice.
530 // For the greedy mode, we should choose greedily what is the best
531 // choice based on the next use of MO.
532
533 // Sums up the repairing cost of MO at each insertion point.
534 uint64_t RepairCost = getRepairCost(MO, ValMapping);
535
536 // This is an impossible to repair cost.
537 if (RepairCost == std::numeric_limits<unsigned>::max())
539
540 // Bias used for splitting: 5%.
541 const uint64_t PercentageForBias = 5;
542 uint64_t Bias = (RepairCost * PercentageForBias + 99) / 100;
543 // We should not need more than a couple of instructions to repair
544 // an assignment. In other words, the computation should not
545 // overflow because the repairing cost is free of basic block
546 // frequency.
547 assert(((RepairCost < RepairCost * PercentageForBias) &&
548 (RepairCost * PercentageForBias <
549 RepairCost * PercentageForBias + 99)) &&
550 "Repairing involves more than a billion of instructions?!");
551 for (const std::unique_ptr<InsertPoint> &InsertPt : RepairPt) {
552 assert(InsertPt->canMaterialize() && "We should not have made it here");
553 // We will applied some basic block frequency and those uses uint64_t.
554 if (!InsertPt->isSplit())
555 Saturated = Cost.addLocalCost(RepairCost);
556 else {
557 uint64_t CostForInsertPt = RepairCost;
558 // Again we shouldn't overflow here givent that
559 // CostForInsertPt is frequency free at this point.
560 assert(CostForInsertPt + Bias > CostForInsertPt &&
561 "Repairing + split bias overflows");
562 CostForInsertPt += Bias;
563 uint64_t PtCost = InsertPt->frequency(*this) * CostForInsertPt;
564 // Check if we just overflowed.
565 if ((Saturated = PtCost < CostForInsertPt))
566 Cost.saturate();
567 else
568 Saturated = Cost.addNonLocalCost(PtCost);
569 }
570
571 // Stop looking into what it takes to repair, this is already
572 // too expensive.
573 if (BestCost && Cost > *BestCost) {
574 LLVM_DEBUG(dbgs() << "Mapping is too expensive, stop processing\n");
575 return Cost;
576 }
577
578 // No need to accumulate more cost information.
579 // We need to still gather the repairing information though.
580 if (Saturated)
581 break;
582 }
583 }
584 LLVM_DEBUG(dbgs() << "Total cost is: " << Cost << "\n");
585 return Cost;
586}
587
591 // OpdMapper will hold all the information needed for the rewriting.
592 RegisterBankInfo::OperandsMapper OpdMapper(MI, InstrMapping, *MRI);
593
594 // First, place the repairing code.
595 for (RepairingPlacement &RepairPt : RepairPts) {
596 if (!RepairPt.canMaterialize() ||
597 RepairPt.getKind() == RepairingPlacement::Impossible)
598 return false;
599 assert(RepairPt.getKind() != RepairingPlacement::None &&
600 "This should not make its way in the list");
601 unsigned OpIdx = RepairPt.getOpIdx();
602 MachineOperand &MO = MI.getOperand(OpIdx);
603 const RegisterBankInfo::ValueMapping &ValMapping =
604 InstrMapping.getOperandMapping(OpIdx);
605 Register Reg = MO.getReg();
606
607 switch (RepairPt.getKind()) {
609 assert(ValMapping.NumBreakDowns == 1 &&
610 "Reassignment should only be for simple mapping");
611 MRI->setRegBank(Reg, *ValMapping.BreakDown[0].RegBank);
612 break;
614 // Don't insert additional instruction for debug instruction.
615 if (MI.isDebugInstr())
616 break;
617 OpdMapper.createVRegs(OpIdx);
618 if (!repairReg(MO, ValMapping, RepairPt, OpdMapper.getVRegs(OpIdx)))
619 return false;
620 break;
621 default:
622 llvm_unreachable("Other kind should not happen");
623 }
624 }
625
626 // Second, rewrite the instruction.
627 LLVM_DEBUG(dbgs() << "Actual mapping of the operands: " << OpdMapper << '\n');
628 RBI->applyMapping(MIRBuilder, OpdMapper);
629
630 return true;
631}
632
634 LLVM_DEBUG(dbgs() << "Assign: " << MI);
635
636 unsigned Opc = MI.getOpcode();
638 assert((Opc == TargetOpcode::G_ASSERT_ZEXT ||
639 Opc == TargetOpcode::G_ASSERT_SEXT ||
640 Opc == TargetOpcode::G_ASSERT_ALIGN) &&
641 "Unexpected hint opcode!");
642 // The only correct mapping for these is to always use the source register
643 // bank.
644 const RegisterBank *RB =
645 RBI->getRegBank(MI.getOperand(1).getReg(), *MRI, *TRI);
646 // We can assume every instruction above this one has a selected register
647 // bank.
648 assert(RB && "Expected source register to have a register bank?");
649 LLVM_DEBUG(dbgs() << "... Hint always uses source's register bank.\n");
650 MRI->setRegBank(MI.getOperand(0).getReg(), *RB);
651 return true;
652 }
653
654 // Remember the repairing placement for all the operands.
656
657 const RegisterBankInfo::InstructionMapping *BestMapping;
659 BestMapping = &RBI->getInstrMapping(MI);
660 MappingCost DefaultCost = computeMapping(MI, *BestMapping, RepairPts);
661 (void)DefaultCost;
662 if (DefaultCost == MappingCost::ImpossibleCost())
663 return false;
664 } else {
667 if (PossibleMappings.empty())
668 return false;
669 BestMapping = &findBestMapping(MI, PossibleMappings, RepairPts);
670 }
671 // Make sure the mapping is valid for MI.
672 assert(BestMapping->verify(MI) && "Invalid instruction mapping");
673
674 LLVM_DEBUG(dbgs() << "Best Mapping: " << *BestMapping << '\n');
675
676 // After this call, MI may not be valid anymore.
677 // Do not use it.
678 return applyMapping(MI, *BestMapping, RepairPts);
679}
680
682 // Walk the function and assign register banks to all operands.
683 // Use a RPOT to make sure all registers are assigned before we choose
684 // the best mapping of the current instruction.
686 for (MachineBasicBlock *MBB : RPOT) {
687 // Set a sensible insertion point so that subsequent calls to
688 // MIRBuilder.
692
693 while (!WorkList.empty()) {
694 MachineInstr &MI = *WorkList.pop_back_val();
695
696 // Ignore target-specific post-isel instructions: they should use proper
697 // regclasses.
698 if (isTargetSpecificOpcode(MI.getOpcode()) && !MI.isPreISelOpcode())
699 continue;
700
701 // Ignore inline asm instructions: they should use physical
702 // registers/regclasses
703 if (MI.isInlineAsm())
704 continue;
705
706 // Ignore IMPLICIT_DEF which must have a regclass.
707 if (MI.isImplicitDef())
708 continue;
709
710 if (!assignInstr(MI)) {
711 reportGISelFailure(MF, *TPC, *MORE, "gisel-regbankselect",
712 "unable to map instruction", MI);
713 return false;
714 }
715 }
716 }
717
718 return true;
719}
720
722#ifndef NDEBUG
724 if (const MachineInstr *MI = machineFunctionIsIllegal(MF)) {
725 reportGISelFailure(MF, *TPC, *MORE, "gisel-regbankselect",
726 "instruction is not legal", *MI);
727 return false;
728 }
729 }
730#endif
731 return true;
732}
733
735 // If the ISel pipeline failed, do not bother running that pass.
736 if (MF.getProperties().hasProperty(
738 return false;
739
740 LLVM_DEBUG(dbgs() << "Assign register banks for: " << MF.getName() << '\n');
741 const Function &F = MF.getFunction();
742 Mode SaveOptMode = OptMode;
743 if (F.hasOptNone())
745 init(MF);
746
747#ifndef NDEBUG
748 if (!checkFunctionIsLegal(MF))
749 return false;
750#endif
751
753
754 OptMode = SaveOptMode;
755 return false;
756}
757
758//------------------------------------------------------------------------------
759// Helper Classes Implementation
760//------------------------------------------------------------------------------
762 MachineInstr &MI, unsigned OpIdx, const TargetRegisterInfo &TRI, Pass &P,
764 // Default is, we are going to insert code to repair OpIdx.
765 : Kind(Kind), OpIdx(OpIdx),
766 CanMaterialize(Kind != RepairingKind::Impossible), P(P) {
767 const MachineOperand &MO = MI.getOperand(OpIdx);
768 assert(MO.isReg() && "Trying to repair a non-reg operand");
769
770 if (Kind != RepairingKind::Insert)
771 return;
772
773 // Repairings for definitions happen after MI, uses happen before.
774 bool Before = !MO.isDef();
775
776 // Check if we are done with MI.
777 if (!MI.isPHI() && !MI.isTerminator()) {
779 // We are done with the initialization.
780 return;
781 }
782
783 // Now, look for the special cases.
784 if (MI.isPHI()) {
785 // - PHI must be the first instructions:
786 // * Before, we have to split the related incoming edge.
787 // * After, move the insertion point past the last phi.
788 if (!Before) {
789 MachineBasicBlock::iterator It = MI.getParent()->getFirstNonPHI();
790 if (It != MI.getParent()->end())
791 addInsertPoint(*It, /*Before*/ true);
792 else
793 addInsertPoint(*(--It), /*Before*/ false);
794 return;
795 }
796 // We repair a use of a phi, we may need to split the related edge.
797 MachineBasicBlock &Pred = *MI.getOperand(OpIdx + 1).getMBB();
798 // Check if we can move the insertion point prior to the
799 // terminators of the predecessor.
800 Register Reg = MO.getReg();
802 for (auto Begin = Pred.begin(); It != Begin && It->isTerminator(); --It)
803 if (It->modifiesRegister(Reg, &TRI)) {
804 // We cannot hoist the repairing code in the predecessor.
805 // Split the edge.
806 addInsertPoint(Pred, *MI.getParent());
807 return;
808 }
809 // At this point, we can insert in Pred.
810
811 // - If It is invalid, Pred is empty and we can insert in Pred
812 // wherever we want.
813 // - If It is valid, It is the first non-terminator, insert after It.
814 if (It == Pred.end())
815 addInsertPoint(Pred, /*Beginning*/ false);
816 else
817 addInsertPoint(*It, /*Before*/ false);
818 } else {
819 // - Terminators must be the last instructions:
820 // * Before, move the insert point before the first terminator.
821 // * After, we have to split the outcoming edges.
822 if (Before) {
823 // Check whether Reg is defined by any terminator.
825 auto REnd = MI.getParent()->rend();
826
827 for (; It != REnd && It->isTerminator(); ++It) {
828 assert(!It->modifiesRegister(MO.getReg(), &TRI) &&
829 "copy insertion in middle of terminators not handled");
830 }
831
832 if (It == REnd) {
833 addInsertPoint(*MI.getParent()->begin(), true);
834 return;
835 }
836
837 // We are sure to be right before the first terminator.
838 addInsertPoint(*It, /*Before*/ false);
839 return;
840 }
841 // Make sure Reg is not redefined by other terminators, otherwise
842 // we do not know how to split.
843 for (MachineBasicBlock::iterator It = MI, End = MI.getParent()->end();
844 ++It != End;)
845 // The machine verifier should reject this kind of code.
846 assert(It->modifiesRegister(MO.getReg(), &TRI) &&
847 "Do not know where to split");
848 // Split each outcoming edges.
849 MachineBasicBlock &Src = *MI.getParent();
850 for (auto &Succ : Src.successors())
851 addInsertPoint(Src, Succ);
852 }
853}
854
856 bool Before) {
857 addInsertPoint(*new InstrInsertPoint(MI, Before));
858}
859
861 bool Beginning) {
862 addInsertPoint(*new MBBInsertPoint(MBB, Beginning));
863}
864
866 MachineBasicBlock &Dst) {
867 addInsertPoint(*new EdgeInsertPoint(Src, Dst, P));
868}
869
872 CanMaterialize &= Point.canMaterialize();
873 HasSplit |= Point.isSplit();
874 InsertPoints.emplace_back(&Point);
875}
876
878 bool Before)
879 : Instr(Instr), Before(Before) {
880 // Since we do not support splitting, we do not need to update
881 // liveness and such, so do not do anything with P.
882 assert((!Before || !Instr.isPHI()) &&
883 "Splitting before phis requires more points");
884 assert((!Before || !Instr.getNextNode() || !Instr.getNextNode()->isPHI()) &&
885 "Splitting between phis does not make sense");
886}
887
888void RegBankSelect::InstrInsertPoint::materialize() {
889 if (isSplit()) {
890 // Slice and return the beginning of the new block.
891 // If we need to split between the terminators, we theoritically
892 // need to know where the first and second set of terminators end
893 // to update the successors properly.
894 // Now, in pratice, we should have a maximum of 2 branch
895 // instructions; one conditional and one unconditional. Therefore
896 // we know how to update the successor by looking at the target of
897 // the unconditional branch.
898 // If we end up splitting at some point, then, we should update
899 // the liveness information and such. I.e., we would need to
900 // access P here.
901 // The machine verifier should actually make sure such cases
902 // cannot happen.
903 llvm_unreachable("Not yet implemented");
904 }
905 // Otherwise the insertion point is just the current or next
906 // instruction depending on Before. I.e., there is nothing to do
907 // here.
908}
909
911 // If the insertion point is after a terminator, we need to split.
912 if (!Before)
913 return Instr.isTerminator();
914 // If we insert before an instruction that is after a terminator,
915 // we are still after a terminator.
916 return Instr.getPrevNode() && Instr.getPrevNode()->isTerminator();
917}
918
920 // Even if we need to split, because we insert between terminators,
921 // this split has actually the same frequency as the instruction.
922 const auto *MBFIWrapper =
923 P.getAnalysisIfAvailable<MachineBlockFrequencyInfoWrapperPass>();
924 if (!MBFIWrapper)
925 return 1;
926 return MBFIWrapper->getMBFI().getBlockFreq(Instr.getParent()).getFrequency();
927}
928
930 const auto *MBFIWrapper =
931 P.getAnalysisIfAvailable<MachineBlockFrequencyInfoWrapperPass>();
932 if (!MBFIWrapper)
933 return 1;
935}
936
937void RegBankSelect::EdgeInsertPoint::materialize() {
938 // If we end up repairing twice at the same place before materializing the
939 // insertion point, we may think we have to split an edge twice.
940 // We should have a factory for the insert point such that identical points
941 // are the same instance.
942 assert(Src.isSuccessor(DstOrSplit) && DstOrSplit->isPredecessor(&Src) &&
943 "This point has already been split");
944 MachineBasicBlock *NewBB = Src.SplitCriticalEdge(DstOrSplit, P);
945 assert(NewBB && "Invalid call to materialize");
946 // We reuse the destination block to hold the information of the new block.
947 DstOrSplit = NewBB;
948}
949
951 const auto *MBFIWrapper =
952 P.getAnalysisIfAvailable<MachineBlockFrequencyInfoWrapperPass>();
953 if (!MBFIWrapper)
954 return 1;
955 const auto *MBFI = &MBFIWrapper->getMBFI();
956 if (WasMaterialized)
957 return MBFI->getBlockFreq(DstOrSplit).getFrequency();
958
959 auto *MBPIWrapper =
960 P.getAnalysisIfAvailable<MachineBranchProbabilityInfoWrapperPass>();
962 MBPIWrapper ? &MBPIWrapper->getMBPI() : nullptr;
963 if (!MBPI)
964 return 1;
965 // The basic block will be on the edge.
966 return (MBFI->getBlockFreq(&Src) * MBPI->getEdgeProbability(&Src, DstOrSplit))
967 .getFrequency();
968}
969
971 // If this is not a critical edge, we should not have used this insert
972 // point. Indeed, either the successor or the predecessor should
973 // have do.
974 assert(Src.succ_size() > 1 && DstOrSplit->pred_size() > 1 &&
975 "Edge is not critical");
976 return Src.canSplitCriticalEdge(DstOrSplit);
977}
978
979RegBankSelect::MappingCost::MappingCost(BlockFrequency LocalFreq)
980 : LocalFreq(LocalFreq.getFrequency()) {}
981
983 // Check if this overflows.
984 if (LocalCost + Cost < LocalCost) {
985 saturate();
986 return true;
987 }
988 LocalCost += Cost;
989 return isSaturated();
990}
991
993 // Check if this overflows.
994 if (NonLocalCost + Cost < NonLocalCost) {
995 saturate();
996 return true;
997 }
998 NonLocalCost += Cost;
999 return isSaturated();
1000}
1001
1002bool RegBankSelect::MappingCost::isSaturated() const {
1003 return LocalCost == UINT64_MAX - 1 && NonLocalCost == UINT64_MAX &&
1004 LocalFreq == UINT64_MAX;
1005}
1006
1008 *this = ImpossibleCost();
1009 --LocalCost;
1010}
1011
1014}
1015
1017 // Sort out the easy cases.
1018 if (*this == Cost)
1019 return false;
1020 // If one is impossible to realize the other is cheaper unless it is
1021 // impossible as well.
1022 if ((*this == ImpossibleCost()) || (Cost == ImpossibleCost()))
1023 return (*this == ImpossibleCost()) < (Cost == ImpossibleCost());
1024 // If one is saturated the other is cheaper, unless it is saturated
1025 // as well.
1026 if (isSaturated() || Cost.isSaturated())
1027 return isSaturated() < Cost.isSaturated();
1028 // At this point we know both costs hold sensible values.
1029
1030 // If both values have a different base frequency, there is no much
1031 // we can do but to scale everything.
1032 // However, if they have the same base frequency we can avoid making
1033 // complicated computation.
1034 uint64_t ThisLocalAdjust;
1035 uint64_t OtherLocalAdjust;
1036 if (LLVM_LIKELY(LocalFreq == Cost.LocalFreq)) {
1037
1038 // At this point, we know the local costs are comparable.
1039 // Do the case that do not involve potential overflow first.
1040 if (NonLocalCost == Cost.NonLocalCost)
1041 // Since the non-local costs do not discriminate on the result,
1042 // just compare the local costs.
1043 return LocalCost < Cost.LocalCost;
1044
1045 // The base costs are comparable so we may only keep the relative
1046 // value to increase our chances of avoiding overflows.
1047 ThisLocalAdjust = 0;
1048 OtherLocalAdjust = 0;
1049 if (LocalCost < Cost.LocalCost)
1050 OtherLocalAdjust = Cost.LocalCost - LocalCost;
1051 else
1052 ThisLocalAdjust = LocalCost - Cost.LocalCost;
1053 } else {
1054 ThisLocalAdjust = LocalCost;
1055 OtherLocalAdjust = Cost.LocalCost;
1056 }
1057
1058 // The non-local costs are comparable, just keep the relative value.
1059 uint64_t ThisNonLocalAdjust = 0;
1060 uint64_t OtherNonLocalAdjust = 0;
1061 if (NonLocalCost < Cost.NonLocalCost)
1062 OtherNonLocalAdjust = Cost.NonLocalCost - NonLocalCost;
1063 else
1064 ThisNonLocalAdjust = NonLocalCost - Cost.NonLocalCost;
1065 // Scale everything to make them comparable.
1066 uint64_t ThisScaledCost = ThisLocalAdjust * LocalFreq;
1067 // Check for overflow on that operation.
1068 bool ThisOverflows = ThisLocalAdjust && (ThisScaledCost < ThisLocalAdjust ||
1069 ThisScaledCost < LocalFreq);
1070 uint64_t OtherScaledCost = OtherLocalAdjust * Cost.LocalFreq;
1071 // Check for overflow on the last operation.
1072 bool OtherOverflows =
1073 OtherLocalAdjust &&
1074 (OtherScaledCost < OtherLocalAdjust || OtherScaledCost < Cost.LocalFreq);
1075 // Add the non-local costs.
1076 ThisOverflows |= ThisNonLocalAdjust &&
1077 ThisScaledCost + ThisNonLocalAdjust < ThisNonLocalAdjust;
1078 ThisScaledCost += ThisNonLocalAdjust;
1079 OtherOverflows |= OtherNonLocalAdjust &&
1080 OtherScaledCost + OtherNonLocalAdjust < OtherNonLocalAdjust;
1081 OtherScaledCost += OtherNonLocalAdjust;
1082 // If both overflows, we cannot compare without additional
1083 // precision, e.g., APInt. Just give up on that case.
1084 if (ThisOverflows && OtherOverflows)
1085 return false;
1086 // If one overflows but not the other, we can still compare.
1087 if (ThisOverflows || OtherOverflows)
1088 return ThisOverflows < OtherOverflows;
1089 // Otherwise, just compare the values.
1090 return ThisScaledCost < OtherScaledCost;
1091}
1092
1094 return LocalCost == Cost.LocalCost && NonLocalCost == Cost.NonLocalCost &&
1095 LocalFreq == Cost.LocalFreq;
1096}
1097
1098#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1100 print(dbgs());
1101 dbgs() << '\n';
1102}
1103#endif
1104
1106 if (*this == ImpossibleCost()) {
1107 OS << "impossible";
1108 return;
1109 }
1110 if (isSaturated()) {
1111 OS << "saturated";
1112 return;
1113 }
1114 OS << LocalFreq << " * " << LocalCost << " + " << NonLocalCost;
1115}
MachineBasicBlock & MBB
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:686
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition: Compiler.h:533
#define LLVM_LIKELY(EXPR)
Definition: Compiler.h:236
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
#define LLVM_DEBUG(X)
Definition: Debug.h:101
bool End
Definition: ELF_riscv.cpp:480
IRTranslator LLVM IR MI
Interface for Targets to specify which operations they can successfully select and how the others sho...
#define F(x, y, z)
Definition: MD5.cpp:55
===- MachineOptimizationRemarkEmitter.h - Opt Diagnostics -*- C++ -*-—===//
unsigned const TargetRegisterInfo * TRI
#define P(N)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:55
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:57
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:52
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
static cl::opt< RegBankSelect::Mode > RegBankSelectMode(cl::desc("Mode of the RegBankSelect pass"), cl::Hidden, cl::Optional, cl::values(clEnumValN(RegBankSelect::Mode::Fast, "regbankselect-fast", "Run the Fast mode (default mapping)"), clEnumValN(RegBankSelect::Mode::Greedy, "regbankselect-greedy", "Use the Greedy mode (best local mapping)")))
#define DEBUG_TYPE
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
This file defines the SmallVector class.
Target-Independent Code Generator Pass Configuration Options pass.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
constexpr unsigned getScalarSizeInBits() const
Definition: LowLevelType.h:267
constexpr bool isValid() const
Definition: LowLevelType.h:145
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
Definition: LowLevelType.h:159
constexpr bool isVector() const
Definition: LowLevelType.h:148
constexpr TypeSize getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
Definition: LowLevelType.h:193
const MachineBlockFrequencyInfo & getMBFI() const
Definition: MBFIWrapper.h:37
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
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.
bool hasProperty(Property P) const
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineFunctionProperties & getProperties() const
Get the function properties.
MachineInstr * CloneMachineInstr(const MachineInstr *Orig)
Create a new MachineInstr which is a copy of Orig, identical in all ways except the instruction has n...
MachineFunction & getMF()
Getter for the function we currently build.
void setMBB(MachineBasicBlock &MBB)
Set the insertion point to the end of MBB.
MachineInstrBuilder buildInstrNoInsert(unsigned Opcode)
Build but don't insert <empty> = Opcode <empty>.
void setMF(MachineFunction &MF)
const MachineInstrBuilder & addUse(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register use operand.
const MachineInstrBuilder & addDef(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register definition operand.
Representation of each machine instruction.
Definition: MachineInstr.h:69
bool readsRegister(Register Reg, const TargetRegisterInfo *TRI) const
Return true if the MachineInstr reads the specified register.
void insert(mop_iterator InsertBefore, ArrayRef< MachineOperand > Ops)
Inserts Ops BEFORE It. Can untie/retie tied operands.
bool isUnconditionalBranch(QueryType Type=AnyInBundle) const
Return true if this is a branch which always transfers control flow to some other block.
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
void setRegBank(Register Reg, const RegisterBank &RegBank)
Set the register bank to RegBank for Reg.
Pass interface - Implemented by all 'passes'.
Definition: Pass.h:94
Insertion point on an edge.
uint64_t frequency(const Pass &P) const override
Frequency of the insertion point.
bool canMaterialize() const override
Check whether this insertion point can be materialized.
Abstract class used to represent an insertion point in a CFG.
virtual bool canMaterialize() const
Check whether this insertion point can be materialized.
virtual bool isSplit() const
Does this point involve splitting an edge or block? As soon as getPoint is called and thus,...
Insertion point before or after an instruction.
InstrInsertPoint(MachineInstr &Instr, bool Before=true)
Create an insertion point before (Before=true) or after Instr.
bool isSplit() const override
Does this point involve splitting an edge or block? As soon as getPoint is called and thus,...
uint64_t frequency(const Pass &P) const override
Frequency of the insertion point.
Insertion point at the beginning or end of a basic block.
uint64_t frequency(const Pass &P) const override
Frequency of the insertion point.
Helper class used to represent the cost for mapping an instruction.
void saturate()
Saturate the cost to the maximal representable value.
bool operator==(const MappingCost &Cost) const
Check if this is equal to Cost.
bool addLocalCost(uint64_t Cost)
Add Cost to the local cost.
void dump() const
Print this on dbgs() stream.
static MappingCost ImpossibleCost()
Return an instance of MappingCost that represents an impossible mapping.
bool addNonLocalCost(uint64_t Cost)
Add Cost to the non-local cost.
bool operator<(const MappingCost &Cost) const
Check if this is less than Cost.
void print(raw_ostream &OS) const
Print this on OS;.
Struct used to represent the placement of a repairing point for a given operand.
RepairingPlacement(MachineInstr &MI, unsigned OpIdx, const TargetRegisterInfo &TRI, Pass &P, RepairingKind Kind=RepairingKind::Insert)
Create a repairing placement for the OpIdx-th operand of MI.
RepairingKind
Define the kind of action this repairing needs.
@ Insert
Reparing code needs to happen before InsertPoints.
@ None
Nothing to repair, just drop this action.
@ Reassign
(Re)assign the register bank of the operand.
@ Impossible
Mark this repairing placement as impossible.
void switchTo(RepairingKind NewKind)
Change the type of this repairing placement to NewKind.
void addInsertPoint(MachineBasicBlock &MBB, bool Beginning)
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
Definition: RegBankSelect.h:91
Mode
List of the modes supported by the RegBankSelect pass.
Definition: RegBankSelect.h:96
@ Fast
Assign the register banks as fast as possible (default).
Definition: RegBankSelect.h:98
bool checkFunctionIsLegal(MachineFunction &MF) const
Check that our input is fully legal: we require the function to have the Legalized property,...
MachineIRBuilder MIRBuilder
Helper class used for every code morphing.
MachineBlockFrequencyInfo * MBFI
Get the frequency of blocks.
Mode OptMode
Optimization mode of the pass.
const RegisterBankInfo::InstructionMapping & findBestMapping(MachineInstr &MI, RegisterBankInfo::InstructionMappings &PossibleMappings, SmallVectorImpl< RepairingPlacement > &RepairPts)
Find the best mapping for MI from PossibleMappings.
bool assignInstr(MachineInstr &MI)
Assign the register bank of each operand of MI.
bool assignRegisterBanks(MachineFunction &MF)
Walk through MF and assign a register bank to every virtual register that are still mapped to nothing...
void init(MachineFunction &MF)
Initialize the field members using MF.
void tryAvoidingSplit(RegBankSelect::RepairingPlacement &RepairPt, const MachineOperand &MO, const RegisterBankInfo::ValueMapping &ValMapping) const
When RepairPt involves splitting to repair MO for the given ValMapping, try to change the way we repa...
const TargetRegisterInfo * TRI
Information on the register classes for the current function.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
MachineBranchProbabilityInfo * MBPI
Get the frequency of the edges.
bool assignmentMatch(Register Reg, const RegisterBankInfo::ValueMapping &ValMapping, bool &OnlyAssign) const
Check if Reg is already assigned what is described by ValMapping.
uint64_t getRepairCost(const MachineOperand &MO, const RegisterBankInfo::ValueMapping &ValMapping) const
Return the cost of the instruction needed to map MO to ValMapping.
MappingCost computeMapping(MachineInstr &MI, const RegisterBankInfo::InstructionMapping &InstrMapping, SmallVectorImpl< RepairingPlacement > &RepairPts, const MappingCost *BestCost=nullptr)
Compute the cost of mapping MI with InstrMapping and compute the repairing placement for such mapping...
bool repairReg(MachineOperand &MO, const RegisterBankInfo::ValueMapping &ValMapping, RegBankSelect::RepairingPlacement &RepairPt, const iterator_range< SmallVectorImpl< Register >::const_iterator > &NewVRegs)
Insert repairing code for Reg as specified by ValMapping.
MachineRegisterInfo * MRI
MRI contains all the register class/bank information that this pass uses and updates.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
const TargetPassConfig * TPC
Current target configuration. Controls how the pass handles errors.
const RegisterBankInfo * RBI
Interface to the target lowering info related to register banks.
std::unique_ptr< MachineOptimizationRemarkEmitter > MORE
Current optimization remark emitter. Used to report failures.
bool applyMapping(MachineInstr &MI, const RegisterBankInfo::InstructionMapping &InstrMapping, SmallVectorImpl< RepairingPlacement > &RepairPts)
Apply Mapping to MI.
Helper class that represents how the value of an instruction may be mapped and what is the related co...
unsigned getNumOperands() const
Get the number of operands.
unsigned getCost() const
Get the cost.
bool verify(const MachineInstr &MI) const
Verifiy that this mapping makes sense for MI.
bool isValid() const
Check whether this object is valid.
Helper class used to get/create the virtual registers that will be used to replace the MachineOperand...
void createVRegs(unsigned OpIdx)
Create as many new virtual registers as needed for the mapping of the OpIdx-th operand.
iterator_range< SmallVectorImpl< Register >::const_iterator > getVRegs(unsigned OpIdx, bool ForDebug=false) const
Get all the virtual registers required to map the OpIdx-th operand of the instruction.
void applyMapping(MachineIRBuilder &Builder, const OperandsMapper &OpdMapper) const
Apply OpdMapper.getInstrMapping() to OpdMapper.getMI().
virtual const InstructionMapping & getInstrMapping(const MachineInstr &MI) const
Get the mapping of the different operands of MI on the register bank.
const RegisterBank & getRegBank(unsigned ID)
Get the register bank identified by ID.
TypeSize getSizeInBits(Register Reg, const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI) const
Get the size in bits of Reg.
InstructionMappings getInstrPossibleMappings(const MachineInstr &MI) const
Get the possible mapping for MI.
virtual unsigned copyCost(const RegisterBank &A, const RegisterBank &B, TypeSize Size) const
Get the cost of a copy from B to A, or put differently, get the cost of A = COPY B.
virtual unsigned getBreakDownCost(const ValueMapping &ValMapping, const RegisterBank *CurBank=nullptr) const
Get the cost of using ValMapping to decompose a register.
This class implements the register bank concept.
Definition: RegisterBank.h:28
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
bool empty() const
Definition: SmallVector.h:94
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
typename SuperClass::const_iterator const_iterator
Definition: SmallVector.h:591
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
Target-Independent Code Generator Pass Configuration Options.
bool isGlobalISelAbortEnabled() const
Check whether or not GlobalISel should abort on error.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const RegisterBankInfo * getRegBankInfo() const
If the information for the register banks is available, return it.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
#define UINT64_MAX
Definition: DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:711
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition: STLExtras.h:1680
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr)
bool isPreISelGenericOptimizationHint(unsigned Opcode)
Definition: TargetOpcodes.h:42
cl::opt< bool > DisableGISelLegalityCheck
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:419
void reportGISelFailure(MachineFunction &MF, const TargetPassConfig &TPC, MachineOptimizationRemarkEmitter &MORE, MachineOptimizationRemarkMissed &R)
Report an ISel error as a missed optimization remark to the LLVMContext's diagnostic stream.
Definition: Utils.cpp:275
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
Printable printRegClassOrBank(Register Reg, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Create Printable object to print register classes or register banks on a raw_ostream.
const MachineInstr * machineFunctionIsIllegal(const MachineFunction &MF)
Checks that MIR is fully legal, returns an illegal instruction if it's not, nullptr otherwise.
void getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU)
Modify analysis usage so it preserves passes required for the SelectionDAG fallback.
Definition: Utils.cpp:1168
bool isTargetSpecificOpcode(unsigned Opcode)
Check whether the given Opcode is a target-specific opcode.
Definition: TargetOpcodes.h:36
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition: iterator.h:363
InstructionCost Cost
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.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
const RegisterBank * RegBank
Register bank where the partial value lives.
unsigned Length
Length of this mapping in bits.
Helper struct that represents how a value is mapped through different register banks.
unsigned NumBreakDowns
Number of partial mapping to break down this value.
const PartialMapping * BreakDown
How the value is broken down between the different register banks.