LLVM 19.0.0git
SelectionDAGISel.cpp
Go to the documentation of this file.
1//===- SelectionDAGISel.cpp - Implement the SelectionDAGISel class --------===//
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 implements the SelectionDAGISel class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "ScheduleDAGSDNodes.h"
15#include "SelectionDAGBuilder.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/Statistic.h"
23#include "llvm/ADT/StringRef.h"
27#include "llvm/Analysis/CFG.h"
64#include "llvm/IR/BasicBlock.h"
65#include "llvm/IR/Constants.h"
66#include "llvm/IR/DataLayout.h"
67#include "llvm/IR/DebugInfo.h"
69#include "llvm/IR/DebugLoc.h"
72#include "llvm/IR/Function.h"
73#include "llvm/IR/InlineAsm.h"
75#include "llvm/IR/Instruction.h"
78#include "llvm/IR/Intrinsics.h"
79#include "llvm/IR/IntrinsicsWebAssembly.h"
80#include "llvm/IR/Metadata.h"
81#include "llvm/IR/Module.h"
82#include "llvm/IR/PrintPasses.h"
83#include "llvm/IR/Statepoint.h"
84#include "llvm/IR/Type.h"
85#include "llvm/IR/User.h"
86#include "llvm/IR/Value.h"
88#include "llvm/MC/MCInstrDesc.h"
89#include "llvm/Pass.h"
95#include "llvm/Support/Debug.h"
98#include "llvm/Support/Timer.h"
104#include <algorithm>
105#include <cassert>
106#include <cstdint>
107#include <iterator>
108#include <limits>
109#include <memory>
110#include <optional>
111#include <string>
112#include <utility>
113#include <vector>
114
115using namespace llvm;
116
117#define DEBUG_TYPE "isel"
118#define ISEL_DUMP_DEBUG_TYPE DEBUG_TYPE "-dump"
119
120STATISTIC(NumFastIselFailures, "Number of instructions fast isel failed on");
121STATISTIC(NumFastIselSuccess, "Number of instructions fast isel selected");
122STATISTIC(NumFastIselBlocks, "Number of blocks selected entirely by fast isel");
123STATISTIC(NumDAGBlocks, "Number of blocks selected using DAG");
124STATISTIC(NumDAGIselRetries,"Number of times dag isel has to try another path");
125STATISTIC(NumEntryBlocks, "Number of entry blocks encountered");
126STATISTIC(NumFastIselFailLowerArguments,
127 "Number of entry blocks where fast isel failed to lower arguments");
128
130 "fast-isel-abort", cl::Hidden,
131 cl::desc("Enable abort calls when \"fast\" instruction selection "
132 "fails to lower an instruction: 0 disable the abort, 1 will "
133 "abort but for args, calls and terminators, 2 will also "
134 "abort for argument lowering, and 3 will never fallback "
135 "to SelectionDAG."));
136
138 "fast-isel-report-on-fallback", cl::Hidden,
139 cl::desc("Emit a diagnostic when \"fast\" instruction selection "
140 "falls back to SelectionDAG."));
141
142static cl::opt<bool>
143UseMBPI("use-mbpi",
144 cl::desc("use Machine Branch Probability Info"),
145 cl::init(true), cl::Hidden);
146
147#ifndef NDEBUG
150 cl::desc("Only display the basic block whose name "
151 "matches this for all view-*-dags options"));
152static cl::opt<bool>
153ViewDAGCombine1("view-dag-combine1-dags", cl::Hidden,
154 cl::desc("Pop up a window to show dags before the first "
155 "dag combine pass"));
156static cl::opt<bool>
157ViewLegalizeTypesDAGs("view-legalize-types-dags", cl::Hidden,
158 cl::desc("Pop up a window to show dags before legalize types"));
159static cl::opt<bool>
160 ViewDAGCombineLT("view-dag-combine-lt-dags", cl::Hidden,
161 cl::desc("Pop up a window to show dags before the post "
162 "legalize types dag combine pass"));
163static cl::opt<bool>
164 ViewLegalizeDAGs("view-legalize-dags", cl::Hidden,
165 cl::desc("Pop up a window to show dags before legalize"));
166static cl::opt<bool>
167ViewDAGCombine2("view-dag-combine2-dags", cl::Hidden,
168 cl::desc("Pop up a window to show dags before the second "
169 "dag combine pass"));
170static cl::opt<bool>
171ViewISelDAGs("view-isel-dags", cl::Hidden,
172 cl::desc("Pop up a window to show isel dags as they are selected"));
173static cl::opt<bool>
174ViewSchedDAGs("view-sched-dags", cl::Hidden,
175 cl::desc("Pop up a window to show sched dags as they are processed"));
176static cl::opt<bool>
177ViewSUnitDAGs("view-sunit-dags", cl::Hidden,
178 cl::desc("Pop up a window to show SUnit dags after they are processed"));
179#else
180static const bool ViewDAGCombine1 = false, ViewLegalizeTypesDAGs = false,
181 ViewDAGCombineLT = false, ViewLegalizeDAGs = false,
182 ViewDAGCombine2 = false, ViewISelDAGs = false,
183 ViewSchedDAGs = false, ViewSUnitDAGs = false;
184#endif
185
186#ifndef NDEBUG
187#define ISEL_DUMP(X) \
188 do { \
189 if (llvm::DebugFlag && \
190 (isCurrentDebugType(DEBUG_TYPE) || \
191 (isCurrentDebugType(ISEL_DUMP_DEBUG_TYPE) && MatchFilterFuncName))) { \
192 X; \
193 } \
194 } while (false)
195#else
196#define ISEL_DUMP(X) do { } while (false)
197#endif
198
199//===---------------------------------------------------------------------===//
200///
201/// RegisterScheduler class - Track the registration of instruction schedulers.
202///
203//===---------------------------------------------------------------------===//
206
207//===---------------------------------------------------------------------===//
208///
209/// ISHeuristic command line option for instruction schedulers.
210///
211//===---------------------------------------------------------------------===//
214ISHeuristic("pre-RA-sched",
216 cl::desc("Instruction schedulers available (before register"
217 " allocation):"));
218
220defaultListDAGScheduler("default", "Best scheduler for the target",
222
223static bool dontUseFastISelFor(const Function &Fn) {
224 // Don't enable FastISel for functions with swiftasync Arguments.
225 // Debug info on those is reliant on good Argument lowering, and FastISel is
226 // not capable of lowering the entire function. Mixing the two selectors tend
227 // to result in poor lowering of Arguments.
228 return any_of(Fn.args(), [](const Argument &Arg) {
229 return Arg.hasAttribute(Attribute::AttrKind::SwiftAsync);
230 });
231}
232
233namespace llvm {
234
235 //===--------------------------------------------------------------------===//
236 /// This class is used by SelectionDAGISel to temporarily override
237 /// the optimization level on a per-function basis.
240 CodeGenOptLevel SavedOptLevel;
241 bool SavedFastISel;
242
243 public:
245 : IS(ISel) {
246 SavedOptLevel = IS.OptLevel;
247 SavedFastISel = IS.TM.Options.EnableFastISel;
248 if (NewOptLevel != SavedOptLevel) {
249 IS.OptLevel = NewOptLevel;
250 IS.TM.setOptLevel(NewOptLevel);
251 LLVM_DEBUG(dbgs() << "\nChanging optimization level for Function "
252 << IS.MF->getFunction().getName() << "\n");
253 LLVM_DEBUG(dbgs() << "\tBefore: -O" << static_cast<int>(SavedOptLevel)
254 << " ; After: -O" << static_cast<int>(NewOptLevel)
255 << "\n");
256 if (NewOptLevel == CodeGenOptLevel::None)
258 }
260 IS.TM.setFastISel(false);
262 dbgs() << "\tFastISel is "
263 << (IS.TM.Options.EnableFastISel ? "enabled" : "disabled")
264 << "\n");
265 }
266
268 if (IS.OptLevel == SavedOptLevel)
269 return;
270 LLVM_DEBUG(dbgs() << "\nRestoring optimization level for Function "
271 << IS.MF->getFunction().getName() << "\n");
272 LLVM_DEBUG(dbgs() << "\tBefore: -O" << static_cast<int>(IS.OptLevel)
273 << " ; After: -O" << static_cast<int>(SavedOptLevel) << "\n");
274 IS.OptLevel = SavedOptLevel;
275 IS.TM.setOptLevel(SavedOptLevel);
276 IS.TM.setFastISel(SavedFastISel);
277 }
278 };
279
280 //===--------------------------------------------------------------------===//
281 /// createDefaultScheduler - This creates an instruction scheduler appropriate
282 /// for the target.
284 CodeGenOptLevel OptLevel) {
285 const TargetLowering *TLI = IS->TLI;
286 const TargetSubtargetInfo &ST = IS->MF->getSubtarget();
287
288 // Try first to see if the Target has its own way of selecting a scheduler
289 if (auto *SchedulerCtor = ST.getDAGScheduler(OptLevel)) {
290 return SchedulerCtor(IS, OptLevel);
291 }
292
293 if (OptLevel == CodeGenOptLevel::None ||
294 (ST.enableMachineScheduler() && ST.enableMachineSchedDefaultSched()) ||
296 return createSourceListDAGScheduler(IS, OptLevel);
298 return createBURRListDAGScheduler(IS, OptLevel);
300 return createHybridListDAGScheduler(IS, OptLevel);
302 return createVLIWDAGScheduler(IS, OptLevel);
304 return createFastDAGScheduler(IS, OptLevel);
306 return createDAGLinearizer(IS, OptLevel);
308 "Unknown sched type!");
309 return createILPListDAGScheduler(IS, OptLevel);
310 }
311
312} // end namespace llvm
313
316 MachineBasicBlock *MBB) const {
317#ifndef NDEBUG
318 dbgs() << "If a target marks an instruction with "
319 "'usesCustomInserter', it must implement "
320 "TargetLowering::EmitInstrWithCustomInserter!\n";
321#endif
322 llvm_unreachable(nullptr);
323}
324
326 SDNode *Node) const {
327 assert(!MI.hasPostISelHook() &&
328 "If a target marks an instruction with 'hasPostISelHook', "
329 "it must implement TargetLowering::AdjustInstrPostInstrSelection!");
330}
331
332//===----------------------------------------------------------------------===//
333// SelectionDAGISel code
334//===----------------------------------------------------------------------===//
335
337 char &ID, std::unique_ptr<SelectionDAGISel> S)
338 : MachineFunctionPass(ID), Selector(std::move(S)) {
344}
345
347 // If we already selected that function, we do not need to run SDISel.
348 if (MF.getProperties().hasProperty(
350 return false;
351
352 // Do some sanity-checking on the command-line options.
353 if (EnableFastISelAbort && !Selector->TM.Options.EnableFastISel)
354 report_fatal_error("-fast-isel-abort > 0 requires -fast-isel");
355
356 // Decide what flavour of variable location debug-info will be used, before
357 // we change the optimisation level.
359
360 // Reset the target options before resetting the optimization
361 // level below.
362 // FIXME: This is a horrible hack and should be processed via
363 // codegen looking at the optimization level explicitly when
364 // it wants to look at it.
365 Selector->TM.resetTargetOptions(MF.getFunction());
366 // Reset OptLevel to None for optnone functions.
367 CodeGenOptLevel NewOptLevel = skipFunction(MF.getFunction())
369 : Selector->OptLevel;
370
371 Selector->MF = &MF;
372 OptLevelChanger OLC(*Selector, NewOptLevel);
373 Selector->initializeAnalysisResults(*this);
374 return Selector->runOnMachineFunction(MF);
375}
376
378 : TM(tm), FuncInfo(new FunctionLoweringInfo()),
379 SwiftError(new SwiftErrorValueTracking()),
380 CurDAG(new SelectionDAG(tm, OL)),
381 SDB(std::make_unique<SelectionDAGBuilder>(*CurDAG, *FuncInfo, *SwiftError,
382 OL)),
383 OptLevel(OL) {
389}
390
392 delete CurDAG;
393 delete SwiftError;
394}
395
397 CodeGenOptLevel OptLevel = Selector->OptLevel;
398 if (OptLevel != CodeGenOptLevel::None)
404#ifndef NDEBUG
406#endif
408 if (UseMBPI && OptLevel != CodeGenOptLevel::None)
411 // AssignmentTrackingAnalysis only runs if assignment tracking is enabled for
412 // the module.
415 if (OptLevel != CodeGenOptLevel::None)
418}
419
420static void computeUsesMSVCFloatingPoint(const Triple &TT, const Function &F,
421 MachineModuleInfo &MMI) {
422 // Only needed for MSVC
423 if (!TT.isWindowsMSVCEnvironment())
424 return;
425
426 // If it's already set, nothing to do.
427 if (MMI.usesMSVCFloatingPoint())
428 return;
429
430 for (const Instruction &I : instructions(F)) {
431 if (I.getType()->isFPOrFPVectorTy()) {
432 MMI.setUsesMSVCFloatingPoint(true);
433 return;
434 }
435 for (const auto &Op : I.operands()) {
436 if (Op->getType()->isFPOrFPVectorTy()) {
437 MMI.setUsesMSVCFloatingPoint(true);
438 return;
439 }
440 }
441 }
442}
443
447 // If we already selected that function, we do not need to run SDISel.
448 if (MF.getProperties().hasProperty(
450 return PreservedAnalyses::all();
451
452 // Do some sanity-checking on the command-line options.
453 if (EnableFastISelAbort && !Selector->TM.Options.EnableFastISel)
454 report_fatal_error("-fast-isel-abort > 0 requires -fast-isel");
455
456 // Decide what flavour of variable location debug-info will be used, before
457 // we change the optimisation level.
459
460 // Reset the target options before resetting the optimization
461 // level below.
462 // FIXME: This is a horrible hack and should be processed via
463 // codegen looking at the optimization level explicitly when
464 // it wants to look at it.
465 Selector->TM.resetTargetOptions(MF.getFunction());
466 // Reset OptLevel to None for optnone functions.
467 // TODO: Add a function analysis to handle this.
468 Selector->MF = &MF;
469 // Reset OptLevel to None for optnone functions.
470 CodeGenOptLevel NewOptLevel = MF.getFunction().hasOptNone()
472 : Selector->OptLevel;
473
474 OptLevelChanger OLC(*Selector, NewOptLevel);
475 Selector->initializeAnalysisResults(MFAM);
476 Selector->runOnMachineFunction(MF);
477
479}
480
484 .getManager();
486 Function &Fn = MF->getFunction();
487#ifndef NDEBUG
488 FuncName = Fn.getName();
490#else
492#endif
493
496 RegInfo = &MF->getRegInfo();
498 GFI = Fn.hasGC() ? &FAM.getResult<GCFunctionAnalysis>(Fn) : nullptr;
499 ORE = std::make_unique<OptimizationRemarkEmitter>(&Fn);
501 auto *PSI = MAMP.getCachedResult<ProfileSummaryAnalysis>(*Fn.getParent());
502 BlockFrequencyInfo *BFI = nullptr;
504 if (PSI && PSI->hasProfileSummary() && OptLevel != CodeGenOptLevel::None)
506
507 FunctionVarLocs const *FnVarLocs = nullptr;
510
512 CurDAG->init(*MF, *ORE, MFAM, LibInfo, UA, PSI, BFI, FnVarLocs);
513
514 // Now get the optional analyzes if we want to.
515 // This is based on the possibly changed OptLevel (after optnone is taken
516 // into account). That's unfortunate but OK because it just means we won't
517 // ask for passes that have been required anyway.
518
521 else
522 FuncInfo->BPI = nullptr;
523
525 AA = &FAM.getResult<AAManager>(Fn);
526 else
527 AA = nullptr;
528
530
531#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
533#endif
534}
535
537 Function &Fn = MF->getFunction();
538#ifndef NDEBUG
539 FuncName = Fn.getName();
541#else
543#endif
544
547 RegInfo = &MF->getRegInfo();
549 GFI = Fn.hasGC() ? &MFP.getAnalysis<GCModuleInfo>().getFunctionInfo(Fn)
550 : nullptr;
551 ORE = std::make_unique<OptimizationRemarkEmitter>(&Fn);
552 AC = &MFP.getAnalysis<AssumptionCacheTracker>().getAssumptionCache(Fn);
553 auto *PSI = &MFP.getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
554 BlockFrequencyInfo *BFI = nullptr;
555 if (PSI && PSI->hasProfileSummary() && OptLevel != CodeGenOptLevel::None)
556 BFI = &MFP.getAnalysis<LazyBlockFrequencyInfoPass>().getBFI();
557
558 FunctionVarLocs const *FnVarLocs = nullptr;
560 FnVarLocs = MFP.getAnalysis<AssignmentTrackingAnalysis>().getResults();
561
562 UniformityInfo *UA = nullptr;
563 if (auto *UAPass = MFP.getAnalysisIfAvailable<UniformityInfoWrapperPass>())
564 UA = &UAPass->getUniformityInfo();
565 CurDAG->init(*MF, *ORE, &MFP, LibInfo, UA, PSI, BFI, FnVarLocs);
566
567 // Now get the optional analyzes if we want to.
568 // This is based on the possibly changed OptLevel (after optnone is taken
569 // into account). That's unfortunate but OK because it just means we won't
570 // ask for passes that have been required anyway.
571
573 FuncInfo->BPI =
575 else
576 FuncInfo->BPI = nullptr;
577
579 AA = &MFP.getAnalysis<AAResultsWrapperPass>().getAAResults();
580 else
581 AA = nullptr;
582
583 SP = &MFP.getAnalysis<StackProtector>().getLayoutInfo();
584
585#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
587#endif
588}
589
592 const Function &Fn = mf.getFunction();
593
594 bool InstrRef = mf.shouldUseDebugInstrRef();
595
596 FuncInfo->set(MF->getFunction(), *MF, CurDAG);
597
598 ISEL_DUMP(dbgs() << "\n\n\n=== " << FuncName << '\n');
599
600 SDB->init(GFI, AA, AC, LibInfo);
601
602 MF->setHasInlineAsm(false);
603
604 FuncInfo->SplitCSR = false;
605
606 // We split CSR if the target supports it for the given function
607 // and the function has only return exits.
609 FuncInfo->SplitCSR = true;
610
611 // Collect all the return blocks.
612 for (const BasicBlock &BB : Fn) {
613 if (!succ_empty(&BB))
614 continue;
615
616 const Instruction *Term = BB.getTerminator();
617 if (isa<UnreachableInst>(Term) || isa<ReturnInst>(Term))
618 continue;
619
620 // Bail out if the exit block is not Return nor Unreachable.
621 FuncInfo->SplitCSR = false;
622 break;
623 }
624 }
625
626 MachineBasicBlock *EntryMBB = &MF->front();
627 if (FuncInfo->SplitCSR)
628 // This performs initialization so lowering for SplitCSR will be correct.
629 TLI->initializeSplitCSR(EntryMBB);
630
631 SelectAllBasicBlocks(Fn);
633 DiagnosticInfoISelFallback DiagFallback(Fn);
634 Fn.getContext().diagnose(DiagFallback);
635 }
636
637 // Replace forward-declared registers with the registers containing
638 // the desired value.
639 // Note: it is important that this happens **before** the call to
640 // EmitLiveInCopies, since implementations can skip copies of unused
641 // registers. If we don't apply the reg fixups before, some registers may
642 // appear as unused and will be skipped, resulting in bad MI.
644 for (DenseMap<Register, Register>::iterator I = FuncInfo->RegFixups.begin(),
645 E = FuncInfo->RegFixups.end();
646 I != E; ++I) {
647 Register From = I->first;
648 Register To = I->second;
649 // If To is also scheduled to be replaced, find what its ultimate
650 // replacement is.
651 while (true) {
652 DenseMap<Register, Register>::iterator J = FuncInfo->RegFixups.find(To);
653 if (J == E)
654 break;
655 To = J->second;
656 }
657 // Make sure the new register has a sufficiently constrained register class.
658 if (From.isVirtual() && To.isVirtual())
659 MRI.constrainRegClass(To, MRI.getRegClass(From));
660 // Replace it.
661
662 // Replacing one register with another won't touch the kill flags.
663 // We need to conservatively clear the kill flags as a kill on the old
664 // register might dominate existing uses of the new register.
665 if (!MRI.use_empty(To))
666 MRI.clearKillFlags(From);
667 MRI.replaceRegWith(From, To);
668 }
669
670 // If the first basic block in the function has live ins that need to be
671 // copied into vregs, emit the copies into the top of the block before
672 // emitting the code for the block.
674 RegInfo->EmitLiveInCopies(EntryMBB, TRI, *TII);
675
676 // Insert copies in the entry block and the return blocks.
677 if (FuncInfo->SplitCSR) {
679 // Collect all the return blocks.
680 for (MachineBasicBlock &MBB : mf) {
681 if (!MBB.succ_empty())
682 continue;
683
685 if (Term != MBB.end() && Term->isReturn()) {
686 Returns.push_back(&MBB);
687 continue;
688 }
689 }
690 TLI->insertCopiesSplitCSR(EntryMBB, Returns);
691 }
692
694 if (!FuncInfo->ArgDbgValues.empty())
695 for (std::pair<unsigned, unsigned> LI : RegInfo->liveins())
696 if (LI.second)
697 LiveInMap.insert(LI);
698
699 // Insert DBG_VALUE instructions for function arguments to the entry block.
700 for (unsigned i = 0, e = FuncInfo->ArgDbgValues.size(); i != e; ++i) {
701 MachineInstr *MI = FuncInfo->ArgDbgValues[e - i - 1];
702 assert(MI->getOpcode() != TargetOpcode::DBG_VALUE_LIST &&
703 "Function parameters should not be described by DBG_VALUE_LIST.");
704 bool hasFI = MI->getDebugOperand(0).isFI();
705 Register Reg =
706 hasFI ? TRI.getFrameRegister(*MF) : MI->getDebugOperand(0).getReg();
707 if (Reg.isPhysical())
708 EntryMBB->insert(EntryMBB->begin(), MI);
709 else {
710 MachineInstr *Def = RegInfo->getVRegDef(Reg);
711 if (Def) {
712 MachineBasicBlock::iterator InsertPos = Def;
713 // FIXME: VR def may not be in entry block.
714 Def->getParent()->insert(std::next(InsertPos), MI);
715 } else
716 LLVM_DEBUG(dbgs() << "Dropping debug info for dead vreg"
717 << Register::virtReg2Index(Reg) << "\n");
718 }
719
720 // Don't try and extend through copies in instruction referencing mode.
721 if (InstrRef)
722 continue;
723
724 // If Reg is live-in then update debug info to track its copy in a vreg.
725 DenseMap<unsigned, unsigned>::iterator LDI = LiveInMap.find(Reg);
726 if (LDI != LiveInMap.end()) {
727 assert(!hasFI && "There's no handling of frame pointer updating here yet "
728 "- add if needed");
729 MachineInstr *Def = RegInfo->getVRegDef(LDI->second);
730 MachineBasicBlock::iterator InsertPos = Def;
731 const MDNode *Variable = MI->getDebugVariable();
732 const MDNode *Expr = MI->getDebugExpression();
733 DebugLoc DL = MI->getDebugLoc();
734 bool IsIndirect = MI->isIndirectDebugValue();
735 if (IsIndirect)
736 assert(MI->getDebugOffset().getImm() == 0 &&
737 "DBG_VALUE with nonzero offset");
738 assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
739 "Expected inlined-at fields to agree");
740 assert(MI->getOpcode() != TargetOpcode::DBG_VALUE_LIST &&
741 "Didn't expect to see a DBG_VALUE_LIST here");
742 // Def is never a terminator here, so it is ok to increment InsertPos.
743 BuildMI(*EntryMBB, ++InsertPos, DL, TII->get(TargetOpcode::DBG_VALUE),
744 IsIndirect, LDI->second, Variable, Expr);
745
746 // If this vreg is directly copied into an exported register then
747 // that COPY instructions also need DBG_VALUE, if it is the only
748 // user of LDI->second.
749 MachineInstr *CopyUseMI = nullptr;
750 for (MachineInstr &UseMI : RegInfo->use_instructions(LDI->second)) {
751 if (UseMI.isDebugValue())
752 continue;
753 if (UseMI.isCopy() && !CopyUseMI && UseMI.getParent() == EntryMBB) {
754 CopyUseMI = &UseMI;
755 continue;
756 }
757 // Otherwise this is another use or second copy use.
758 CopyUseMI = nullptr;
759 break;
760 }
761 if (CopyUseMI &&
762 TRI.getRegSizeInBits(LDI->second, MRI) ==
763 TRI.getRegSizeInBits(CopyUseMI->getOperand(0).getReg(), MRI)) {
764 // Use MI's debug location, which describes where Variable was
765 // declared, rather than whatever is attached to CopyUseMI.
766 MachineInstr *NewMI =
767 BuildMI(*MF, DL, TII->get(TargetOpcode::DBG_VALUE), IsIndirect,
768 CopyUseMI->getOperand(0).getReg(), Variable, Expr);
769 MachineBasicBlock::iterator Pos = CopyUseMI;
770 EntryMBB->insertAfter(Pos, NewMI);
771 }
772 }
773 }
774
775 // For debug-info, in instruction referencing mode, we need to perform some
776 // post-isel maintenence.
777 if (MF->useDebugInstrRef())
779
780 // Determine if there are any calls in this machine function.
782 for (const auto &MBB : *MF) {
783 if (MFI.hasCalls() && MF->hasInlineAsm())
784 break;
785
786 for (const auto &MI : MBB) {
787 const MCInstrDesc &MCID = TII->get(MI.getOpcode());
788 if ((MCID.isCall() && !MCID.isReturn()) ||
789 MI.isStackAligningInlineAsm()) {
790 MFI.setHasCalls(true);
791 }
792 if (MI.isInlineAsm()) {
793 MF->setHasInlineAsm(true);
794 }
795 }
796 }
797
798 // Determine if floating point is used for msvc
800
801 // Release function-specific state. SDB and CurDAG are already cleared
802 // at this point.
803 FuncInfo->clear();
804
805 ISEL_DUMP(dbgs() << "*** MachineFunction at end of ISel ***\n");
806 ISEL_DUMP(MF->print(dbgs()));
807
808 return true;
809}
810
814 bool ShouldAbort) {
815 // Print the function name explicitly if we don't have a debug location (which
816 // makes the diagnostic less useful) or if we're going to emit a raw error.
817 if (!R.getLocation().isValid() || ShouldAbort)
818 R << (" (in function: " + MF.getName() + ")").str();
819
820 if (ShouldAbort)
821 report_fatal_error(Twine(R.getMsg()));
822
823 ORE.emit(R);
824 LLVM_DEBUG(dbgs() << R.getMsg() << "\n");
825}
826
827void SelectionDAGISel::SelectBasicBlock(BasicBlock::const_iterator Begin,
829 bool &HadTailCall) {
830 // Allow creating illegal types during DAG building for the basic block.
832
833 // Lower the instructions. If a call is emitted as a tail call, cease emitting
834 // nodes for this block. If an instruction is elided, don't emit it, but do
835 // handle any debug-info attached to it.
836 for (BasicBlock::const_iterator I = Begin; I != End && !SDB->HasTailCall; ++I) {
837 if (!ElidedArgCopyInstrs.count(&*I))
838 SDB->visit(*I);
839 else
840 SDB->visitDbgInfo(*I);
841 }
842
843 // Make sure the root of the DAG is up-to-date.
844 CurDAG->setRoot(SDB->getControlRoot());
845 HadTailCall = SDB->HasTailCall;
846 SDB->resolveOrClearDbgInfo();
847 SDB->clear();
848
849 // Final step, emit the lowered DAG as machine code.
850 CodeGenAndEmitDAG();
851}
852
853void SelectionDAGISel::ComputeLiveOutVRegInfo() {
856
857 Worklist.push_back(CurDAG->getRoot().getNode());
858 Added.insert(CurDAG->getRoot().getNode());
859
860 KnownBits Known;
861
862 do {
863 SDNode *N = Worklist.pop_back_val();
864
865 // Otherwise, add all chain operands to the worklist.
866 for (const SDValue &Op : N->op_values())
867 if (Op.getValueType() == MVT::Other && Added.insert(Op.getNode()).second)
868 Worklist.push_back(Op.getNode());
869
870 // If this is a CopyToReg with a vreg dest, process it.
871 if (N->getOpcode() != ISD::CopyToReg)
872 continue;
873
874 unsigned DestReg = cast<RegisterSDNode>(N->getOperand(1))->getReg();
875 if (!Register::isVirtualRegister(DestReg))
876 continue;
877
878 // Ignore non-integer values.
879 SDValue Src = N->getOperand(2);
880 EVT SrcVT = Src.getValueType();
881 if (!SrcVT.isInteger())
882 continue;
883
884 unsigned NumSignBits = CurDAG->ComputeNumSignBits(Src);
885 Known = CurDAG->computeKnownBits(Src);
886 FuncInfo->AddLiveOutRegInfo(DestReg, NumSignBits, Known);
887 } while (!Worklist.empty());
888}
889
890void SelectionDAGISel::CodeGenAndEmitDAG() {
891 StringRef GroupName = "sdag";
892 StringRef GroupDescription = "Instruction Selection and Scheduling";
893 std::string BlockName;
894 bool MatchFilterBB = false;
895 (void)MatchFilterBB;
896
897 // Pre-type legalization allow creation of any node types.
899
900#ifndef NDEBUG
901 MatchFilterBB = (FilterDAGBasicBlockName.empty() ||
903 FuncInfo->MBB->getBasicBlock()->getName());
904#endif
905#ifdef NDEBUG
909#endif
910 {
911 BlockName =
912 (MF->getName() + ":" + FuncInfo->MBB->getBasicBlock()->getName()).str();
913 }
914 ISEL_DUMP(dbgs() << "\nInitial selection DAG: "
915 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
916 << "'\n";
917 CurDAG->dump());
918
919#if LLVM_ENABLE_ABI_BREAKING_CHECKS
922#endif
923
924 if (ViewDAGCombine1 && MatchFilterBB)
925 CurDAG->viewGraph("dag-combine1 input for " + BlockName);
926
927 // Run the DAG combiner in pre-legalize mode.
928 {
929 NamedRegionTimer T("combine1", "DAG Combining 1", GroupName,
930 GroupDescription, TimePassesIsEnabled);
932 }
933
934 ISEL_DUMP(dbgs() << "\nOptimized lowered selection DAG: "
935 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
936 << "'\n";
937 CurDAG->dump());
938
939#if LLVM_ENABLE_ABI_BREAKING_CHECKS
942#endif
943
944 // Second step, hack on the DAG until it only uses operations and types that
945 // the target supports.
946 if (ViewLegalizeTypesDAGs && MatchFilterBB)
947 CurDAG->viewGraph("legalize-types input for " + BlockName);
948
949 bool Changed;
950 {
951 NamedRegionTimer T("legalize_types", "Type Legalization", GroupName,
952 GroupDescription, TimePassesIsEnabled);
953 Changed = CurDAG->LegalizeTypes();
954 }
955
956 ISEL_DUMP(dbgs() << "\nType-legalized selection DAG: "
957 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
958 << "'\n";
959 CurDAG->dump());
960
961#if LLVM_ENABLE_ABI_BREAKING_CHECKS
964#endif
965
966 // Only allow creation of legal node types.
968
969 if (Changed) {
970 if (ViewDAGCombineLT && MatchFilterBB)
971 CurDAG->viewGraph("dag-combine-lt input for " + BlockName);
972
973 // Run the DAG combiner in post-type-legalize mode.
974 {
975 NamedRegionTimer T("combine_lt", "DAG Combining after legalize types",
976 GroupName, GroupDescription, TimePassesIsEnabled);
978 }
979
980 ISEL_DUMP(dbgs() << "\nOptimized type-legalized selection DAG: "
981 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
982 << "'\n";
983 CurDAG->dump());
984
985#if LLVM_ENABLE_ABI_BREAKING_CHECKS
988#endif
989 }
990
991 {
992 NamedRegionTimer T("legalize_vec", "Vector Legalization", GroupName,
993 GroupDescription, TimePassesIsEnabled);
994 Changed = CurDAG->LegalizeVectors();
995 }
996
997 if (Changed) {
998 ISEL_DUMP(dbgs() << "\nVector-legalized selection DAG: "
999 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
1000 << "'\n";
1001 CurDAG->dump());
1002
1003#if LLVM_ENABLE_ABI_BREAKING_CHECKS
1004 if (TTI->hasBranchDivergence())
1006#endif
1007
1008 {
1009 NamedRegionTimer T("legalize_types2", "Type Legalization 2", GroupName,
1010 GroupDescription, TimePassesIsEnabled);
1012 }
1013
1014 ISEL_DUMP(dbgs() << "\nVector/type-legalized selection DAG: "
1015 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
1016 << "'\n";
1017 CurDAG->dump());
1018
1019#if LLVM_ENABLE_ABI_BREAKING_CHECKS
1020 if (TTI->hasBranchDivergence())
1022#endif
1023
1024 if (ViewDAGCombineLT && MatchFilterBB)
1025 CurDAG->viewGraph("dag-combine-lv input for " + BlockName);
1026
1027 // Run the DAG combiner in post-type-legalize mode.
1028 {
1029 NamedRegionTimer T("combine_lv", "DAG Combining after legalize vectors",
1030 GroupName, GroupDescription, TimePassesIsEnabled);
1032 }
1033
1034 ISEL_DUMP(dbgs() << "\nOptimized vector-legalized selection DAG: "
1035 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
1036 << "'\n";
1037 CurDAG->dump());
1038
1039#if LLVM_ENABLE_ABI_BREAKING_CHECKS
1040 if (TTI->hasBranchDivergence())
1042#endif
1043 }
1044
1045 if (ViewLegalizeDAGs && MatchFilterBB)
1046 CurDAG->viewGraph("legalize input for " + BlockName);
1047
1048 {
1049 NamedRegionTimer T("legalize", "DAG Legalization", GroupName,
1050 GroupDescription, TimePassesIsEnabled);
1051 CurDAG->Legalize();
1052 }
1053
1054 ISEL_DUMP(dbgs() << "\nLegalized selection DAG: "
1055 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
1056 << "'\n";
1057 CurDAG->dump());
1058
1059#if LLVM_ENABLE_ABI_BREAKING_CHECKS
1060 if (TTI->hasBranchDivergence())
1062#endif
1063
1064 if (ViewDAGCombine2 && MatchFilterBB)
1065 CurDAG->viewGraph("dag-combine2 input for " + BlockName);
1066
1067 // Run the DAG combiner in post-legalize mode.
1068 {
1069 NamedRegionTimer T("combine2", "DAG Combining 2", GroupName,
1070 GroupDescription, TimePassesIsEnabled);
1072 }
1073
1074 ISEL_DUMP(dbgs() << "\nOptimized legalized selection DAG: "
1075 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
1076 << "'\n";
1077 CurDAG->dump());
1078
1079#if LLVM_ENABLE_ABI_BREAKING_CHECKS
1080 if (TTI->hasBranchDivergence())
1082#endif
1083
1085 ComputeLiveOutVRegInfo();
1086
1087 if (ViewISelDAGs && MatchFilterBB)
1088 CurDAG->viewGraph("isel input for " + BlockName);
1089
1090 // Third, instruction select all of the operations to machine code, adding the
1091 // code to the MachineBasicBlock.
1092 {
1093 NamedRegionTimer T("isel", "Instruction Selection", GroupName,
1094 GroupDescription, TimePassesIsEnabled);
1095 DoInstructionSelection();
1096 }
1097
1098 ISEL_DUMP(dbgs() << "\nSelected selection DAG: "
1099 << printMBBReference(*FuncInfo->MBB) << " '" << BlockName
1100 << "'\n";
1101 CurDAG->dump());
1102
1103 if (ViewSchedDAGs && MatchFilterBB)
1104 CurDAG->viewGraph("scheduler input for " + BlockName);
1105
1106 // Schedule machine code.
1107 ScheduleDAGSDNodes *Scheduler = CreateScheduler();
1108 {
1109 NamedRegionTimer T("sched", "Instruction Scheduling", GroupName,
1110 GroupDescription, TimePassesIsEnabled);
1111 Scheduler->Run(CurDAG, FuncInfo->MBB);
1112 }
1113
1114 if (ViewSUnitDAGs && MatchFilterBB)
1115 Scheduler->viewGraph();
1116
1117 // Emit machine code to BB. This can change 'BB' to the last block being
1118 // inserted into.
1119 MachineBasicBlock *FirstMBB = FuncInfo->MBB, *LastMBB;
1120 {
1121 NamedRegionTimer T("emit", "Instruction Creation", GroupName,
1122 GroupDescription, TimePassesIsEnabled);
1123
1124 // FuncInfo->InsertPt is passed by reference and set to the end of the
1125 // scheduled instructions.
1126 LastMBB = FuncInfo->MBB = Scheduler->EmitSchedule(FuncInfo->InsertPt);
1127 }
1128
1129 // If the block was split, make sure we update any references that are used to
1130 // update PHI nodes later on.
1131 if (FirstMBB != LastMBB)
1132 SDB->UpdateSplitBlock(FirstMBB, LastMBB);
1133
1134 // Free the scheduler state.
1135 {
1136 NamedRegionTimer T("cleanup", "Instruction Scheduling Cleanup", GroupName,
1137 GroupDescription, TimePassesIsEnabled);
1138 delete Scheduler;
1139 }
1140
1141 // Free the SelectionDAG state, now that we're finished with it.
1142 CurDAG->clear();
1143}
1144
1145namespace {
1146
1147/// ISelUpdater - helper class to handle updates of the instruction selection
1148/// graph.
1149class ISelUpdater : public SelectionDAG::DAGUpdateListener {
1150 SelectionDAG::allnodes_iterator &ISelPosition;
1151
1152public:
1153 ISelUpdater(SelectionDAG &DAG, SelectionDAG::allnodes_iterator &isp)
1154 : SelectionDAG::DAGUpdateListener(DAG), ISelPosition(isp) {}
1155
1156 /// NodeDeleted - Handle nodes deleted from the graph. If the node being
1157 /// deleted is the current ISelPosition node, update ISelPosition.
1158 ///
1159 void NodeDeleted(SDNode *N, SDNode *E) override {
1160 if (ISelPosition == SelectionDAG::allnodes_iterator(N))
1161 ++ISelPosition;
1162 }
1163
1164 /// NodeInserted - Handle new nodes inserted into the graph: propagate
1165 /// metadata from root nodes that also applies to new nodes, in case the root
1166 /// is later deleted.
1167 void NodeInserted(SDNode *N) override {
1168 SDNode *CurNode = &*ISelPosition;
1169 if (MDNode *MD = DAG.getPCSections(CurNode))
1170 DAG.addPCSections(N, MD);
1171 if (MDNode *MMRA = DAG.getMMRAMetadata(CurNode))
1172 DAG.addMMRAMetadata(N, MMRA);
1173 }
1174};
1175
1176} // end anonymous namespace
1177
1178// This function is used to enforce the topological node id property
1179// leveraged during instruction selection. Before the selection process all
1180// nodes are given a non-negative id such that all nodes have a greater id than
1181// their operands. As this holds transitively we can prune checks that a node N
1182// is a predecessor of M another by not recursively checking through M's
1183// operands if N's ID is larger than M's ID. This significantly improves
1184// performance of various legality checks (e.g. IsLegalToFold / UpdateChains).
1185
1186// However, when we fuse multiple nodes into a single node during the
1187// selection we may induce a predecessor relationship between inputs and
1188// outputs of distinct nodes being merged, violating the topological property.
1189// Should a fused node have a successor which has yet to be selected,
1190// our legality checks would be incorrect. To avoid this we mark all unselected
1191// successor nodes, i.e. id != -1, as invalid for pruning by bit-negating (x =>
1192// (-(x+1))) the ids and modify our pruning check to ignore negative Ids of M.
1193// We use bit-negation to more clearly enforce that node id -1 can only be
1194// achieved by selected nodes. As the conversion is reversable to the original
1195// Id, topological pruning can still be leveraged when looking for unselected
1196// nodes. This method is called internally in all ISel replacement related
1197// functions.
1200 Nodes.push_back(Node);
1201
1202 while (!Nodes.empty()) {
1203 SDNode *N = Nodes.pop_back_val();
1204 for (auto *U : N->uses()) {
1205 auto UId = U->getNodeId();
1206 if (UId > 0) {
1208 Nodes.push_back(U);
1209 }
1210 }
1211 }
1212}
1213
1214// InvalidateNodeId - As explained in EnforceNodeIdInvariant, mark a
1215// NodeId with the equivalent node id which is invalid for topological
1216// pruning.
1218 int InvalidId = -(N->getNodeId() + 1);
1219 N->setNodeId(InvalidId);
1220}
1221
1222// getUninvalidatedNodeId - get original uninvalidated node id.
1224 int Id = N->getNodeId();
1225 if (Id < -1)
1226 return -(Id + 1);
1227 return Id;
1228}
1229
1230void SelectionDAGISel::DoInstructionSelection() {
1231 LLVM_DEBUG(dbgs() << "===== Instruction selection begins: "
1232 << printMBBReference(*FuncInfo->MBB) << " '"
1233 << FuncInfo->MBB->getName() << "'\n");
1234
1236
1237 // Select target instructions for the DAG.
1238 {
1239 // Number all nodes with a topological order and set DAGSize.
1241
1242 // Create a dummy node (which is not added to allnodes), that adds
1243 // a reference to the root node, preventing it from being deleted,
1244 // and tracking any changes of the root.
1245 HandleSDNode Dummy(CurDAG->getRoot());
1247 ++ISelPosition;
1248
1249 // Make sure that ISelPosition gets properly updated when nodes are deleted
1250 // in calls made from this function. New nodes inherit relevant metadata.
1251 ISelUpdater ISU(*CurDAG, ISelPosition);
1252
1253 // The AllNodes list is now topological-sorted. Visit the
1254 // nodes by starting at the end of the list (the root of the
1255 // graph) and preceding back toward the beginning (the entry
1256 // node).
1257 while (ISelPosition != CurDAG->allnodes_begin()) {
1258 SDNode *Node = &*--ISelPosition;
1259 // Skip dead nodes. DAGCombiner is expected to eliminate all dead nodes,
1260 // but there are currently some corner cases that it misses. Also, this
1261 // makes it theoretically possible to disable the DAGCombiner.
1262 if (Node->use_empty())
1263 continue;
1264
1265#ifndef NDEBUG
1267 Nodes.push_back(Node);
1268
1269 while (!Nodes.empty()) {
1270 auto N = Nodes.pop_back_val();
1271 if (N->getOpcode() == ISD::TokenFactor || N->getNodeId() < 0)
1272 continue;
1273 for (const SDValue &Op : N->op_values()) {
1274 if (Op->getOpcode() == ISD::TokenFactor)
1275 Nodes.push_back(Op.getNode());
1276 else {
1277 // We rely on topological ordering of node ids for checking for
1278 // cycles when fusing nodes during selection. All unselected nodes
1279 // successors of an already selected node should have a negative id.
1280 // This assertion will catch such cases. If this assertion triggers
1281 // it is likely you using DAG-level Value/Node replacement functions
1282 // (versus equivalent ISEL replacement) in backend-specific
1283 // selections. See comment in EnforceNodeIdInvariant for more
1284 // details.
1285 assert(Op->getNodeId() != -1 &&
1286 "Node has already selected predecessor node");
1287 }
1288 }
1289 }
1290#endif
1291
1292 // When we are using non-default rounding modes or FP exception behavior
1293 // FP operations are represented by StrictFP pseudo-operations. For
1294 // targets that do not (yet) understand strict FP operations directly,
1295 // we convert them to normal FP opcodes instead at this point. This
1296 // will allow them to be handled by existing target-specific instruction
1297 // selectors.
1298 if (!TLI->isStrictFPEnabled() && Node->isStrictFPOpcode()) {
1299 // For some opcodes, we need to call TLI->getOperationAction using
1300 // the first operand type instead of the result type. Note that this
1301 // must match what SelectionDAGLegalize::LegalizeOp is doing.
1302 EVT ActionVT;
1303 switch (Node->getOpcode()) {
1306 case ISD::STRICT_LRINT:
1307 case ISD::STRICT_LLRINT:
1308 case ISD::STRICT_LROUND:
1310 case ISD::STRICT_FSETCC:
1312 ActionVT = Node->getOperand(1).getValueType();
1313 break;
1314 default:
1315 ActionVT = Node->getValueType(0);
1316 break;
1317 }
1318 if (TLI->getOperationAction(Node->getOpcode(), ActionVT)
1321 }
1322
1323 LLVM_DEBUG(dbgs() << "\nISEL: Starting selection on root node: ";
1324 Node->dump(CurDAG));
1325
1326 Select(Node);
1327 }
1328
1329 CurDAG->setRoot(Dummy.getValue());
1330 }
1331
1332 LLVM_DEBUG(dbgs() << "\n===== Instruction selection ends:\n");
1333
1335}
1336
1338 for (const User *U : CPI->users()) {
1339 if (const IntrinsicInst *EHPtrCall = dyn_cast<IntrinsicInst>(U)) {
1340 Intrinsic::ID IID = EHPtrCall->getIntrinsicID();
1341 if (IID == Intrinsic::eh_exceptionpointer ||
1342 IID == Intrinsic::eh_exceptioncode)
1343 return true;
1344 }
1345 }
1346 return false;
1347}
1348
1349// wasm.landingpad.index intrinsic is for associating a landing pad index number
1350// with a catchpad instruction. Retrieve the landing pad index in the intrinsic
1351// and store the mapping in the function.
1353 const CatchPadInst *CPI) {
1354 MachineFunction *MF = MBB->getParent();
1355 // In case of single catch (...), we don't emit LSDA, so we don't need
1356 // this information.
1357 bool IsSingleCatchAllClause =
1358 CPI->arg_size() == 1 &&
1359 cast<Constant>(CPI->getArgOperand(0))->isNullValue();
1360 // cathchpads for longjmp use an empty type list, e.g. catchpad within %0 []
1361 // and they don't need LSDA info
1362 bool IsCatchLongjmp = CPI->arg_size() == 0;
1363 if (!IsSingleCatchAllClause && !IsCatchLongjmp) {
1364 // Create a mapping from landing pad label to landing pad index.
1365 bool IntrFound = false;
1366 for (const User *U : CPI->users()) {
1367 if (const auto *Call = dyn_cast<IntrinsicInst>(U)) {
1368 Intrinsic::ID IID = Call->getIntrinsicID();
1369 if (IID == Intrinsic::wasm_landingpad_index) {
1370 Value *IndexArg = Call->getArgOperand(1);
1371 int Index = cast<ConstantInt>(IndexArg)->getZExtValue();
1373 IntrFound = true;
1374 break;
1375 }
1376 }
1377 }
1378 assert(IntrFound && "wasm.landingpad.index intrinsic not found!");
1379 (void)IntrFound;
1380 }
1381}
1382
1383/// PrepareEHLandingPad - Emit an EH_LABEL, set up live-in registers, and
1384/// do other setup for EH landing-pad blocks.
1385bool SelectionDAGISel::PrepareEHLandingPad() {
1387 const Constant *PersonalityFn = FuncInfo->Fn->getPersonalityFn();
1388 const BasicBlock *LLVMBB = MBB->getBasicBlock();
1389 const TargetRegisterClass *PtrRC =
1391
1392 auto Pers = classifyEHPersonality(PersonalityFn);
1393
1394 // Catchpads have one live-in register, which typically holds the exception
1395 // pointer or code.
1396 if (isFuncletEHPersonality(Pers)) {
1397 if (const auto *CPI = dyn_cast<CatchPadInst>(LLVMBB->getFirstNonPHI())) {
1399 // Get or create the virtual register to hold the pointer or code. Mark
1400 // the live in physreg and copy into the vreg.
1401 MCPhysReg EHPhysReg = TLI->getExceptionPointerRegister(PersonalityFn);
1402 assert(EHPhysReg && "target lacks exception pointer register");
1403 MBB->addLiveIn(EHPhysReg);
1404 unsigned VReg = FuncInfo->getCatchPadExceptionPointerVReg(CPI, PtrRC);
1405 BuildMI(*MBB, FuncInfo->InsertPt, SDB->getCurDebugLoc(),
1406 TII->get(TargetOpcode::COPY), VReg)
1407 .addReg(EHPhysReg, RegState::Kill);
1408 }
1409 }
1410 return true;
1411 }
1412
1413 // Add a label to mark the beginning of the landing pad. Deletion of the
1414 // landing pad can thus be detected via the MachineModuleInfo.
1416
1417 const MCInstrDesc &II = TII->get(TargetOpcode::EH_LABEL);
1418 BuildMI(*MBB, FuncInfo->InsertPt, SDB->getCurDebugLoc(), II)
1419 .addSym(Label);
1420
1421 // If the unwinder does not preserve all registers, ensure that the
1422 // function marks the clobbered registers as used.
1424 if (auto *RegMask = TRI.getCustomEHPadPreservedMask(*MF))
1426
1427 if (Pers == EHPersonality::Wasm_CXX) {
1428 if (const auto *CPI = dyn_cast<CatchPadInst>(LLVMBB->getFirstNonPHI()))
1430 } else {
1431 // Assign the call site to the landing pad's begin label.
1432 MF->setCallSiteLandingPad(Label, SDB->LPadToCallSiteMap[MBB]);
1433 // Mark exception register as live in.
1434 if (unsigned Reg = TLI->getExceptionPointerRegister(PersonalityFn))
1435 FuncInfo->ExceptionPointerVirtReg = MBB->addLiveIn(Reg, PtrRC);
1436 // Mark exception selector register as live in.
1437 if (unsigned Reg = TLI->getExceptionSelectorRegister(PersonalityFn))
1438 FuncInfo->ExceptionSelectorVirtReg = MBB->addLiveIn(Reg, PtrRC);
1439 }
1440
1441 return true;
1442}
1443
1444// Mark and Report IPToState for each Block under IsEHa
1445void SelectionDAGISel::reportIPToStateForBlocks(MachineFunction *MF) {
1446 MachineModuleInfo &MMI = MF->getMMI();
1448 if (!EHInfo)
1449 return;
1450 for (MachineBasicBlock &MBB : *MF) {
1451 const BasicBlock *BB = MBB.getBasicBlock();
1452 int State = EHInfo->BlockToStateMap[BB];
1453 if (BB->getFirstMayFaultInst()) {
1454 // Report IP range only for blocks with Faulty inst
1455 auto MBBb = MBB.getFirstNonPHI();
1456 MachineInstr *MIb = &*MBBb;
1457 if (MIb->isTerminator())
1458 continue;
1459
1460 // Insert EH Labels
1461 MCSymbol *BeginLabel = MMI.getContext().createTempSymbol();
1462 MCSymbol *EndLabel = MMI.getContext().createTempSymbol();
1463 EHInfo->addIPToStateRange(State, BeginLabel, EndLabel);
1464 BuildMI(MBB, MBBb, SDB->getCurDebugLoc(),
1465 TII->get(TargetOpcode::EH_LABEL))
1466 .addSym(BeginLabel);
1467 auto MBBe = MBB.instr_end();
1468 MachineInstr *MIe = &*(--MBBe);
1469 // insert before (possible multiple) terminators
1470 while (MIe->isTerminator())
1471 MIe = &*(--MBBe);
1472 ++MBBe;
1473 BuildMI(MBB, MBBe, SDB->getCurDebugLoc(),
1474 TII->get(TargetOpcode::EH_LABEL))
1475 .addSym(EndLabel);
1476 }
1477 }
1478}
1479
1480/// isFoldedOrDeadInstruction - Return true if the specified instruction is
1481/// side-effect free and is either dead or folded into a generated instruction.
1482/// Return false if it needs to be emitted.
1484 const FunctionLoweringInfo &FuncInfo) {
1485 return !I->mayWriteToMemory() && // Side-effecting instructions aren't folded.
1486 !I->isTerminator() && // Terminators aren't folded.
1487 !isa<DbgInfoIntrinsic>(I) && // Debug instructions aren't folded.
1488 !I->isEHPad() && // EH pad instructions aren't folded.
1489 !FuncInfo.isExportedInst(I); // Exported instrs must be computed.
1490}
1491
1493 const Value *Arg, DIExpression *Expr,
1494 DILocalVariable *Var,
1495 DebugLoc DbgLoc) {
1496 if (!Expr->isEntryValue() || !isa<Argument>(Arg))
1497 return false;
1498
1499 auto ArgIt = FuncInfo.ValueMap.find(Arg);
1500 if (ArgIt == FuncInfo.ValueMap.end())
1501 return false;
1502 Register ArgVReg = ArgIt->getSecond();
1503
1504 // Find the corresponding livein physical register to this argument.
1505 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
1506 if (VirtReg == ArgVReg) {
1507 // Append an op deref to account for the fact that this is a dbg_declare.
1508 Expr = DIExpression::append(Expr, dwarf::DW_OP_deref);
1509 FuncInfo.MF->setVariableDbgInfo(Var, Expr, PhysReg, DbgLoc);
1510 LLVM_DEBUG(dbgs() << "processDbgDeclare: setVariableDbgInfo Var=" << *Var
1511 << ", Expr=" << *Expr << ", MCRegister=" << PhysReg
1512 << ", DbgLoc=" << DbgLoc << "\n");
1513 return true;
1514 }
1515 return false;
1516}
1517
1519 const Value *Address, DIExpression *Expr,
1520 DILocalVariable *Var, DebugLoc DbgLoc) {
1521 if (!Address) {
1522 LLVM_DEBUG(dbgs() << "processDbgDeclares skipping " << *Var
1523 << " (bad address)\n");
1524 return false;
1525 }
1526
1527 if (processIfEntryValueDbgDeclare(FuncInfo, Address, Expr, Var, DbgLoc))
1528 return true;
1529
1530 MachineFunction *MF = FuncInfo.MF;
1531 const DataLayout &DL = MF->getDataLayout();
1532
1533 assert(Var && "Missing variable");
1534 assert(DbgLoc && "Missing location");
1535
1536 // Look through casts and constant offset GEPs. These mostly come from
1537 // inalloca.
1538 APInt Offset(DL.getTypeSizeInBits(Address->getType()), 0);
1539 Address = Address->stripAndAccumulateInBoundsConstantOffsets(DL, Offset);
1540
1541 // Check if the variable is a static alloca or a byval or inalloca
1542 // argument passed in memory. If it is not, then we will ignore this
1543 // intrinsic and handle this during isel like dbg.value.
1544 int FI = std::numeric_limits<int>::max();
1545 if (const auto *AI = dyn_cast<AllocaInst>(Address)) {
1546 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1547 if (SI != FuncInfo.StaticAllocaMap.end())
1548 FI = SI->second;
1549 } else if (const auto *Arg = dyn_cast<Argument>(Address))
1550 FI = FuncInfo.getArgumentFrameIndex(Arg);
1551
1552 if (FI == std::numeric_limits<int>::max())
1553 return false;
1554
1555 if (Offset.getBoolValue())
1557 Offset.getZExtValue());
1558
1559 LLVM_DEBUG(dbgs() << "processDbgDeclare: setVariableDbgInfo Var=" << *Var
1560 << ", Expr=" << *Expr << ", FI=" << FI
1561 << ", DbgLoc=" << DbgLoc << "\n");
1562 MF->setVariableDbgInfo(Var, Expr, FI, DbgLoc);
1563 return true;
1564}
1565
1566/// Collect llvm.dbg.declare information. This is done after argument lowering
1567/// in case the declarations refer to arguments.
1569 for (const auto &I : instructions(*FuncInfo.Fn)) {
1570 const auto *DI = dyn_cast<DbgDeclareInst>(&I);
1571 if (DI && processDbgDeclare(FuncInfo, DI->getAddress(), DI->getExpression(),
1572 DI->getVariable(), DI->getDebugLoc()))
1573 FuncInfo.PreprocessedDbgDeclares.insert(DI);
1574 for (const DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
1576 processDbgDeclare(FuncInfo, DVR.getVariableLocationOp(0),
1577 DVR.getExpression(), DVR.getVariable(),
1578 DVR.getDebugLoc()))
1579 FuncInfo.PreprocessedDVRDeclares.insert(&DVR);
1580 }
1581 }
1582}
1583
1584/// Collect single location variable information generated with assignment
1585/// tracking. This is done after argument lowering in case the declarations
1586/// refer to arguments.
1588 FunctionVarLocs const *FnVarLocs) {
1589 for (auto It = FnVarLocs->single_locs_begin(),
1590 End = FnVarLocs->single_locs_end();
1591 It != End; ++It) {
1592 assert(!It->Values.hasArgList() && "Single loc variadic ops not supported");
1593 processDbgDeclare(FuncInfo, It->Values.getVariableLocationOp(0), It->Expr,
1594 FnVarLocs->getDILocalVariable(It->VariableID), It->DL);
1595 }
1596}
1597
1598void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
1599 FastISelFailed = false;
1600 // Initialize the Fast-ISel state, if needed.
1601 FastISel *FastIS = nullptr;
1603 LLVM_DEBUG(dbgs() << "Enabling fast-isel\n");
1604 FastIS = TLI->createFastISel(*FuncInfo, LibInfo);
1605 }
1606
1608
1609 // Lower arguments up front. An RPO iteration always visits the entry block
1610 // first.
1611 assert(*RPOT.begin() == &Fn.getEntryBlock());
1612 ++NumEntryBlocks;
1613
1614 // Set up FuncInfo for ISel. Entry blocks never have PHIs.
1615 FuncInfo->MBB = FuncInfo->MBBMap[&Fn.getEntryBlock()];
1616 FuncInfo->InsertPt = FuncInfo->MBB->begin();
1617
1619
1620 if (!FastIS) {
1621 LowerArguments(Fn);
1622 } else {
1623 // See if fast isel can lower the arguments.
1624 FastIS->startNewBlock();
1625 if (!FastIS->lowerArguments()) {
1626 FastISelFailed = true;
1627 // Fast isel failed to lower these arguments
1628 ++NumFastIselFailLowerArguments;
1629
1630 OptimizationRemarkMissed R("sdagisel", "FastISelFailure",
1631 Fn.getSubprogram(),
1632 &Fn.getEntryBlock());
1633 R << "FastISel didn't lower all arguments: "
1634 << ore::NV("Prototype", Fn.getFunctionType());
1636
1637 // Use SelectionDAG argument lowering
1638 LowerArguments(Fn);
1639 CurDAG->setRoot(SDB->getControlRoot());
1640 SDB->clear();
1641 CodeGenAndEmitDAG();
1642 }
1643
1644 // If we inserted any instructions at the beginning, make a note of
1645 // where they are, so we can be sure to emit subsequent instructions
1646 // after them.
1647 if (FuncInfo->InsertPt != FuncInfo->MBB->begin())
1648 FastIS->setLastLocalValue(&*std::prev(FuncInfo->InsertPt));
1649 else
1650 FastIS->setLastLocalValue(nullptr);
1651 }
1652
1653 bool Inserted = SwiftError->createEntriesInEntryBlock(SDB->getCurDebugLoc());
1654
1655 if (FastIS && Inserted)
1656 FastIS->setLastLocalValue(&*std::prev(FuncInfo->InsertPt));
1657
1660 "expected AssignmentTrackingAnalysis pass results");
1662 } else {
1664 }
1665
1666 // Iterate over all basic blocks in the function.
1667 for (const BasicBlock *LLVMBB : RPOT) {
1669 bool AllPredsVisited = true;
1670 for (const BasicBlock *Pred : predecessors(LLVMBB)) {
1671 if (!FuncInfo->VisitedBBs.count(Pred)) {
1672 AllPredsVisited = false;
1673 break;
1674 }
1675 }
1676
1677 if (AllPredsVisited) {
1678 for (const PHINode &PN : LLVMBB->phis())
1679 FuncInfo->ComputePHILiveOutRegInfo(&PN);
1680 } else {
1681 for (const PHINode &PN : LLVMBB->phis())
1682 FuncInfo->InvalidatePHILiveOutRegInfo(&PN);
1683 }
1684
1685 FuncInfo->VisitedBBs.insert(LLVMBB);
1686 }
1687
1688 BasicBlock::const_iterator const Begin =
1689 LLVMBB->getFirstNonPHI()->getIterator();
1690 BasicBlock::const_iterator const End = LLVMBB->end();
1692
1693 FuncInfo->MBB = FuncInfo->MBBMap[LLVMBB];
1694 if (!FuncInfo->MBB)
1695 continue; // Some blocks like catchpads have no code or MBB.
1696
1697 // Insert new instructions after any phi or argument setup code.
1698 FuncInfo->InsertPt = FuncInfo->MBB->end();
1699
1700 // Setup an EH landing-pad block.
1701 FuncInfo->ExceptionPointerVirtReg = 0;
1702 FuncInfo->ExceptionSelectorVirtReg = 0;
1703 if (LLVMBB->isEHPad())
1704 if (!PrepareEHLandingPad())
1705 continue;
1706
1707 // Before doing SelectionDAG ISel, see if FastISel has been requested.
1708 if (FastIS) {
1709 if (LLVMBB != &Fn.getEntryBlock())
1710 FastIS->startNewBlock();
1711
1712 unsigned NumFastIselRemaining = std::distance(Begin, End);
1713
1714 // Pre-assign swifterror vregs.
1715 SwiftError->preassignVRegs(FuncInfo->MBB, Begin, End);
1716
1717 // Do FastISel on as many instructions as possible.
1718 for (; BI != Begin; --BI) {
1719 const Instruction *Inst = &*std::prev(BI);
1720
1721 // If we no longer require this instruction, skip it.
1722 if (isFoldedOrDeadInstruction(Inst, *FuncInfo) ||
1723 ElidedArgCopyInstrs.count(Inst)) {
1724 --NumFastIselRemaining;
1725 FastIS->handleDbgInfo(Inst);
1726 continue;
1727 }
1728
1729 // Bottom-up: reset the insert pos at the top, after any local-value
1730 // instructions.
1731 FastIS->recomputeInsertPt();
1732
1733 // Try to select the instruction with FastISel.
1734 if (FastIS->selectInstruction(Inst)) {
1735 --NumFastIselRemaining;
1736 ++NumFastIselSuccess;
1737
1738 FastIS->handleDbgInfo(Inst);
1739 // If fast isel succeeded, skip over all the folded instructions, and
1740 // then see if there is a load right before the selected instructions.
1741 // Try to fold the load if so.
1742 const Instruction *BeforeInst = Inst;
1743 while (BeforeInst != &*Begin) {
1744 BeforeInst = &*std::prev(BasicBlock::const_iterator(BeforeInst));
1745 if (!isFoldedOrDeadInstruction(BeforeInst, *FuncInfo))
1746 break;
1747 }
1748 if (BeforeInst != Inst && isa<LoadInst>(BeforeInst) &&
1749 BeforeInst->hasOneUse() &&
1750 FastIS->tryToFoldLoad(cast<LoadInst>(BeforeInst), Inst)) {
1751 // If we succeeded, don't re-select the load.
1753 << "FastISel folded load: " << *BeforeInst << "\n");
1754 FastIS->handleDbgInfo(BeforeInst);
1755 BI = std::next(BasicBlock::const_iterator(BeforeInst));
1756 --NumFastIselRemaining;
1757 ++NumFastIselSuccess;
1758 }
1759 continue;
1760 }
1761
1762 FastISelFailed = true;
1763
1764 // Then handle certain instructions as single-LLVM-Instruction blocks.
1765 // We cannot separate out GCrelocates to their own blocks since we need
1766 // to keep track of gc-relocates for a particular gc-statepoint. This is
1767 // done by SelectionDAGBuilder::LowerAsSTATEPOINT, called before
1768 // visitGCRelocate.
1769 if (isa<CallInst>(Inst) && !isa<GCStatepointInst>(Inst) &&
1770 !isa<GCRelocateInst>(Inst) && !isa<GCResultInst>(Inst)) {
1771 OptimizationRemarkMissed R("sdagisel", "FastISelFailure",
1772 Inst->getDebugLoc(), LLVMBB);
1773
1774 R << "FastISel missed call";
1775
1776 if (R.isEnabled() || EnableFastISelAbort) {
1777 std::string InstStrStorage;
1778 raw_string_ostream InstStr(InstStrStorage);
1779 InstStr << *Inst;
1780
1781 R << ": " << InstStrStorage;
1782 }
1783
1785
1786 if (!Inst->getType()->isVoidTy() && !Inst->getType()->isTokenTy() &&
1787 !Inst->use_empty()) {
1788 Register &R = FuncInfo->ValueMap[Inst];
1789 if (!R)
1790 R = FuncInfo->CreateRegs(Inst);
1791 }
1792
1793 bool HadTailCall = false;
1794 MachineBasicBlock::iterator SavedInsertPt = FuncInfo->InsertPt;
1795 SelectBasicBlock(Inst->getIterator(), BI, HadTailCall);
1796
1797 // If the call was emitted as a tail call, we're done with the block.
1798 // We also need to delete any previously emitted instructions.
1799 if (HadTailCall) {
1800 FastIS->removeDeadCode(SavedInsertPt, FuncInfo->MBB->end());
1801 --BI;
1802 break;
1803 }
1804
1805 // Recompute NumFastIselRemaining as Selection DAG instruction
1806 // selection may have handled the call, input args, etc.
1807 unsigned RemainingNow = std::distance(Begin, BI);
1808 NumFastIselFailures += NumFastIselRemaining - RemainingNow;
1809 NumFastIselRemaining = RemainingNow;
1810 continue;
1811 }
1812
1813 OptimizationRemarkMissed R("sdagisel", "FastISelFailure",
1814 Inst->getDebugLoc(), LLVMBB);
1815
1816 bool ShouldAbort = EnableFastISelAbort;
1817 if (Inst->isTerminator()) {
1818 // Use a different message for terminator misses.
1819 R << "FastISel missed terminator";
1820 // Don't abort for terminator unless the level is really high
1821 ShouldAbort = (EnableFastISelAbort > 2);
1822 } else {
1823 R << "FastISel missed";
1824 }
1825
1826 if (R.isEnabled() || EnableFastISelAbort) {
1827 std::string InstStrStorage;
1828 raw_string_ostream InstStr(InstStrStorage);
1829 InstStr << *Inst;
1830 R << ": " << InstStrStorage;
1831 }
1832
1833 reportFastISelFailure(*MF, *ORE, R, ShouldAbort);
1834
1835 NumFastIselFailures += NumFastIselRemaining;
1836 break;
1837 }
1838
1839 FastIS->recomputeInsertPt();
1840 }
1841
1842 if (SP->shouldEmitSDCheck(*LLVMBB)) {
1843 bool FunctionBasedInstrumentation =
1845 SDB->SPDescriptor.initialize(LLVMBB, FuncInfo->MBBMap[LLVMBB],
1846 FunctionBasedInstrumentation);
1847 }
1848
1849 if (Begin != BI)
1850 ++NumDAGBlocks;
1851 else
1852 ++NumFastIselBlocks;
1853
1854 if (Begin != BI) {
1855 // Run SelectionDAG instruction selection on the remainder of the block
1856 // not handled by FastISel. If FastISel is not run, this is the entire
1857 // block.
1858 bool HadTailCall;
1859 SelectBasicBlock(Begin, BI, HadTailCall);
1860
1861 // But if FastISel was run, we already selected some of the block.
1862 // If we emitted a tail-call, we need to delete any previously emitted
1863 // instruction that follows it.
1864 if (FastIS && HadTailCall && FuncInfo->InsertPt != FuncInfo->MBB->end())
1865 FastIS->removeDeadCode(FuncInfo->InsertPt, FuncInfo->MBB->end());
1866 }
1867
1868 if (FastIS)
1869 FastIS->finishBasicBlock();
1870 FinishBasicBlock();
1871 FuncInfo->PHINodesToUpdate.clear();
1872 ElidedArgCopyInstrs.clear();
1873 }
1874
1875 // AsynchEH: Report Block State under -AsynchEH
1876 if (Fn.getParent()->getModuleFlag("eh-asynch"))
1877 reportIPToStateForBlocks(MF);
1878
1880
1882
1883 delete FastIS;
1884 SDB->clearDanglingDebugInfo();
1885 SDB->SPDescriptor.resetPerFunctionState();
1886}
1887
1888void
1889SelectionDAGISel::FinishBasicBlock() {
1890 LLVM_DEBUG(dbgs() << "Total amount of phi nodes to update: "
1891 << FuncInfo->PHINodesToUpdate.size() << "\n";
1892 for (unsigned i = 0, e = FuncInfo->PHINodesToUpdate.size(); i != e;
1893 ++i) dbgs()
1894 << "Node " << i << " : (" << FuncInfo->PHINodesToUpdate[i].first
1895 << ", " << FuncInfo->PHINodesToUpdate[i].second << ")\n");
1896
1897 // Next, now that we know what the last MBB the LLVM BB expanded is, update
1898 // PHI nodes in successors.
1899 for (unsigned i = 0, e = FuncInfo->PHINodesToUpdate.size(); i != e; ++i) {
1900 MachineInstrBuilder PHI(*MF, FuncInfo->PHINodesToUpdate[i].first);
1901 assert(PHI->isPHI() &&
1902 "This is not a machine PHI node that we are updating!");
1903 if (!FuncInfo->MBB->isSuccessor(PHI->getParent()))
1904 continue;
1905 PHI.addReg(FuncInfo->PHINodesToUpdate[i].second).addMBB(FuncInfo->MBB);
1906 }
1907
1908 // Handle stack protector.
1909 if (SDB->SPDescriptor.shouldEmitFunctionBasedCheckStackProtector()) {
1910 // The target provides a guard check function. There is no need to
1911 // generate error handling code or to split current basic block.
1912 MachineBasicBlock *ParentMBB = SDB->SPDescriptor.getParentMBB();
1913
1914 // Add load and check to the basicblock.
1915 FuncInfo->MBB = ParentMBB;
1916 FuncInfo->InsertPt =
1918 SDB->visitSPDescriptorParent(SDB->SPDescriptor, ParentMBB);
1919 CurDAG->setRoot(SDB->getRoot());
1920 SDB->clear();
1921 CodeGenAndEmitDAG();
1922
1923 // Clear the Per-BB State.
1924 SDB->SPDescriptor.resetPerBBState();
1925 } else if (SDB->SPDescriptor.shouldEmitStackProtector()) {
1926 MachineBasicBlock *ParentMBB = SDB->SPDescriptor.getParentMBB();
1927 MachineBasicBlock *SuccessMBB = SDB->SPDescriptor.getSuccessMBB();
1928
1929 // Find the split point to split the parent mbb. At the same time copy all
1930 // physical registers used in the tail of parent mbb into virtual registers
1931 // before the split point and back into physical registers after the split
1932 // point. This prevents us needing to deal with Live-ins and many other
1933 // register allocation issues caused by us splitting the parent mbb. The
1934 // register allocator will clean up said virtual copies later on.
1935 MachineBasicBlock::iterator SplitPoint =
1937
1938 // Splice the terminator of ParentMBB into SuccessMBB.
1939 SuccessMBB->splice(SuccessMBB->end(), ParentMBB,
1940 SplitPoint,
1941 ParentMBB->end());
1942
1943 // Add compare/jump on neq/jump to the parent BB.
1944 FuncInfo->MBB = ParentMBB;
1945 FuncInfo->InsertPt = ParentMBB->end();
1946 SDB->visitSPDescriptorParent(SDB->SPDescriptor, ParentMBB);
1947 CurDAG->setRoot(SDB->getRoot());
1948 SDB->clear();
1949 CodeGenAndEmitDAG();
1950
1951 // CodeGen Failure MBB if we have not codegened it yet.
1952 MachineBasicBlock *FailureMBB = SDB->SPDescriptor.getFailureMBB();
1953 if (FailureMBB->empty()) {
1954 FuncInfo->MBB = FailureMBB;
1955 FuncInfo->InsertPt = FailureMBB->end();
1956 SDB->visitSPDescriptorFailure(SDB->SPDescriptor);
1957 CurDAG->setRoot(SDB->getRoot());
1958 SDB->clear();
1959 CodeGenAndEmitDAG();
1960 }
1961
1962 // Clear the Per-BB State.
1963 SDB->SPDescriptor.resetPerBBState();
1964 }
1965
1966 // Lower each BitTestBlock.
1967 for (auto &BTB : SDB->SL->BitTestCases) {
1968 // Lower header first, if it wasn't already lowered
1969 if (!BTB.Emitted) {
1970 // Set the current basic block to the mbb we wish to insert the code into
1971 FuncInfo->MBB = BTB.Parent;
1972 FuncInfo->InsertPt = FuncInfo->MBB->end();
1973 // Emit the code
1974 SDB->visitBitTestHeader(BTB, FuncInfo->MBB);
1975 CurDAG->setRoot(SDB->getRoot());
1976 SDB->clear();
1977 CodeGenAndEmitDAG();
1978 }
1979
1980 BranchProbability UnhandledProb = BTB.Prob;
1981 for (unsigned j = 0, ej = BTB.Cases.size(); j != ej; ++j) {
1982 UnhandledProb -= BTB.Cases[j].ExtraProb;
1983 // Set the current basic block to the mbb we wish to insert the code into
1984 FuncInfo->MBB = BTB.Cases[j].ThisBB;
1985 FuncInfo->InsertPt = FuncInfo->MBB->end();
1986 // Emit the code
1987
1988 // If all cases cover a contiguous range, it is not necessary to jump to
1989 // the default block after the last bit test fails. This is because the
1990 // range check during bit test header creation has guaranteed that every
1991 // case here doesn't go outside the range. In this case, there is no need
1992 // to perform the last bit test, as it will always be true. Instead, make
1993 // the second-to-last bit-test fall through to the target of the last bit
1994 // test, and delete the last bit test.
1995
1996 MachineBasicBlock *NextMBB;
1997 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
1998 // Second-to-last bit-test with contiguous range or omitted range
1999 // check: fall through to the target of the final bit test.
2000 NextMBB = BTB.Cases[j + 1].TargetBB;
2001 } else if (j + 1 == ej) {
2002 // For the last bit test, fall through to Default.
2003 NextMBB = BTB.Default;
2004 } else {
2005 // Otherwise, fall through to the next bit test.
2006 NextMBB = BTB.Cases[j + 1].ThisBB;
2007 }
2008
2009 SDB->visitBitTestCase(BTB, NextMBB, UnhandledProb, BTB.Reg, BTB.Cases[j],
2010 FuncInfo->MBB);
2011
2012 CurDAG->setRoot(SDB->getRoot());
2013 SDB->clear();
2014 CodeGenAndEmitDAG();
2015
2016 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
2017 // Since we're not going to use the final bit test, remove it.
2018 BTB.Cases.pop_back();
2019 break;
2020 }
2021 }
2022
2023 // Update PHI Nodes
2024 for (const std::pair<MachineInstr *, unsigned> &P :
2025 FuncInfo->PHINodesToUpdate) {
2026 MachineInstrBuilder PHI(*MF, P.first);
2027 MachineBasicBlock *PHIBB = PHI->getParent();
2028 assert(PHI->isPHI() &&
2029 "This is not a machine PHI node that we are updating!");
2030 // This is "default" BB. We have two jumps to it. From "header" BB and
2031 // from last "case" BB, unless the latter was skipped.
2032 if (PHIBB == BTB.Default) {
2033 PHI.addReg(P.second).addMBB(BTB.Parent);
2034 if (!BTB.ContiguousRange) {
2035 PHI.addReg(P.second).addMBB(BTB.Cases.back().ThisBB);
2036 }
2037 }
2038 // One of "cases" BB.
2039 for (const SwitchCG::BitTestCase &BT : BTB.Cases) {
2040 MachineBasicBlock* cBB = BT.ThisBB;
2041 if (cBB->isSuccessor(PHIBB))
2042 PHI.addReg(P.second).addMBB(cBB);
2043 }
2044 }
2045 }
2046 SDB->SL->BitTestCases.clear();
2047
2048 // If the JumpTable record is filled in, then we need to emit a jump table.
2049 // Updating the PHI nodes is tricky in this case, since we need to determine
2050 // whether the PHI is a successor of the range check MBB or the jump table MBB
2051 for (unsigned i = 0, e = SDB->SL->JTCases.size(); i != e; ++i) {
2052 // Lower header first, if it wasn't already lowered
2053 if (!SDB->SL->JTCases[i].first.Emitted) {
2054 // Set the current basic block to the mbb we wish to insert the code into
2055 FuncInfo->MBB = SDB->SL->JTCases[i].first.HeaderBB;
2056 FuncInfo->InsertPt = FuncInfo->MBB->end();
2057 // Emit the code
2058 SDB->visitJumpTableHeader(SDB->SL->JTCases[i].second,
2059 SDB->SL->JTCases[i].first, FuncInfo->MBB);
2060 CurDAG->setRoot(SDB->getRoot());
2061 SDB->clear();
2062 CodeGenAndEmitDAG();
2063 }
2064
2065 // Set the current basic block to the mbb we wish to insert the code into
2066 FuncInfo->MBB = SDB->SL->JTCases[i].second.MBB;
2067 FuncInfo->InsertPt = FuncInfo->MBB->end();
2068 // Emit the code
2069 SDB->visitJumpTable(SDB->SL->JTCases[i].second);
2070 CurDAG->setRoot(SDB->getRoot());
2071 SDB->clear();
2072 CodeGenAndEmitDAG();
2073
2074 // Update PHI Nodes
2075 for (unsigned pi = 0, pe = FuncInfo->PHINodesToUpdate.size();
2076 pi != pe; ++pi) {
2077 MachineInstrBuilder PHI(*MF, FuncInfo->PHINodesToUpdate[pi].first);
2078 MachineBasicBlock *PHIBB = PHI->getParent();
2079 assert(PHI->isPHI() &&
2080 "This is not a machine PHI node that we are updating!");
2081 // "default" BB. We can go there only from header BB.
2082 if (PHIBB == SDB->SL->JTCases[i].second.Default)
2083 PHI.addReg(FuncInfo->PHINodesToUpdate[pi].second)
2084 .addMBB(SDB->SL->JTCases[i].first.HeaderBB);
2085 // JT BB. Just iterate over successors here
2086 if (FuncInfo->MBB->isSuccessor(PHIBB))
2087 PHI.addReg(FuncInfo->PHINodesToUpdate[pi].second).addMBB(FuncInfo->MBB);
2088 }
2089 }
2090 SDB->SL->JTCases.clear();
2091
2092 // If we generated any switch lowering information, build and codegen any
2093 // additional DAGs necessary.
2094 for (unsigned i = 0, e = SDB->SL->SwitchCases.size(); i != e; ++i) {
2095 // Set the current basic block to the mbb we wish to insert the code into
2096 FuncInfo->MBB = SDB->SL->SwitchCases[i].ThisBB;
2097 FuncInfo->InsertPt = FuncInfo->MBB->end();
2098
2099 // Determine the unique successors.
2101 Succs.push_back(SDB->SL->SwitchCases[i].TrueBB);
2102 if (SDB->SL->SwitchCases[i].TrueBB != SDB->SL->SwitchCases[i].FalseBB)
2103 Succs.push_back(SDB->SL->SwitchCases[i].FalseBB);
2104
2105 // Emit the code. Note that this could result in FuncInfo->MBB being split.
2106 SDB->visitSwitchCase(SDB->SL->SwitchCases[i], FuncInfo->MBB);
2107 CurDAG->setRoot(SDB->getRoot());
2108 SDB->clear();
2109 CodeGenAndEmitDAG();
2110
2111 // Remember the last block, now that any splitting is done, for use in
2112 // populating PHI nodes in successors.
2113 MachineBasicBlock *ThisBB = FuncInfo->MBB;
2114
2115 // Handle any PHI nodes in successors of this chunk, as if we were coming
2116 // from the original BB before switch expansion. Note that PHI nodes can
2117 // occur multiple times in PHINodesToUpdate. We have to be very careful to
2118 // handle them the right number of times.
2119 for (MachineBasicBlock *Succ : Succs) {
2120 FuncInfo->MBB = Succ;
2121 FuncInfo->InsertPt = FuncInfo->MBB->end();
2122 // FuncInfo->MBB may have been removed from the CFG if a branch was
2123 // constant folded.
2124 if (ThisBB->isSuccessor(FuncInfo->MBB)) {
2126 MBBI = FuncInfo->MBB->begin(), MBBE = FuncInfo->MBB->end();
2127 MBBI != MBBE && MBBI->isPHI(); ++MBBI) {
2129 // This value for this PHI node is recorded in PHINodesToUpdate.
2130 for (unsigned pn = 0; ; ++pn) {
2131 assert(pn != FuncInfo->PHINodesToUpdate.size() &&
2132 "Didn't find PHI entry!");
2133 if (FuncInfo->PHINodesToUpdate[pn].first == PHI) {
2134 PHI.addReg(FuncInfo->PHINodesToUpdate[pn].second).addMBB(ThisBB);
2135 break;
2136 }
2137 }
2138 }
2139 }
2140 }
2141 }
2142 SDB->SL->SwitchCases.clear();
2143}
2144
2145/// Create the scheduler. If a specific scheduler was specified
2146/// via the SchedulerRegistry, use it, otherwise select the
2147/// one preferred by the target.
2148///
2149ScheduleDAGSDNodes *SelectionDAGISel::CreateScheduler() {
2150 return ISHeuristic(this, OptLevel);
2151}
2152
2153//===----------------------------------------------------------------------===//
2154// Helper functions used by the generated instruction selector.
2155//===----------------------------------------------------------------------===//
2156// Calls to these methods are generated by tblgen.
2157
2158/// CheckAndMask - The isel is trying to match something like (and X, 255). If
2159/// the dag combiner simplified the 255, we still want to match. RHS is the
2160/// actual value in the DAG on the RHS of an AND, and DesiredMaskS is the value
2161/// specified in the .td file (e.g. 255).
2163 int64_t DesiredMaskS) const {
2164 const APInt &ActualMask = RHS->getAPIntValue();
2165 const APInt &DesiredMask = APInt(LHS.getValueSizeInBits(), DesiredMaskS);
2166
2167 // If the actual mask exactly matches, success!
2168 if (ActualMask == DesiredMask)
2169 return true;
2170
2171 // If the actual AND mask is allowing unallowed bits, this doesn't match.
2172 if (!ActualMask.isSubsetOf(DesiredMask))
2173 return false;
2174
2175 // Otherwise, the DAG Combiner may have proven that the value coming in is
2176 // either already zero or is not demanded. Check for known zero input bits.
2177 APInt NeededMask = DesiredMask & ~ActualMask;
2178 if (CurDAG->MaskedValueIsZero(LHS, NeededMask))
2179 return true;
2180
2181 // TODO: check to see if missing bits are just not demanded.
2182
2183 // Otherwise, this pattern doesn't match.
2184 return false;
2185}
2186
2187/// CheckOrMask - The isel is trying to match something like (or X, 255). If
2188/// the dag combiner simplified the 255, we still want to match. RHS is the
2189/// actual value in the DAG on the RHS of an OR, and DesiredMaskS is the value
2190/// specified in the .td file (e.g. 255).
2192 int64_t DesiredMaskS) const {
2193 const APInt &ActualMask = RHS->getAPIntValue();
2194 const APInt &DesiredMask = APInt(LHS.getValueSizeInBits(), DesiredMaskS);
2195
2196 // If the actual mask exactly matches, success!
2197 if (ActualMask == DesiredMask)
2198 return true;
2199
2200 // If the actual AND mask is allowing unallowed bits, this doesn't match.
2201 if (!ActualMask.isSubsetOf(DesiredMask))
2202 return false;
2203
2204 // Otherwise, the DAG Combiner may have proven that the value coming in is
2205 // either already zero or is not demanded. Check for known zero input bits.
2206 APInt NeededMask = DesiredMask & ~ActualMask;
2208
2209 // If all the missing bits in the or are already known to be set, match!
2210 if (NeededMask.isSubsetOf(Known.One))
2211 return true;
2212
2213 // TODO: check to see if missing bits are just not demanded.
2214
2215 // Otherwise, this pattern doesn't match.
2216 return false;
2217}
2218
2219/// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
2220/// by tblgen. Others should not call it.
2222 const SDLoc &DL) {
2223 // Change the vector of SDValue into a list of SDNodeHandle for x86 might call
2224 // replaceAllUses when matching address.
2225
2226 std::list<HandleSDNode> Handles;
2227
2228 Handles.emplace_back(Ops[InlineAsm::Op_InputChain]); // 0
2229 Handles.emplace_back(Ops[InlineAsm::Op_AsmString]); // 1
2230 Handles.emplace_back(Ops[InlineAsm::Op_MDNode]); // 2, !srcloc
2231 Handles.emplace_back(
2232 Ops[InlineAsm::Op_ExtraInfo]); // 3 (SideEffect, AlignStack)
2233
2234 unsigned i = InlineAsm::Op_FirstOperand, e = Ops.size();
2235 if (Ops[e - 1].getValueType() == MVT::Glue)
2236 --e; // Don't process a glue operand if it is here.
2237
2238 while (i != e) {
2239 InlineAsm::Flag Flags(Ops[i]->getAsZExtVal());
2240 if (!Flags.isMemKind() && !Flags.isFuncKind()) {
2241 // Just skip over this operand, copying the operands verbatim.
2242 Handles.insert(Handles.end(), Ops.begin() + i,
2243 Ops.begin() + i + Flags.getNumOperandRegisters() + 1);
2244 i += Flags.getNumOperandRegisters() + 1;
2245 } else {
2246 assert(Flags.getNumOperandRegisters() == 1 &&
2247 "Memory operand with multiple values?");
2248
2249 unsigned TiedToOperand;
2250 if (Flags.isUseOperandTiedToDef(TiedToOperand)) {
2251 // We need the constraint ID from the operand this is tied to.
2252 unsigned CurOp = InlineAsm::Op_FirstOperand;
2253 Flags = InlineAsm::Flag(Ops[CurOp]->getAsZExtVal());
2254 for (; TiedToOperand; --TiedToOperand) {
2255 CurOp += Flags.getNumOperandRegisters() + 1;
2256 Flags = InlineAsm::Flag(Ops[CurOp]->getAsZExtVal());
2257 }
2258 }
2259
2260 // Otherwise, this is a memory operand. Ask the target to select it.
2261 std::vector<SDValue> SelOps;
2262 const InlineAsm::ConstraintCode ConstraintID =
2263 Flags.getMemoryConstraintID();
2264 if (SelectInlineAsmMemoryOperand(Ops[i + 1], ConstraintID, SelOps))
2265 report_fatal_error("Could not match memory address. Inline asm"
2266 " failure!");
2267
2268 // Add this to the output node.
2269 Flags = InlineAsm::Flag(Flags.isMemKind() ? InlineAsm::Kind::Mem
2271 SelOps.size());
2272 Flags.setMemConstraint(ConstraintID);
2273 Handles.emplace_back(CurDAG->getTargetConstant(Flags, DL, MVT::i32));
2274 Handles.insert(Handles.end(), SelOps.begin(), SelOps.end());
2275 i += 2;
2276 }
2277 }
2278
2279 // Add the glue input back if present.
2280 if (e != Ops.size())
2281 Handles.emplace_back(Ops.back());
2282
2283 Ops.clear();
2284 for (auto &handle : Handles)
2285 Ops.push_back(handle.getValue());
2286}
2287
2288/// findGlueUse - Return use of MVT::Glue value produced by the specified
2289/// SDNode.
2290///
2292 unsigned FlagResNo = N->getNumValues()-1;
2293 for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) {
2294 SDUse &Use = I.getUse();
2295 if (Use.getResNo() == FlagResNo)
2296 return Use.getUser();
2297 }
2298 return nullptr;
2299}
2300
2301/// findNonImmUse - Return true if "Def" is a predecessor of "Root" via a path
2302/// beyond "ImmedUse". We may ignore chains as they are checked separately.
2303static bool findNonImmUse(SDNode *Root, SDNode *Def, SDNode *ImmedUse,
2304 bool IgnoreChains) {
2307 // Only check if we have non-immediate uses of Def.
2308 if (ImmedUse->isOnlyUserOf(Def))
2309 return false;
2310
2311 // We don't care about paths to Def that go through ImmedUse so mark it
2312 // visited and mark non-def operands as used.
2313 Visited.insert(ImmedUse);
2314 for (const SDValue &Op : ImmedUse->op_values()) {
2315 SDNode *N = Op.getNode();
2316 // Ignore chain deps (they are validated by
2317 // HandleMergeInputChains) and immediate uses
2318 if ((Op.getValueType() == MVT::Other && IgnoreChains) || N == Def)
2319 continue;
2320 if (!Visited.insert(N).second)
2321 continue;
2322 WorkList.push_back(N);
2323 }
2324
2325 // Initialize worklist to operands of Root.
2326 if (Root != ImmedUse) {
2327 for (const SDValue &Op : Root->op_values()) {
2328 SDNode *N = Op.getNode();
2329 // Ignore chains (they are validated by HandleMergeInputChains)
2330 if ((Op.getValueType() == MVT::Other && IgnoreChains) || N == Def)
2331 continue;
2332 if (!Visited.insert(N).second)
2333 continue;
2334 WorkList.push_back(N);
2335 }
2336 }
2337
2338 return SDNode::hasPredecessorHelper(Def, Visited, WorkList, 0, true);
2339}
2340
2341/// IsProfitableToFold - Returns true if it's profitable to fold the specific
2342/// operand node N of U during instruction selection that starts at Root.
2344 SDNode *Root) const {
2346 return false;
2347 return N.hasOneUse();
2348}
2349
2350/// IsLegalToFold - Returns true if the specific operand node N of
2351/// U can be folded during instruction selection that starts at Root.
2353 CodeGenOptLevel OptLevel,
2354 bool IgnoreChains) {
2356 return false;
2357
2358 // If Root use can somehow reach N through a path that doesn't contain
2359 // U then folding N would create a cycle. e.g. In the following
2360 // diagram, Root can reach N through X. If N is folded into Root, then
2361 // X is both a predecessor and a successor of U.
2362 //
2363 // [N*] //
2364 // ^ ^ //
2365 // / \ //
2366 // [U*] [X]? //
2367 // ^ ^ //
2368 // \ / //
2369 // \ / //
2370 // [Root*] //
2371 //
2372 // * indicates nodes to be folded together.
2373 //
2374 // If Root produces glue, then it gets (even more) interesting. Since it
2375 // will be "glued" together with its glue use in the scheduler, we need to
2376 // check if it might reach N.
2377 //
2378 // [N*] //
2379 // ^ ^ //
2380 // / \ //
2381 // [U*] [X]? //
2382 // ^ ^ //
2383 // \ \ //
2384 // \ | //
2385 // [Root*] | //
2386 // ^ | //
2387 // f | //
2388 // | / //
2389 // [Y] / //
2390 // ^ / //
2391 // f / //
2392 // | / //
2393 // [GU] //
2394 //
2395 // If GU (glue use) indirectly reaches N (the load), and Root folds N
2396 // (call it Fold), then X is a predecessor of GU and a successor of
2397 // Fold. But since Fold and GU are glued together, this will create
2398 // a cycle in the scheduling graph.
2399
2400 // If the node has glue, walk down the graph to the "lowest" node in the
2401 // glueged set.
2402 EVT VT = Root->getValueType(Root->getNumValues()-1);
2403 while (VT == MVT::Glue) {
2404 SDNode *GU = findGlueUse(Root);
2405 if (!GU)
2406 break;
2407 Root = GU;
2408 VT = Root->getValueType(Root->getNumValues()-1);
2409
2410 // If our query node has a glue result with a use, we've walked up it. If
2411 // the user (which has already been selected) has a chain or indirectly uses
2412 // the chain, HandleMergeInputChains will not consider it. Because of
2413 // this, we cannot ignore chains in this predicate.
2414 IgnoreChains = false;
2415 }
2416
2417 return !findNonImmUse(Root, N.getNode(), U, IgnoreChains);
2418}
2419
2420void SelectionDAGISel::Select_INLINEASM(SDNode *N) {
2421 SDLoc DL(N);
2422
2423 std::vector<SDValue> Ops(N->op_begin(), N->op_end());
2425
2426 const EVT VTs[] = {MVT::Other, MVT::Glue};
2427 SDValue New = CurDAG->getNode(N->getOpcode(), DL, VTs, Ops);
2428 New->setNodeId(-1);
2429 ReplaceUses(N, New.getNode());
2431}
2432
2433void SelectionDAGISel::Select_READ_REGISTER(SDNode *Op) {
2434 SDLoc dl(Op);
2435 MDNodeSDNode *MD = cast<MDNodeSDNode>(Op->getOperand(1));
2436 const MDString *RegStr = cast<MDString>(MD->getMD()->getOperand(0));
2437
2438 EVT VT = Op->getValueType(0);
2439 LLT Ty = VT.isSimple() ? getLLTForMVT(VT.getSimpleVT()) : LLT();
2440 Register Reg =
2441 TLI->getRegisterByName(RegStr->getString().data(), Ty,
2444 Op->getOperand(0), dl, Reg, Op->getValueType(0));
2445 New->setNodeId(-1);
2446 ReplaceUses(Op, New.getNode());
2448}
2449
2450void SelectionDAGISel::Select_WRITE_REGISTER(SDNode *Op) {
2451 SDLoc dl(Op);
2452 MDNodeSDNode *MD = cast<MDNodeSDNode>(Op->getOperand(1));
2453 const MDString *RegStr = cast<MDString>(MD->getMD()->getOperand(0));
2454
2455 EVT VT = Op->getOperand(2).getValueType();
2456 LLT Ty = VT.isSimple() ? getLLTForMVT(VT.getSimpleVT()) : LLT();
2457
2458 Register Reg = TLI->getRegisterByName(RegStr->getString().data(), Ty,
2461 Op->getOperand(0), dl, Reg, Op->getOperand(2));
2462 New->setNodeId(-1);
2463 ReplaceUses(Op, New.getNode());
2465}
2466
2467void SelectionDAGISel::Select_UNDEF(SDNode *N) {
2468 CurDAG->SelectNodeTo(N, TargetOpcode::IMPLICIT_DEF, N->getValueType(0));
2469}
2470
2471void SelectionDAGISel::Select_FREEZE(SDNode *N) {
2472 // TODO: We don't have FREEZE pseudo-instruction in MachineInstr-level now.
2473 // If FREEZE instruction is added later, the code below must be changed as
2474 // well.
2475 CurDAG->SelectNodeTo(N, TargetOpcode::COPY, N->getValueType(0),
2476 N->getOperand(0));
2477}
2478
2479void SelectionDAGISel::Select_ARITH_FENCE(SDNode *N) {
2480 CurDAG->SelectNodeTo(N, TargetOpcode::ARITH_FENCE, N->getValueType(0),
2481 N->getOperand(0));
2482}
2483
2484void SelectionDAGISel::Select_MEMBARRIER(SDNode *N) {
2485 CurDAG->SelectNodeTo(N, TargetOpcode::MEMBARRIER, N->getValueType(0),
2486 N->getOperand(0));
2487}
2488
2489void SelectionDAGISel::Select_CONVERGENCECTRL_ANCHOR(SDNode *N) {
2490 CurDAG->SelectNodeTo(N, TargetOpcode::CONVERGENCECTRL_ANCHOR,
2491 N->getValueType(0));
2492}
2493
2494void SelectionDAGISel::Select_CONVERGENCECTRL_ENTRY(SDNode *N) {
2495 CurDAG->SelectNodeTo(N, TargetOpcode::CONVERGENCECTRL_ENTRY,
2496 N->getValueType(0));
2497}
2498
2499void SelectionDAGISel::Select_CONVERGENCECTRL_LOOP(SDNode *N) {
2500 CurDAG->SelectNodeTo(N, TargetOpcode::CONVERGENCECTRL_LOOP,
2501 N->getValueType(0), N->getOperand(0));
2502}
2503
2504void SelectionDAGISel::pushStackMapLiveVariable(SmallVectorImpl<SDValue> &Ops,
2505 SDValue OpVal, SDLoc DL) {
2506 SDNode *OpNode = OpVal.getNode();
2507
2508 // FrameIndex nodes should have been directly emitted to TargetFrameIndex
2509 // nodes at DAG-construction time.
2510 assert(OpNode->getOpcode() != ISD::FrameIndex);
2511
2512 if (OpNode->getOpcode() == ISD::Constant) {
2513 Ops.push_back(
2514 CurDAG->getTargetConstant(StackMaps::ConstantOp, DL, MVT::i64));
2516 OpVal.getValueType()));
2517 } else {
2518 Ops.push_back(OpVal);
2519 }
2520}
2521
2522void SelectionDAGISel::Select_STACKMAP(SDNode *N) {
2524 auto *It = N->op_begin();
2525 SDLoc DL(N);
2526
2527 // Stash the chain and glue operands so we can move them to the end.
2528 SDValue Chain = *It++;
2529 SDValue InGlue = *It++;
2530
2531 // <id> operand.
2532 SDValue ID = *It++;
2533 assert(ID.getValueType() == MVT::i64);
2534 Ops.push_back(ID);
2535
2536 // <numShadowBytes> operand.
2537 SDValue Shad = *It++;
2538 assert(Shad.getValueType() == MVT::i32);
2539 Ops.push_back(Shad);
2540
2541 // Live variable operands.
2542 for (; It != N->op_end(); It++)
2543 pushStackMapLiveVariable(Ops, *It, DL);
2544
2545 Ops.push_back(Chain);
2546 Ops.push_back(InGlue);
2547
2548 SDVTList NodeTys = CurDAG->getVTList(MVT::Other, MVT::Glue);
2549 CurDAG->SelectNodeTo(N, TargetOpcode::STACKMAP, NodeTys, Ops);
2550}
2551
2552void SelectionDAGISel::Select_PATCHPOINT(SDNode *N) {
2554 auto *It = N->op_begin();
2555 SDLoc DL(N);
2556
2557 // Cache arguments that will be moved to the end in the target node.
2558 SDValue Chain = *It++;
2559 std::optional<SDValue> Glue;
2560 if (It->getValueType() == MVT::Glue)
2561 Glue = *It++;
2562 SDValue RegMask = *It++;
2563
2564 // <id> operand.
2565 SDValue ID = *It++;
2566 assert(ID.getValueType() == MVT::i64);
2567 Ops.push_back(ID);
2568
2569 // <numShadowBytes> operand.
2570 SDValue Shad = *It++;
2571 assert(Shad.getValueType() == MVT::i32);
2572 Ops.push_back(Shad);
2573
2574 // Add the callee.
2575 Ops.push_back(*It++);
2576
2577 // Add <numArgs>.
2578 SDValue NumArgs = *It++;
2579 assert(NumArgs.getValueType() == MVT::i32);
2580 Ops.push_back(NumArgs);
2581
2582 // Calling convention.
2583 Ops.push_back(*It++);
2584
2585 // Push the args for the call.
2586 for (uint64_t I = NumArgs->getAsZExtVal(); I != 0; I--)
2587 Ops.push_back(*It++);
2588
2589 // Now push the live variables.
2590 for (; It != N->op_end(); It++)
2591 pushStackMapLiveVariable(Ops, *It, DL);
2592
2593 // Finally, the regmask, chain and (if present) glue are moved to the end.
2594 Ops.push_back(RegMask);
2595 Ops.push_back(Chain);
2596 if (Glue.has_value())
2597 Ops.push_back(*Glue);
2598
2599 SDVTList NodeTys = N->getVTList();
2600 CurDAG->SelectNodeTo(N, TargetOpcode::PATCHPOINT, NodeTys, Ops);
2601}
2602
2603/// GetVBR - decode a vbr encoding whose top bit is set.
2605GetVBR(uint64_t Val, const unsigned char *MatcherTable, unsigned &Idx) {
2606 assert(Val >= 128 && "Not a VBR");
2607 Val &= 127; // Remove first vbr bit.
2608
2609 unsigned Shift = 7;
2610 uint64_t NextBits;
2611 do {
2612 NextBits = MatcherTable[Idx++];
2613 Val |= (NextBits&127) << Shift;
2614 Shift += 7;
2615 } while (NextBits & 128);
2616
2617 return Val;
2618}
2619
2620void SelectionDAGISel::Select_JUMP_TABLE_DEBUG_INFO(SDNode *N) {
2621 SDLoc dl(N);
2622 CurDAG->SelectNodeTo(N, TargetOpcode::JUMP_TABLE_DEBUG_INFO, MVT::Glue,
2623 CurDAG->getTargetConstant(N->getConstantOperandVal(1),
2624 dl, MVT::i64, true));
2625}
2626
2627/// When a match is complete, this method updates uses of interior chain results
2628/// to use the new results.
2629void SelectionDAGISel::UpdateChains(
2630 SDNode *NodeToMatch, SDValue InputChain,
2631 SmallVectorImpl<SDNode *> &ChainNodesMatched, bool isMorphNodeTo) {
2632 SmallVector<SDNode*, 4> NowDeadNodes;
2633
2634 // Now that all the normal results are replaced, we replace the chain and
2635 // glue results if present.
2636 if (!ChainNodesMatched.empty()) {
2637 assert(InputChain.getNode() &&
2638 "Matched input chains but didn't produce a chain");
2639 // Loop over all of the nodes we matched that produced a chain result.
2640 // Replace all the chain results with the final chain we ended up with.
2641 for (unsigned i = 0, e = ChainNodesMatched.size(); i != e; ++i) {
2642 SDNode *ChainNode = ChainNodesMatched[i];
2643 // If ChainNode is null, it's because we replaced it on a previous
2644 // iteration and we cleared it out of the map. Just skip it.
2645 if (!ChainNode)
2646 continue;
2647
2648 assert(ChainNode->getOpcode() != ISD::DELETED_NODE &&
2649 "Deleted node left in chain");
2650
2651 // Don't replace the results of the root node if we're doing a
2652 // MorphNodeTo.
2653 if (ChainNode == NodeToMatch && isMorphNodeTo)
2654 continue;
2655
2656 SDValue ChainVal = SDValue(ChainNode, ChainNode->getNumValues()-1);
2657 if (ChainVal.getValueType() == MVT::Glue)
2658 ChainVal = ChainVal.getValue(ChainVal->getNumValues()-2);
2659 assert(ChainVal.getValueType() == MVT::Other && "Not a chain?");
2661 *CurDAG, [&](SDNode *N, SDNode *E) {
2662 std::replace(ChainNodesMatched.begin(), ChainNodesMatched.end(), N,
2663 static_cast<SDNode *>(nullptr));
2664 });
2665 if (ChainNode->getOpcode() != ISD::TokenFactor)
2666 ReplaceUses(ChainVal, InputChain);
2667
2668 // If the node became dead and we haven't already seen it, delete it.
2669 if (ChainNode != NodeToMatch && ChainNode->use_empty() &&
2670 !llvm::is_contained(NowDeadNodes, ChainNode))
2671 NowDeadNodes.push_back(ChainNode);
2672 }
2673 }
2674
2675 if (!NowDeadNodes.empty())
2676 CurDAG->RemoveDeadNodes(NowDeadNodes);
2677
2678 LLVM_DEBUG(dbgs() << "ISEL: Match complete!\n");
2679}
2680
2681/// HandleMergeInputChains - This implements the OPC_EmitMergeInputChains
2682/// operation for when the pattern matched at least one node with a chains. The
2683/// input vector contains a list of all of the chained nodes that we match. We
2684/// must determine if this is a valid thing to cover (i.e. matching it won't
2685/// induce cycles in the DAG) and if so, creating a TokenFactor node. that will
2686/// be used as the input node chain for the generated nodes.
2687static SDValue
2689 SelectionDAG *CurDAG) {
2690
2693 SmallVector<SDValue, 3> InputChains;
2694 unsigned int Max = 8192;
2695
2696 // Quick exit on trivial merge.
2697 if (ChainNodesMatched.size() == 1)
2698 return ChainNodesMatched[0]->getOperand(0);
2699
2700 // Add chains that aren't already added (internal). Peek through
2701 // token factors.
2702 std::function<void(const SDValue)> AddChains = [&](const SDValue V) {
2703 if (V.getValueType() != MVT::Other)
2704 return;
2705 if (V->getOpcode() == ISD::EntryToken)
2706 return;
2707 if (!Visited.insert(V.getNode()).second)
2708 return;
2709 if (V->getOpcode() == ISD::TokenFactor) {
2710 for (const SDValue &Op : V->op_values())
2711 AddChains(Op);
2712 } else
2713 InputChains.push_back(V);
2714 };
2715
2716 for (auto *N : ChainNodesMatched) {
2717 Worklist.push_back(N);
2718 Visited.insert(N);
2719 }
2720
2721 while (!Worklist.empty())
2722 AddChains(Worklist.pop_back_val()->getOperand(0));
2723
2724 // Skip the search if there are no chain dependencies.
2725 if (InputChains.size() == 0)
2726 return CurDAG->getEntryNode();
2727
2728 // If one of these chains is a successor of input, we must have a
2729 // node that is both the predecessor and successor of the
2730 // to-be-merged nodes. Fail.
2731 Visited.clear();
2732 for (SDValue V : InputChains)
2733 Worklist.push_back(V.getNode());
2734
2735 for (auto *N : ChainNodesMatched)
2736 if (SDNode::hasPredecessorHelper(N, Visited, Worklist, Max, true))
2737 return SDValue();
2738
2739 // Return merged chain.
2740 if (InputChains.size() == 1)
2741 return InputChains[0];
2742 return CurDAG->getNode(ISD::TokenFactor, SDLoc(ChainNodesMatched[0]),
2743 MVT::Other, InputChains);
2744}
2745
2746/// MorphNode - Handle morphing a node in place for the selector.
2747SDNode *SelectionDAGISel::
2748MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTList,
2749 ArrayRef<SDValue> Ops, unsigned EmitNodeInfo) {
2750 // It is possible we're using MorphNodeTo to replace a node with no
2751 // normal results with one that has a normal result (or we could be
2752 // adding a chain) and the input could have glue and chains as well.
2753 // In this case we need to shift the operands down.
2754 // FIXME: This is a horrible hack and broken in obscure cases, no worse
2755 // than the old isel though.
2756 int OldGlueResultNo = -1, OldChainResultNo = -1;
2757
2758 unsigned NTMNumResults = Node->getNumValues();
2759 if (Node->getValueType(NTMNumResults-1) == MVT::Glue) {
2760 OldGlueResultNo = NTMNumResults-1;
2761 if (NTMNumResults != 1 &&
2762 Node->getValueType(NTMNumResults-2) == MVT::Other)
2763 OldChainResultNo = NTMNumResults-2;
2764 } else if (Node->getValueType(NTMNumResults-1) == MVT::Other)
2765 OldChainResultNo = NTMNumResults-1;
2766
2767 // Call the underlying SelectionDAG routine to do the transmogrification. Note
2768 // that this deletes operands of the old node that become dead.
2769 SDNode *Res = CurDAG->MorphNodeTo(Node, ~TargetOpc, VTList, Ops);
2770
2771 // MorphNodeTo can operate in two ways: if an existing node with the
2772 // specified operands exists, it can just return it. Otherwise, it
2773 // updates the node in place to have the requested operands.
2774 if (Res == Node) {
2775 // If we updated the node in place, reset the node ID. To the isel,
2776 // this should be just like a newly allocated machine node.
2777 Res->setNodeId(-1);
2778 }
2779
2780 unsigned ResNumResults = Res->getNumValues();
2781 // Move the glue if needed.
2782 if ((EmitNodeInfo & OPFL_GlueOutput) && OldGlueResultNo != -1 &&
2783 static_cast<unsigned>(OldGlueResultNo) != ResNumResults - 1)
2784 ReplaceUses(SDValue(Node, OldGlueResultNo),
2785 SDValue(Res, ResNumResults - 1));
2786
2787 if ((EmitNodeInfo & OPFL_GlueOutput) != 0)
2788 --ResNumResults;
2789
2790 // Move the chain reference if needed.
2791 if ((EmitNodeInfo & OPFL_Chain) && OldChainResultNo != -1 &&
2792 static_cast<unsigned>(OldChainResultNo) != ResNumResults - 1)
2793 ReplaceUses(SDValue(Node, OldChainResultNo),
2794 SDValue(Res, ResNumResults - 1));
2795
2796 // Otherwise, no replacement happened because the node already exists. Replace
2797 // Uses of the old node with the new one.
2798 if (Res != Node) {
2799 ReplaceNode(Node, Res);
2800 } else {
2802 }
2803
2804 return Res;
2805}
2806
2807/// CheckSame - Implements OP_CheckSame.
2809CheckSame(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N,
2810 const SmallVectorImpl<std::pair<SDValue, SDNode *>> &RecordedNodes) {
2811 // Accept if it is exactly the same as a previously recorded node.
2812 unsigned RecNo = MatcherTable[MatcherIndex++];
2813 assert(RecNo < RecordedNodes.size() && "Invalid CheckSame");
2814 return N == RecordedNodes[RecNo].first;
2815}
2816
2817/// CheckChildSame - Implements OP_CheckChildXSame.
2819 const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N,
2820 const SmallVectorImpl<std::pair<SDValue, SDNode *>> &RecordedNodes,
2821 unsigned ChildNo) {
2822 if (ChildNo >= N.getNumOperands())
2823 return false; // Match fails if out of range child #.
2824 return ::CheckSame(MatcherTable, MatcherIndex, N.getOperand(ChildNo),
2825 RecordedNodes);
2826}
2827
2828/// CheckPatternPredicate - Implements OP_CheckPatternPredicate.
2830CheckPatternPredicate(unsigned Opcode, const unsigned char *MatcherTable,
2831 unsigned &MatcherIndex, const SelectionDAGISel &SDISel) {
2832 bool TwoBytePredNo =
2834 unsigned PredNo =
2835 TwoBytePredNo || Opcode == SelectionDAGISel::OPC_CheckPatternPredicate
2836 ? MatcherTable[MatcherIndex++]
2838 if (TwoBytePredNo)
2839 PredNo |= MatcherTable[MatcherIndex++] << 8;
2840 return SDISel.CheckPatternPredicate(PredNo);
2841}
2842
2843/// CheckNodePredicate - Implements OP_CheckNodePredicate.
2845CheckNodePredicate(unsigned Opcode, const unsigned char *MatcherTable,
2846 unsigned &MatcherIndex, const SelectionDAGISel &SDISel,
2847 SDNode *N) {
2848 unsigned PredNo = Opcode == SelectionDAGISel::OPC_CheckPredicate
2849 ? MatcherTable[MatcherIndex++]
2851 return SDISel.CheckNodePredicate(N, PredNo);
2852}
2853
2855CheckOpcode(const unsigned char *MatcherTable, unsigned &MatcherIndex,
2856 SDNode *N) {
2857 uint16_t Opc = MatcherTable[MatcherIndex++];
2858 Opc |= static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
2859 return N->getOpcode() == Opc;
2860}
2861
2863 SDValue N,
2864 const TargetLowering *TLI,
2865 const DataLayout &DL) {
2866 if (N.getValueType() == VT)
2867 return true;
2868
2869 // Handle the case when VT is iPTR.
2870 return VT == MVT::iPTR && N.getValueType() == TLI->getPointerTy(DL);
2871}
2872
2875 const DataLayout &DL, unsigned ChildNo) {
2876 if (ChildNo >= N.getNumOperands())
2877 return false; // Match fails if out of range child #.
2878 return ::CheckType(VT, N.getOperand(ChildNo), TLI, DL);
2879}
2880
2882CheckCondCode(const unsigned char *MatcherTable, unsigned &MatcherIndex,
2883 SDValue N) {
2884 return cast<CondCodeSDNode>(N)->get() ==
2885 static_cast<ISD::CondCode>(MatcherTable[MatcherIndex++]);
2886}
2887
2889CheckChild2CondCode(const unsigned char *MatcherTable, unsigned &MatcherIndex,
2890 SDValue N) {
2891 if (2 >= N.getNumOperands())
2892 return false;
2893 return ::CheckCondCode(MatcherTable, MatcherIndex, N.getOperand(2));
2894}
2895
2897CheckValueType(const unsigned char *MatcherTable, unsigned &MatcherIndex,
2898 SDValue N, const TargetLowering *TLI, const DataLayout &DL) {
2900 static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
2901 if (cast<VTSDNode>(N)->getVT() == VT)
2902 return true;
2903
2904 // Handle the case when VT is iPTR.
2905 return VT == MVT::iPTR && cast<VTSDNode>(N)->getVT() == TLI->getPointerTy(DL);
2906}
2907
2908// Bit 0 stores the sign of the immediate. The upper bits contain the magnitude
2909// shifted left by 1.
2911 if ((V & 1) == 0)
2912 return V >> 1;
2913 if (V != 1)
2914 return -(V >> 1);
2915 // There is no such thing as -0 with integers. "-0" really means MININT.
2916 return 1ULL << 63;
2917}
2918
2920CheckInteger(const unsigned char *MatcherTable, unsigned &MatcherIndex,
2921 SDValue N) {
2922 int64_t Val = MatcherTable[MatcherIndex++];
2923 if (Val & 128)
2924 Val = GetVBR(Val, MatcherTable, MatcherIndex);
2925
2926 Val = decodeSignRotatedValue(Val);
2927
2928 ConstantSDNode *C = dyn_cast<ConstantSDNode>(N);
2929 return C && C->getAPIntValue().trySExtValue() == Val;
2930}
2931
2933CheckChildInteger(const unsigned char *MatcherTable, unsigned &MatcherIndex,
2934 SDValue N, unsigned ChildNo) {
2935 if (ChildNo >= N.getNumOperands())
2936 return false; // Match fails if out of range child #.
2937 return ::CheckInteger(MatcherTable, MatcherIndex, N.getOperand(ChildNo));
2938}
2939
2941CheckAndImm(const unsigned char *MatcherTable, unsigned &MatcherIndex,
2942 SDValue N, const SelectionDAGISel &SDISel) {
2943 int64_t Val = MatcherTable[MatcherIndex++];
2944 if (Val & 128)
2945 Val = GetVBR(Val, MatcherTable, MatcherIndex);
2946
2947 if (N->getOpcode() != ISD::AND) return false;
2948
2949 ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(1));
2950 return C && SDISel.CheckAndMask(N.getOperand(0), C, Val);
2951}
2952
2954CheckOrImm(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N,
2955 const SelectionDAGISel &SDISel) {
2956 int64_t Val = MatcherTable[MatcherIndex++];
2957 if (Val & 128)
2958 Val = GetVBR(Val, MatcherTable, MatcherIndex);
2959
2960 if (N->getOpcode() != ISD::OR) return false;
2961
2962 ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(1));
2963 return C && SDISel.CheckOrMask(N.getOperand(0), C, Val);
2964}
2965
2966/// IsPredicateKnownToFail - If we know how and can do so without pushing a
2967/// scope, evaluate the current node. If the current predicate is known to
2968/// fail, set Result=true and return anything. If the current predicate is
2969/// known to pass, set Result=false and return the MatcherIndex to continue
2970/// with. If the current predicate is unknown, set Result=false and return the
2971/// MatcherIndex to continue with.
2972static unsigned IsPredicateKnownToFail(const unsigned char *Table,
2973 unsigned Index, SDValue N,
2974 bool &Result,
2975 const SelectionDAGISel &SDISel,
2976 SmallVectorImpl<std::pair<SDValue, SDNode*>> &RecordedNodes) {
2977 unsigned Opcode = Table[Index++];
2978 switch (Opcode) {
2979 default:
2980 Result = false;
2981 return Index-1; // Could not evaluate this predicate.
2983 Result = !::CheckSame(Table, Index, N, RecordedNodes);
2984 return Index;
2989 Result = !::CheckChildSame(Table, Index, N, RecordedNodes,
2991 return Index;
3002 Result = !::CheckPatternPredicate(Opcode, Table, Index, SDISel);
3003 return Index;
3013 Result = !::CheckNodePredicate(Opcode, Table, Index, SDISel, N.getNode());
3014 return Index;
3016 Result = !::CheckOpcode(Table, Index, N.getNode());
3017 return Index;
3022 switch (Opcode) {
3024 VT = MVT::i32;
3025 break;
3027 VT = MVT::i64;
3028 break;
3029 default:
3030 VT = static_cast<MVT::SimpleValueType>(Table[Index++]);
3031 break;
3032 }
3033 Result = !::CheckType(VT, N, SDISel.TLI, SDISel.CurDAG->getDataLayout());
3034 return Index;
3035 }
3037 unsigned Res = Table[Index++];
3038 Result = !::CheckType(static_cast<MVT::SimpleValueType>(Table[Index++]),
3039 N.getValue(Res), SDISel.TLI,
3040 SDISel.CurDAG->getDataLayout());
3041 return Index;
3042 }
3068 unsigned ChildNo;
3071 VT = MVT::i32;
3073 } else if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI64 &&
3075 VT = MVT::i64;
3077 } else {
3078 VT = static_cast<MVT::SimpleValueType>(Table[Index++]);
3079 ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0Type;
3080 }
3081 Result = !::CheckChildType(VT, N, SDISel.TLI,
3082 SDISel.CurDAG->getDataLayout(), ChildNo);
3083 return Index;
3084 }
3086 Result = !::CheckCondCode(Table, Index, N);
3087 return Index;
3089 Result = !::CheckChild2CondCode(Table, Index, N);
3090 return Index;
3092 Result = !::CheckValueType(Table, Index, N, SDISel.TLI,
3093 SDISel.CurDAG->getDataLayout());
3094 return Index;
3096 Result = !::CheckInteger(Table, Index, N);
3097 return Index;
3103 Result = !::CheckChildInteger(Table, Index, N,
3105 return Index;
3107 Result = !::CheckAndImm(Table, Index, N, SDISel);
3108 return Index;
3110 Result = !::CheckOrImm(Table, Index, N, SDISel);
3111 return Index;
3112 }
3113}
3114
3115namespace {
3116
3117struct MatchScope {
3118 /// FailIndex - If this match fails, this is the index to continue with.
3119 unsigned FailIndex;
3120
3121 /// NodeStack - The node stack when the scope was formed.
3122 SmallVector<SDValue, 4> NodeStack;
3123
3124 /// NumRecordedNodes - The number of recorded nodes when the scope was formed.
3125 unsigned NumRecordedNodes;
3126
3127 /// NumMatchedMemRefs - The number of matched memref entries.
3128 unsigned NumMatchedMemRefs;
3129
3130 /// InputChain/InputGlue - The current chain/glue
3131 SDValue InputChain, InputGlue;
3132
3133 /// HasChainNodesMatched - True if the ChainNodesMatched list is non-empty.
3134 bool HasChainNodesMatched;
3135};
3136
3137/// \A DAG update listener to keep the matching state
3138/// (i.e. RecordedNodes and MatchScope) uptodate if the target is allowed to
3139/// change the DAG while matching. X86 addressing mode matcher is an example
3140/// for this.
3141class MatchStateUpdater : public SelectionDAG::DAGUpdateListener
3142{
3143 SDNode **NodeToMatch;
3145 SmallVectorImpl<MatchScope> &MatchScopes;
3146
3147public:
3148 MatchStateUpdater(SelectionDAG &DAG, SDNode **NodeToMatch,
3149 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RN,
3151 : SelectionDAG::DAGUpdateListener(DAG), NodeToMatch(NodeToMatch),
3152 RecordedNodes(RN), MatchScopes(MS) {}
3153
3154 void NodeDeleted(SDNode *N, SDNode *E) override {
3155 // Some early-returns here to avoid the search if we deleted the node or
3156 // if the update comes from MorphNodeTo (MorphNodeTo is the last thing we
3157 // do, so it's unnecessary to update matching state at that point).
3158 // Neither of these can occur currently because we only install this
3159 // update listener during matching a complex patterns.
3160 if (!E || E->isMachineOpcode())
3161 return;
3162 // Check if NodeToMatch was updated.
3163 if (N == *NodeToMatch)
3164 *NodeToMatch = E;
3165 // Performing linear search here does not matter because we almost never
3166 // run this code. You'd have to have a CSE during complex pattern
3167 // matching.
3168 for (auto &I : RecordedNodes)
3169 if (I.first.getNode() == N)
3170 I.first.setNode(E);
3171
3172 for (auto &I : MatchScopes)
3173 for (auto &J : I.NodeStack)
3174 if (J.getNode() == N)
3175 J.setNode(E);
3176 }
3177};
3178
3179} // end anonymous namespace
3180
3182 const unsigned char *MatcherTable,
3183 unsigned TableSize) {
3184 // FIXME: Should these even be selected? Handle these cases in the caller?
3185 switch (NodeToMatch->getOpcode()) {
3186 default:
3187 break;
3188 case ISD::EntryToken: // These nodes remain the same.
3189 case ISD::BasicBlock:
3190 case ISD::Register:
3191 case ISD::RegisterMask:
3192 case ISD::HANDLENODE:
3193 case ISD::MDNODE_SDNODE:
3199 case ISD::MCSymbol:
3204 case ISD::TokenFactor:
3205 case ISD::CopyFromReg:
3206 case ISD::CopyToReg:
3207 case ISD::EH_LABEL:
3210 case ISD::LIFETIME_END:
3211 case ISD::PSEUDO_PROBE:
3212 NodeToMatch->setNodeId(-1); // Mark selected.
3213 return;
3214 case ISD::AssertSext:
3215 case ISD::AssertZext:
3216 case ISD::AssertAlign:
3217 ReplaceUses(SDValue(NodeToMatch, 0), NodeToMatch->getOperand(0));
3218 CurDAG->RemoveDeadNode(NodeToMatch);
3219 return;
3220 case ISD::INLINEASM:
3221 case ISD::INLINEASM_BR:
3222 Select_INLINEASM(NodeToMatch);
3223 return;
3224 case ISD::READ_REGISTER:
3225 Select_READ_REGISTER(NodeToMatch);
3226 return;
3228 Select_WRITE_REGISTER(NodeToMatch);
3229 return;
3230 case ISD::UNDEF:
3231 Select_UNDEF(NodeToMatch);
3232 return;
3233 case ISD::FREEZE:
3234 Select_FREEZE(NodeToMatch);
3235 return;
3236 case ISD::ARITH_FENCE:
3237 Select_ARITH_FENCE(NodeToMatch);
3238 return;
3239 case ISD::MEMBARRIER:
3240 Select_MEMBARRIER(NodeToMatch);
3241 return;
3242 case ISD::STACKMAP:
3243 Select_STACKMAP(NodeToMatch);
3244 return;
3245 case ISD::PATCHPOINT:
3246 Select_PATCHPOINT(NodeToMatch);
3247 return;
3249 Select_JUMP_TABLE_DEBUG_INFO(NodeToMatch);
3250 return;
3252 Select_CONVERGENCECTRL_ANCHOR(NodeToMatch);
3253 return;
3255 Select_CONVERGENCECTRL_ENTRY(NodeToMatch);
3256 return;
3258 Select_CONVERGENCECTRL_LOOP(NodeToMatch);
3259 return;
3260 }
3261
3262 assert(!NodeToMatch->isMachineOpcode() && "Node already selected!");
3263
3264 // Set up the node stack with NodeToMatch as the only node on the stack.
3265 SmallVector<SDValue, 8> NodeStack;
3266 SDValue N = SDValue(NodeToMatch, 0);
3267 NodeStack.push_back(N);
3268
3269 // MatchScopes - Scopes used when matching, if a match failure happens, this
3270 // indicates where to continue checking.
3271 SmallVector<MatchScope, 8> MatchScopes;
3272
3273 // RecordedNodes - This is the set of nodes that have been recorded by the
3274 // state machine. The second value is the parent of the node, or null if the
3275 // root is recorded.
3277
3278 // MatchedMemRefs - This is the set of MemRef's we've seen in the input
3279 // pattern.
3281
3282 // These are the current input chain and glue for use when generating nodes.
3283 // Various Emit operations change these. For example, emitting a copytoreg
3284 // uses and updates these.
3285 SDValue InputChain, InputGlue;
3286
3287 // ChainNodesMatched - If a pattern matches nodes that have input/output
3288 // chains, the OPC_EmitMergeInputChains operation is emitted which indicates
3289 // which ones they are. The result is captured into this list so that we can
3290 // update the chain results when the pattern is complete.
3291 SmallVector<SDNode*, 3> ChainNodesMatched;
3292
3293 LLVM_DEBUG(dbgs() << "ISEL: Starting pattern match\n");
3294
3295 // Determine where to start the interpreter. Normally we start at opcode #0,
3296 // but if the state machine starts with an OPC_SwitchOpcode, then we
3297 // accelerate the first lookup (which is guaranteed to be hot) with the
3298 // OpcodeOffset table.
3299 unsigned MatcherIndex = 0;
3300
3301 if (!OpcodeOffset.empty()) {
3302 // Already computed the OpcodeOffset table, just index into it.
3303 if (N.getOpcode() < OpcodeOffset.size())
3304 MatcherIndex = OpcodeOffset[N.getOpcode()];
3305 LLVM_DEBUG(dbgs() << " Initial Opcode index to " << MatcherIndex << "\n");
3306
3307 } else if (MatcherTable[0] == OPC_SwitchOpcode) {
3308 // Otherwise, the table isn't computed, but the state machine does start
3309 // with an OPC_SwitchOpcode instruction. Populate the table now, since this
3310 // is the first time we're selecting an instruction.
3311 unsigned Idx = 1;
3312 while (true) {
3313 // Get the size of this case.
3314 unsigned CaseSize = MatcherTable[Idx++];
3315 if (CaseSize & 128)
3316 CaseSize = GetVBR(CaseSize, MatcherTable, Idx);
3317 if (CaseSize == 0) break;
3318
3319 // Get the opcode, add the index to the table.
3320 uint16_t Opc = MatcherTable[Idx++];
3321 Opc |= static_cast<uint16_t>(MatcherTable[Idx++]) << 8;
3322 if (Opc >= OpcodeOffset.size())
3323 OpcodeOffset.resize((Opc+1)*2);
3324 OpcodeOffset[Opc] = Idx;
3325 Idx += CaseSize;
3326 }
3327
3328 // Okay, do the lookup for the first opcode.
3329 if (N.getOpcode() < OpcodeOffset.size())
3330 MatcherIndex = OpcodeOffset[N.getOpcode()];
3331 }
3332
3333 while (true) {
3334 assert(MatcherIndex < TableSize && "Invalid index");
3335#ifndef NDEBUG
3336 unsigned CurrentOpcodeIndex = MatcherIndex;
3337#endif
3338 BuiltinOpcodes Opcode =
3339 static_cast<BuiltinOpcodes>(MatcherTable[MatcherIndex++]);
3340 switch (Opcode) {
3341 case OPC_Scope: {
3342 // Okay, the semantics of this operation are that we should push a scope
3343 // then evaluate the first child. However, pushing a scope only to have
3344 // the first check fail (which then pops it) is inefficient. If we can
3345 // determine immediately that the first check (or first several) will
3346 // immediately fail, don't even bother pushing a scope for them.
3347 unsigned FailIndex;
3348
3349 while (true) {
3350 unsigned NumToSkip = MatcherTable[MatcherIndex++];
3351 if (NumToSkip & 128)
3352 NumToSkip = GetVBR(NumToSkip, MatcherTable, MatcherIndex);
3353 // Found the end of the scope with no match.
3354 if (NumToSkip == 0) {
3355 FailIndex = 0;
3356 break;
3357 }
3358
3359 FailIndex = MatcherIndex+NumToSkip;
3360
3361 unsigned MatcherIndexOfPredicate = MatcherIndex;
3362 (void)MatcherIndexOfPredicate; // silence warning.
3363
3364 // If we can't evaluate this predicate without pushing a scope (e.g. if
3365 // it is a 'MoveParent') or if the predicate succeeds on this node, we
3366 // push the scope and evaluate the full predicate chain.
3367 bool Result;
3368 MatcherIndex = IsPredicateKnownToFail(MatcherTable, MatcherIndex, N,
3369 Result, *this, RecordedNodes);
3370 if (!Result)
3371 break;
3372
3373 LLVM_DEBUG(
3374 dbgs() << " Skipped scope entry (due to false predicate) at "
3375 << "index " << MatcherIndexOfPredicate << ", continuing at "
3376 << FailIndex << "\n");
3377 ++NumDAGIselRetries;
3378
3379 // Otherwise, we know that this case of the Scope is guaranteed to fail,
3380 // move to the next case.
3381 MatcherIndex = FailIndex;
3382 }
3383
3384 // If the whole scope failed to match, bail.
3385 if (FailIndex == 0) break;
3386
3387 // Push a MatchScope which indicates where to go if the first child fails
3388 // to match.
3389 MatchScope NewEntry;
3390 NewEntry.FailIndex = FailIndex;
3391 NewEntry.NodeStack.append(NodeStack.begin(), NodeStack.end());
3392 NewEntry.NumRecordedNodes = RecordedNodes.size();
3393 NewEntry.NumMatchedMemRefs = MatchedMemRefs.size();
3394 NewEntry.InputChain = InputChain;
3395 NewEntry.InputGlue = InputGlue;
3396 NewEntry.HasChainNodesMatched = !ChainNodesMatched.empty();
3397 MatchScopes.push_back(NewEntry);
3398 continue;
3399 }
3400 case OPC_RecordNode: {
3401 // Remember this node, it may end up being an operand in the pattern.
3402 SDNode *Parent = nullptr;
3403 if (NodeStack.size() > 1)
3404 Parent = NodeStack[NodeStack.size()-2].getNode();
3405 RecordedNodes.push_back(std::make_pair(N, Parent));
3406 continue;
3407 }
3408
3413 unsigned ChildNo = Opcode-OPC_RecordChild0;
3414 if (ChildNo >= N.getNumOperands())
3415 break; // Match fails if out of range child #.
3416
3417 RecordedNodes.push_back(std::make_pair(N->getOperand(ChildNo),
3418 N.getNode()));
3419 continue;
3420 }
3421 case OPC_RecordMemRef:
3422 if (auto *MN = dyn_cast<MemSDNode>(N))
3423 MatchedMemRefs.push_back(MN->getMemOperand());
3424 else {
3425 LLVM_DEBUG(dbgs() << "Expected MemSDNode "; N->dump(CurDAG);
3426 dbgs() << '\n');
3427 }
3428
3429 continue;
3430
3432 // If the current node has an input glue, capture it in InputGlue.
3433 if (N->getNumOperands() != 0 &&
3434 N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue)
3435 InputGlue = N->getOperand(N->getNumOperands()-1);
3436 continue;
3437
3438 case OPC_MoveChild: {
3439 unsigned ChildNo = MatcherTable[MatcherIndex++];
3440 if (ChildNo >= N.getNumOperands())
3441 break; // Match fails if out of range child #.
3442 N = N.getOperand(ChildNo);
3443 NodeStack.push_back(N);
3444 continue;
3445 }
3446
3447 case OPC_MoveChild0: case OPC_MoveChild1:
3448 case OPC_MoveChild2: case OPC_MoveChild3:
3449 case OPC_MoveChild4: case OPC_MoveChild5:
3450 case OPC_MoveChild6: case OPC_MoveChild7: {
3451 unsigned ChildNo = Opcode-OPC_MoveChild0;
3452 if (ChildNo >= N.getNumOperands())
3453 break; // Match fails if out of range child #.
3454 N = N.getOperand(ChildNo);
3455 NodeStack.push_back(N);
3456 continue;
3457 }
3458
3459 case OPC_MoveSibling:
3460 case OPC_MoveSibling0:
3461 case OPC_MoveSibling1:
3462 case OPC_MoveSibling2:
3463 case OPC_MoveSibling3:
3464 case OPC_MoveSibling4:
3465 case OPC_MoveSibling5:
3466 case OPC_MoveSibling6:
3467 case OPC_MoveSibling7: {
3468 // Pop the current node off the NodeStack.
3469 NodeStack.pop_back();
3470 assert(!NodeStack.empty() && "Node stack imbalance!");
3471 N = NodeStack.back();
3472
3473 unsigned SiblingNo = Opcode == OPC_MoveSibling
3474 ? MatcherTable[MatcherIndex++]
3475 : Opcode - OPC_MoveSibling0;
3476 if (SiblingNo >= N.getNumOperands())
3477 break; // Match fails if out of range sibling #.
3478 N = N.getOperand(SiblingNo);
3479 NodeStack.push_back(N);
3480 continue;
3481 }
3482 case OPC_MoveParent:
3483 // Pop the current node off the NodeStack.
3484 NodeStack.pop_back();
3485 assert(!NodeStack.empty() && "Node stack imbalance!");
3486 N = NodeStack.back();
3487 continue;
3488
3489 case OPC_CheckSame:
3490 if (!::CheckSame(MatcherTable, MatcherIndex, N, RecordedNodes)) break;
3491 continue;
3492
3495 if (!::CheckChildSame(MatcherTable, MatcherIndex, N, RecordedNodes,
3496 Opcode-OPC_CheckChild0Same))
3497 break;
3498 continue;
3499
3510 if (!::CheckPatternPredicate(Opcode, MatcherTable, MatcherIndex, *this))
3511 break;
3512 continue;
3521 case OPC_CheckPredicate:
3522 if (!::CheckNodePredicate(Opcode, MatcherTable, MatcherIndex, *this,
3523 N.getNode()))
3524 break;
3525 continue;
3527 unsigned OpNum = MatcherTable[MatcherIndex++];
3529
3530 for (unsigned i = 0; i < OpNum; ++i)
3531 Operands.push_back(RecordedNodes[MatcherTable[MatcherIndex++]].first);
3532
3533 unsigned PredNo = MatcherTable[MatcherIndex++];
3534 if (!CheckNodePredicateWithOperands(N.getNode(), PredNo, Operands))
3535 break;
3536 continue;
3537 }
3546 case OPC_CheckComplexPat7: {
3547 unsigned CPNum = Opcode == OPC_CheckComplexPat
3548 ? MatcherTable[MatcherIndex++]
3549 : Opcode - OPC_CheckComplexPat0;
3550 unsigned RecNo = MatcherTable[MatcherIndex++];
3551 assert(RecNo < RecordedNodes.size() && "Invalid CheckComplexPat");
3552
3553 // If target can modify DAG during matching, keep the matching state
3554 // consistent.
3555 std::unique_ptr<MatchStateUpdater> MSU;
3557 MSU.reset(new MatchStateUpdater(*CurDAG, &NodeToMatch, RecordedNodes,
3558 MatchScopes));
3559
3560 if (!CheckComplexPattern(NodeToMatch, RecordedNodes[RecNo].second,
3561 RecordedNodes[RecNo].first, CPNum,
3562 RecordedNodes))
3563 break;
3564 continue;
3565 }
3566 case OPC_CheckOpcode:
3567 if (!::CheckOpcode(MatcherTable, MatcherIndex, N.getNode())) break;
3568 continue;
3569
3570 case OPC_CheckType:
3571 case OPC_CheckTypeI32:
3572 case OPC_CheckTypeI64:
3574 switch (Opcode) {
3575 case OPC_CheckTypeI32:
3576 VT = MVT::i32;
3577 break;
3578 case OPC_CheckTypeI64:
3579 VT = MVT::i64;
3580 break;
3581 default:
3582 VT = static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3583 break;
3584 }
3585 if (!::CheckType(VT, N, TLI, CurDAG->getDataLayout()))
3586 break;
3587 continue;
3588
3589 case OPC_CheckTypeRes: {
3590 unsigned Res = MatcherTable[MatcherIndex++];
3591 if (!::CheckType(
3592 static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]),
3593 N.getValue(Res), TLI, CurDAG->getDataLayout()))
3594 break;
3595 continue;
3596 }
3597
3598 case OPC_SwitchOpcode: {
3599 unsigned CurNodeOpcode = N.getOpcode();
3600 unsigned SwitchStart = MatcherIndex-1; (void)SwitchStart;
3601 unsigned CaseSize;
3602 while (true) {
3603 // Get the size of this case.
3604 CaseSize = MatcherTable[MatcherIndex++];
3605 if (CaseSize & 128)
3606 CaseSize = GetVBR(CaseSize, MatcherTable, MatcherIndex);
3607 if (CaseSize == 0) break;
3608
3609 uint16_t Opc = MatcherTable[MatcherIndex++];
3610 Opc |= static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
3611
3612 // If the opcode matches, then we will execute this case.
3613 if (CurNodeOpcode == Opc)
3614 break;
3615
3616 // Otherwise, skip over this case.
3617 MatcherIndex += CaseSize;
3618 }
3619
3620 // If no cases matched, bail out.
3621 if (CaseSize == 0) break;
3622
3623 // Otherwise, execute the case we found.
3624 LLVM_DEBUG(dbgs() << " OpcodeSwitch from " << SwitchStart << " to "
3625 << MatcherIndex << "\n");
3626 continue;
3627 }
3628
3629 case OPC_SwitchType: {
3630 MVT CurNodeVT = N.getSimpleValueType();
3631 unsigned SwitchStart = MatcherIndex-1; (void)SwitchStart;
3632 unsigned CaseSize;
3633 while (true) {
3634 // Get the size of this case.
3635 CaseSize = MatcherTable[MatcherIndex++];
3636 if (CaseSize & 128)
3637 CaseSize = GetVBR(CaseSize, MatcherTable, MatcherIndex);
3638 if (CaseSize == 0) break;
3639
3640 MVT CaseVT =
3641 static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3642 if (CaseVT == MVT::iPTR)
3643 CaseVT = TLI->getPointerTy(CurDAG->getDataLayout());
3644
3645 // If the VT matches, then we will execute this case.
3646 if (CurNodeVT == CaseVT)
3647 break;
3648
3649 // Otherwise, skip over this case.
3650 MatcherIndex += CaseSize;
3651 }
3652
3653 // If no cases matched, bail out.
3654 if (CaseSize == 0) break;
3655
3656 // Otherwise, execute the case we found.
3657 LLVM_DEBUG(dbgs() << " TypeSwitch[" << CurNodeVT
3658 << "] from " << SwitchStart << " to " << MatcherIndex
3659 << '\n');
3660 continue;
3661 }
3687 unsigned ChildNo;
3690 VT = MVT::i32;
3692 } else if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI64 &&
3694 VT = MVT::i64;
3696 } else {
3697 VT = static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3698 ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0Type;
3699 }
3700 if (!::CheckChildType(VT, N, TLI, CurDAG->getDataLayout(), ChildNo))
3701 break;
3702 continue;
3703 }
3704 case OPC_CheckCondCode:
3705 if (!::CheckCondCode(MatcherTable, MatcherIndex, N)) break;
3706 continue;
3708 if (!::CheckChild2CondCode(MatcherTable, MatcherIndex, N)) break;
3709 continue;
3710 case OPC_CheckValueType:
3711 if (!::CheckValueType(MatcherTable, MatcherIndex, N, TLI,
3713 break;
3714 continue;
3715 case OPC_CheckInteger:
3716 if (!::CheckInteger(MatcherTable, MatcherIndex, N)) break;
3717 continue;
3721 if (!::CheckChildInteger(MatcherTable, MatcherIndex, N,
3722 Opcode-OPC_CheckChild0Integer)) break;
3723 continue;
3724 case OPC_CheckAndImm:
3725 if (!::CheckAndImm(MatcherTable, MatcherIndex, N, *this)) break;
3726 continue;
3727 case OPC_CheckOrImm:
3728 if (!::CheckOrImm(MatcherTable, MatcherIndex, N, *this)) break;
3729 continue;
3731 if (!ISD::isConstantSplatVectorAllOnes(N.getNode()))
3732 break;
3733 continue;
3735 if (!ISD::isConstantSplatVectorAllZeros(N.getNode()))
3736 break;
3737 continue;
3738
3740 assert(NodeStack.size() != 1 && "No parent node");
3741 // Verify that all intermediate nodes between the root and this one have
3742 // a single use (ignoring chains, which are handled in UpdateChains).
3743 bool HasMultipleUses = false;
3744 for (unsigned i = 1, e = NodeStack.size()-1; i != e; ++i) {
3745 unsigned NNonChainUses = 0;
3746 SDNode *NS = NodeStack[i].getNode();
3747 for (auto UI = NS->use_begin(), UE = NS->use_end(); UI != UE; ++UI)
3748 if (UI.getUse().getValueType() != MVT::Other)
3749 if (++NNonChainUses > 1) {
3750 HasMultipleUses = true;
3751 break;
3752 }
3753 if (HasMultipleUses) break;
3754 }
3755 if (HasMultipleUses) break;
3756
3757 // Check to see that the target thinks this is profitable to fold and that
3758 // we can fold it without inducing cycles in the graph.
3759 if (!IsProfitableToFold(N, NodeStack[NodeStack.size()-2].getNode(),
3760 NodeToMatch) ||
3761 !IsLegalToFold(N, NodeStack[NodeStack.size()-2].getNode(),
3762 NodeToMatch, OptLevel,
3763 true/*We validate our own chains*/))
3764 break;
3765
3766 continue;
3767 }
3768 case OPC_EmitInteger:
3769 case OPC_EmitInteger8:
3770 case OPC_EmitInteger16:
3771 case OPC_EmitInteger32:
3772 case OPC_EmitInteger64:
3776 switch (Opcode) {
3777 case OPC_EmitInteger8:
3778 VT = MVT::i8;
3779 break;
3780 case OPC_EmitInteger16:
3781 VT = MVT::i16;
3782 break;
3783 case OPC_EmitInteger32:
3785 VT = MVT::i32;
3786 break;
3787 case OPC_EmitInteger64:
3788 VT = MVT::i64;
3789 break;
3790 default:
3791 VT = static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3792 break;
3793 }
3794 int64_t Val = MatcherTable[MatcherIndex++];
3795 if (Val & 128)
3796 Val = GetVBR(Val, MatcherTable, MatcherIndex);
3797 if (Opcode >= OPC_EmitInteger && Opcode <= OPC_EmitInteger64)
3798 Val = decodeSignRotatedValue(Val);
3799 RecordedNodes.push_back(std::pair<SDValue, SDNode *>(
3800 CurDAG->getTargetConstant(Val, SDLoc(NodeToMatch), VT), nullptr));
3801 continue;
3802 }
3803 case OPC_EmitRegister:
3805 case OPC_EmitRegisterI64: {
3807 switch (Opcode) {
3809 VT = MVT::i32;
3810 break;
3812 VT = MVT::i64;
3813 break;
3814 default:
3815 VT = static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3816 break;
3817 }
3818 unsigned RegNo = MatcherTable[MatcherIndex++];
3819 RecordedNodes.push_back(std::pair<SDValue, SDNode *>(
3820 CurDAG->getRegister(RegNo, VT), nullptr));
3821 continue;
3822 }
3823 case OPC_EmitRegister2: {
3824 // For targets w/ more than 256 register names, the register enum
3825 // values are stored in two bytes in the matcher table (just like
3826 // opcodes).
3828 static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3829 unsigned RegNo = MatcherTable[MatcherIndex++];
3830 RegNo |= MatcherTable[MatcherIndex++] << 8;
3831 RecordedNodes.push_back(std::pair<SDValue, SDNode*>(
3832 CurDAG->getRegister(RegNo, VT), nullptr));
3833 continue;
3834 }
3835
3845 // Convert from IMM/FPIMM to target version.
3846 unsigned RecNo = Opcode == OPC_EmitConvertToTarget
3847 ? MatcherTable[MatcherIndex++]
3848 : Opcode - OPC_EmitConvertToTarget0;
3849 assert(RecNo < RecordedNodes.size() && "Invalid EmitConvertToTarget");
3850 SDValue Imm = RecordedNodes[RecNo].first;
3851
3852 if (Imm->getOpcode() == ISD::Constant) {
3853 const ConstantInt *Val=cast<ConstantSDNode>(Imm)->getConstantIntValue();
3854 Imm = CurDAG->getTargetConstant(*Val, SDLoc(NodeToMatch),
3855 Imm.getValueType());
3856 } else if (Imm->getOpcode() == ISD::ConstantFP) {
3857 const ConstantFP *Val=cast<ConstantFPSDNode>(Imm)->getConstantFPValue();
3858 Imm = CurDAG->getTargetConstantFP(*Val, SDLoc(NodeToMatch),
3859 Imm.getValueType());
3860 }
3861
3862 RecordedNodes.push_back(std::make_pair(Imm, RecordedNodes[RecNo].second));
3863 continue;
3864 }
3865
3866 case OPC_EmitMergeInputChains1_0: // OPC_EmitMergeInputChains, 1, 0
3867 case OPC_EmitMergeInputChains1_1: // OPC_EmitMergeInputChains, 1, 1
3868 case OPC_EmitMergeInputChains1_2: { // OPC_EmitMergeInputChains, 1, 2
3869 // These are space-optimized forms of OPC_EmitMergeInputChains.
3870 assert(!InputChain.getNode() &&
3871 "EmitMergeInputChains should be the first chain producing node");
3872 assert(ChainNodesMatched.empty() &&
3873 "Should only have one EmitMergeInputChains per match");
3874
3875 // Read all of the chained nodes.
3876 unsigned RecNo = Opcode - OPC_EmitMergeInputChains1_0;
3877 assert(RecNo < RecordedNodes.size() && "Invalid EmitMergeInputChains");
3878 ChainNodesMatched.push_back(RecordedNodes[RecNo].first.getNode());
3879
3880 // If the chained node is not the root, we can't fold it if it has
3881 // multiple uses.
3882 // FIXME: What if other value results of the node have uses not matched
3883 // by this pattern?
3884 if (ChainNodesMatched.back() != NodeToMatch &&
3885 !RecordedNodes[RecNo].first.hasOneUse()) {
3886 ChainNodesMatched.clear();
3887 break;
3888 }
3889
3890 // Merge the input chains if they are not intra-pattern references.
3891 InputChain = HandleMergeInputChains(ChainNodesMatched, CurDAG);
3892
3893 if (!InputChain.getNode())
3894 break; // Failed to merge.
3895 continue;
3896 }
3897
3899 assert(!InputChain.getNode() &&
3900 "EmitMergeInputChains should be the first chain producing node");
3901 // This node gets a list of nodes we matched in the input that have
3902 // chains. We want to token factor all of the input chains to these nodes
3903 // together. However, if any of the input chains is actually one of the
3904 // nodes matched in this pattern, then we have an intra-match reference.
3905 // Ignore these because the newly token factored chain should not refer to
3906 // the old nodes.
3907 unsigned NumChains = MatcherTable[MatcherIndex++];
3908 assert(NumChains != 0 && "Can't TF zero chains");
3909
3910 assert(ChainNodesMatched.empty() &&
3911 "Should only have one EmitMergeInputChains per match");
3912
3913 // Read all of the chained nodes.
3914 for (unsigned i = 0; i != NumChains; ++i) {
3915 unsigned RecNo = MatcherTable[MatcherIndex++];
3916 assert(RecNo < RecordedNodes.size() && "Invalid EmitMergeInputChains");
3917 ChainNodesMatched.push_back(RecordedNodes[RecNo].first.getNode());
3918
3919 // If the chained node is not the root, we can't fold it if it has
3920 // multiple uses.
3921 // FIXME: What if other value results of the node have uses not matched
3922 // by this pattern?
3923 if (ChainNodesMatched.back() != NodeToMatch &&
3924 !RecordedNodes[RecNo].first.hasOneUse()) {
3925 ChainNodesMatched.clear();
3926 break;
3927 }
3928 }
3929
3930 // If the inner loop broke out, the match fails.
3931 if (ChainNodesMatched.empty())
3932 break;
3933
3934 // Merge the input chains if they are not intra-pattern references.
3935 InputChain = HandleMergeInputChains(ChainNodesMatched, CurDAG);
3936
3937 if (!InputChain.getNode())
3938 break; // Failed to merge.
3939
3940 continue;
3941 }
3942
3943 case OPC_EmitCopyToReg:
3944 case OPC_EmitCopyToReg0:
3945 case OPC_EmitCopyToReg1:
3946 case OPC_EmitCopyToReg2:
3947 case OPC_EmitCopyToReg3:
3948 case OPC_EmitCopyToReg4:
3949 case OPC_EmitCopyToReg5:
3950 case OPC_EmitCopyToReg6:
3951 case OPC_EmitCopyToReg7:
3953 unsigned RecNo =
3954 Opcode >= OPC_EmitCopyToReg0 && Opcode <= OPC_EmitCopyToReg7
3955 ? Opcode - OPC_EmitCopyToReg0
3956 : MatcherTable[MatcherIndex++];
3957 assert(RecNo < RecordedNodes.size() && "Invalid EmitCopyToReg");
3958 unsigned DestPhysReg = MatcherTable[MatcherIndex++];
3959 if (Opcode == OPC_EmitCopyToRegTwoByte)
3960 DestPhysReg |= MatcherTable[MatcherIndex++] << 8;
3961
3962 if (!InputChain.getNode())
3963 InputChain = CurDAG->getEntryNode();
3964
3965 InputChain = CurDAG->getCopyToReg(InputChain, SDLoc(NodeToMatch),
3966 DestPhysReg, RecordedNodes[RecNo].first,
3967 InputGlue);
3968
3969 InputGlue = InputChain.getValue(1);
3970 continue;
3971 }
3972
3973 case OPC_EmitNodeXForm: {
3974 unsigned XFormNo = MatcherTable[MatcherIndex++];
3975 unsigned RecNo = MatcherTable[MatcherIndex++];
3976 assert(RecNo < RecordedNodes.size() && "Invalid EmitNodeXForm");
3977 SDValue Res = RunSDNodeXForm(RecordedNodes[RecNo].first, XFormNo);
3978 RecordedNodes.push_back(std::pair<SDValue,SDNode*>(Res, nullptr));
3979 continue;
3980 }
3981 case OPC_Coverage: {
3982 // This is emitted right before MorphNode/EmitNode.
3983 // So it should be safe to assume that this node has been selected
3984 unsigned index = MatcherTable[MatcherIndex++];
3985 index |= (MatcherTable[MatcherIndex++] << 8);
3986 dbgs() << "COVERED: " << getPatternForIndex(index) << "\n";
3987 dbgs() << "INCLUDED: " << getIncludePathForIndex(index) << "\n";
3988 continue;
3989 }
3990
3991 case OPC_EmitNode:
3992 case OPC_EmitNode0:
3993 case OPC_EmitNode1:
3994 case OPC_EmitNode2:
3995 case OPC_EmitNode0None:
3996 case OPC_EmitNode1None:
3997 case OPC_EmitNode2None:
3998 case OPC_EmitNode0Chain:
3999 case OPC_EmitNode1Chain:
4000 case OPC_EmitNode2Chain:
4001 case OPC_MorphNodeTo:
4002 case OPC_MorphNodeTo0:
4003 case OPC_MorphNodeTo1:
4004 case OPC_MorphNodeTo2:
4017 uint16_t TargetOpc = MatcherTable[MatcherIndex++];
4018 TargetOpc |= static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
4019 unsigned EmitNodeInfo;
4020 if (Opcode >= OPC_EmitNode0None && Opcode <= OPC_EmitNode2Chain) {
4021 if (Opcode >= OPC_EmitNode0Chain && Opcode <= OPC_EmitNode2Chain)
4022 EmitNodeInfo = OPFL_Chain;
4023 else
4024 EmitNodeInfo = OPFL_None;
4025 } else if (Opcode >= OPC_MorphNodeTo0None &&
4026 Opcode <= OPC_MorphNodeTo2GlueOutput) {
4027 if (Opcode >= OPC_MorphNodeTo0Chain && Opcode <= OPC_MorphNodeTo2Chain)
4028 EmitNodeInfo = OPFL_Chain;
4029 else if (Opcode >= OPC_MorphNodeTo0GlueInput &&
4030 Opcode <= OPC_MorphNodeTo2GlueInput)
4031 EmitNodeInfo = OPFL_GlueInput;
4032 else if (Opcode >= OPC_MorphNodeTo0GlueOutput &&
4034 EmitNodeInfo = OPFL_GlueOutput;
4035 else
4036 EmitNodeInfo = OPFL_None;
4037 } else
4038 EmitNodeInfo = MatcherTable[MatcherIndex++];
4039 // Get the result VT list.
4040 unsigned NumVTs;
4041 // If this is one of the compressed forms, get the number of VTs based
4042 // on the Opcode. Otherwise read the next byte from the table.
4043 if (Opcode >= OPC_MorphNodeTo0 && Opcode <= OPC_MorphNodeTo2)
4044 NumVTs = Opcode - OPC_MorphNodeTo0;
4045 else if (Opcode >= OPC_MorphNodeTo0None && Opcode <= OPC_MorphNodeTo2None)
4046 NumVTs = Opcode - OPC_MorphNodeTo0None;
4047 else if (Opcode >= OPC_MorphNodeTo0Chain &&
4048 Opcode <= OPC_MorphNodeTo2Chain)
4049 NumVTs = Opcode - OPC_MorphNodeTo0Chain;
4050 else if (Opcode >= OPC_MorphNodeTo0GlueInput &&
4051 Opcode <= OPC_MorphNodeTo2GlueInput)
4052 NumVTs = Opcode - OPC_MorphNodeTo0GlueInput;
4053 else if (Opcode >= OPC_MorphNodeTo0GlueOutput &&
4055 NumVTs = Opcode - OPC_MorphNodeTo0GlueOutput;
4056 else if (Opcode >= OPC_EmitNode0 && Opcode <= OPC_EmitNode2)
4057 NumVTs = Opcode - OPC_EmitNode0;
4058 else if (Opcode >= OPC_EmitNode0None && Opcode <= OPC_EmitNode2None)
4059 NumVTs = Opcode - OPC_EmitNode0None;
4060 else if (Opcode >= OPC_EmitNode0Chain && Opcode <= OPC_EmitNode2Chain)
4061 NumVTs = Opcode - OPC_EmitNode0Chain;
4062 else
4063 NumVTs = MatcherTable[MatcherIndex++];
4065 for (unsigned i = 0; i != NumVTs; ++i) {
4067 static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
4068 if (VT == MVT::iPTR)
4069 VT = TLI->getPointerTy(CurDAG->getDataLayout()).SimpleTy;
4070 VTs.push_back(VT);
4071 }
4072
4073 if (EmitNodeInfo & OPFL_Chain)
4074 VTs.push_back(MVT::Other);
4075 if (EmitNodeInfo & OPFL_GlueOutput)
4076 VTs.push_back(MVT::Glue);
4077
4078 // This is hot code, so optimize the two most common cases of 1 and 2
4079 // results.
4080 SDVTList VTList;
4081 if (VTs.size() == 1)
4082 VTList = CurDAG->getVTList(VTs[0]);
4083 else if (VTs.size() == 2)
4084 VTList = CurDAG->getVTList(VTs[0], VTs[1]);
4085 else
4086 VTList = CurDAG->getVTList(VTs);
4087
4088 // Get the operand list.
4089 unsigned NumOps = MatcherTable[MatcherIndex++];
4091 for (unsigned i = 0; i != NumOps; ++i) {
4092 unsigned RecNo = MatcherTable[MatcherIndex++];
4093 if (RecNo & 128)
4094 RecNo = GetVBR(RecNo, MatcherTable, MatcherIndex);
4095
4096 assert(RecNo < RecordedNodes.size() && "Invalid EmitNode");
4097 Ops.push_back(RecordedNodes[RecNo].first);
4098 }
4099
4100 // If there are variadic operands to add, handle them now.
4101 if (EmitNodeInfo & OPFL_VariadicInfo) {
4102 // Determine the start index to copy from.
4103 unsigned FirstOpToCopy = getNumFixedFromVariadicInfo(EmitNodeInfo);
4104 FirstOpToCopy += (EmitNodeInfo & OPFL_Chain) ? 1 : 0;
4105 assert(NodeToMatch->getNumOperands() >= FirstOpToCopy &&
4106 "Invalid variadic node");
4107 // Copy all of the variadic operands, not including a potential glue
4108 // input.
4109 for (unsigned i = FirstOpToCopy, e = NodeToMatch->getNumOperands();
4110 i != e; ++i) {
4111 SDValue V = NodeToMatch->getOperand(i);
4112 if (V.getValueType() == MVT::Glue) break;
4113 Ops.push_back(V);
4114 }
4115 }
4116
4117 // If this has chain/glue inputs, add them.
4118 if (EmitNodeInfo & OPFL_Chain)
4119 Ops.push_back(InputChain);
4120 if ((EmitNodeInfo & OPFL_GlueInput) && InputGlue.getNode() != nullptr)
4121 Ops.push_back(InputGlue);
4122
4123 // Check whether any matched node could raise an FP exception. Since all
4124 // such nodes must have a chain, it suffices to check ChainNodesMatched.
4125 // We need to perform this check before potentially modifying one of the
4126 // nodes via MorphNode.
4127 bool MayRaiseFPException =
4128 llvm::any_of(ChainNodesMatched, [this](SDNode *N) {
4129 return mayRaiseFPException(N) && !N->getFlags().hasNoFPExcept();
4130 });
4131
4132 // Create the node.
4133 MachineSDNode *Res = nullptr;
4134 bool IsMorphNodeTo =
4135 Opcode == OPC_MorphNodeTo ||
4136 (Opcode >= OPC_MorphNodeTo0 && Opcode <= OPC_MorphNodeTo2GlueOutput);
4137 if (!IsMorphNodeTo) {
4138 // If this is a normal EmitNode command, just create the new node and
4139 // add the results to the RecordedNodes list.
4140 Res = CurDAG->getMachineNode(TargetOpc, SDLoc(NodeToMatch),
4141 VTList, Ops);
4142
4143 // Add all the non-glue/non-chain results to the RecordedNodes list.
4144 for (unsigned i = 0, e = VTs.size(); i != e; ++i) {
4145 if (VTs[i] == MVT::Other || VTs[i] == MVT::Glue) break;
4146 RecordedNodes.push_back(std::pair<SDValue,SDNode*>(SDValue(Res, i),
4147 nullptr));
4148 }
4149 } else {
4150 assert(NodeToMatch->getOpcode() != ISD::DELETED_NODE &&
4151 "NodeToMatch was removed partway through selection");
4153 SDNode *E) {
4155 auto &Chain = ChainNodesMatched;
4156 assert((!E || !is_contained(Chain, N)) &&
4157 "Chain node replaced during MorphNode");
4158 llvm::erase(Chain, N);
4159 });
4160 Res = cast<MachineSDNode>(MorphNode(NodeToMatch, TargetOpc, VTList,
4161 Ops, EmitNodeInfo));
4162 }
4163
4164 // Set the NoFPExcept flag when no original matched node could
4165 // raise an FP exception, but the new node potentially might.
4166 if (!MayRaiseFPException && mayRaiseFPException(Res)) {
4167 SDNodeFlags Flags = Res->getFlags();
4168 Flags.setNoFPExcept(true);
4169 Res->setFlags(Flags);
4170 }
4171
4172 // If the node had chain/glue results, update our notion of the current
4173 // chain and glue.
4174 if (EmitNodeInfo & OPFL_GlueOutput) {
4175 InputGlue = SDValue(Res, VTs.size()-1);
4176 if (EmitNodeInfo & OPFL_Chain)
4177 InputChain = SDValue(Res, VTs.size()-2);
4178 } else if (EmitNodeInfo & OPFL_Chain)
4179 InputChain = SDValue(Res, VTs.size()-1);
4180
4181 // If the OPFL_MemRefs glue is set on this node, slap all of the
4182 // accumulated memrefs onto it.
4183 //
4184 // FIXME: This is vastly incorrect for patterns with multiple outputs
4185 // instructions that access memory and for ComplexPatterns that match
4186 // loads.
4187 if (EmitNodeInfo & OPFL_MemRefs) {
4188 // Only attach load or store memory operands if the generated
4189 // instruction may load or store.
4190 const MCInstrDesc &MCID = TII->get(TargetOpc);
4191 bool mayLoad = MCID.mayLoad();
4192 bool mayStore = MCID.mayStore();
4193
4194 // We expect to have relatively few of these so just filter them into a
4195 // temporary buffer so that we can easily add them to the instruction.
4197 for (MachineMemOperand *MMO : MatchedMemRefs) {
4198 if (MMO->isLoad()) {
4199 if (mayLoad)
4200 FilteredMemRefs.push_back(MMO);
4201 } else if (MMO->isStore()) {
4202 if (mayStore)
4203 FilteredMemRefs.push_back(MMO);
4204 } else {
4205 FilteredMemRefs.push_back(MMO);
4206 }
4207 }
4208
4209 CurDAG->setNodeMemRefs(Res, FilteredMemRefs);
4210 }
4211
4212 LLVM_DEBUG(if (!MatchedMemRefs.empty() && Res->memoperands_empty()) dbgs()
4213 << " Dropping mem operands\n";
4214 dbgs() << " " << (IsMorphNodeTo ? "Morphed" : "Created")
4215 << " node: ";
4216 Res->dump(CurDAG););
4217
4218 // If this was a MorphNodeTo then we're completely done!
4219 if (IsMorphNodeTo) {
4220 // Update chain uses.
4221 UpdateChains(Res, InputChain, ChainNodesMatched, true);
4222 return;
4223 }
4224 continue;
4225 }
4226
4227 case OPC_CompleteMatch: {
4228 // The match has been completed, and any new nodes (if any) have been
4229 // created. Patch up references to the matched dag to use the newly
4230 // created nodes.
4231 unsigned NumResults = MatcherTable[MatcherIndex++];
4232
4233 for (unsigned i = 0; i != NumResults; ++i) {
4234 unsigned ResSlot = MatcherTable[MatcherIndex++];
4235 if (ResSlot & 128)
4236 ResSlot = GetVBR(ResSlot, MatcherTable, MatcherIndex);
4237
4238 assert(ResSlot < RecordedNodes.size() && "Invalid CompleteMatch");
4239 SDValue Res = RecordedNodes[ResSlot].first;
4240
4241 assert(i < NodeToMatch->getNumValues() &&
4242 NodeToMatch->getValueType(i) != MVT::Other &&
4243 NodeToMatch->getValueType(i) != MVT::Glue &&
4244 "Invalid number of results to complete!");
4245 assert((NodeToMatch->getValueType(i) == Res.getValueType() ||
4246 NodeToMatch->getValueType(i) == MVT::iPTR ||
4247 Res.getValueType() == MVT::iPTR ||
4248 NodeToMatch->getValueType(i).getSizeInBits() ==
4249 Res.getValueSizeInBits()) &&
4250 "invalid replacement");
4251 ReplaceUses(SDValue(NodeToMatch, i), Res);
4252 }
4253
4254 // Update chain uses.
4255 UpdateChains(NodeToMatch, InputChain, ChainNodesMatched, false);
4256
4257 // If the root node defines glue, we need to update it to the glue result.
4258 // TODO: This never happens in our tests and I think it can be removed /
4259 // replaced with an assert, but if we do it this the way the change is
4260 // NFC.
4261 if (NodeToMatch->getValueType(NodeToMatch->getNumValues() - 1) ==
4262 MVT::Glue &&
4263 InputGlue.getNode())
4264 ReplaceUses(SDValue(NodeToMatch, NodeToMatch->getNumValues() - 1),
4265 InputGlue);
4266
4267 assert(NodeToMatch->use_empty() &&
4268 "Didn't replace all uses of the node?");
4269 CurDAG->RemoveDeadNode(NodeToMatch);
4270
4271 return;
4272 }
4273 }
4274
4275 // If the code reached this point, then the match failed. See if there is
4276 // another child to try in the current 'Scope', otherwise pop it until we
4277 // find a case to check.
4278 LLVM_DEBUG(dbgs() << " Match failed at index " << CurrentOpcodeIndex
4279 << "\n");
4280 ++NumDAGIselRetries;
4281 while (true) {
4282 if (MatchScopes.empty()) {
4283 CannotYetSelect(NodeToMatch);
4284 return;
4285 }
4286
4287 // Restore the interpreter state back to the point where the scope was
4288 // formed.
4289 MatchScope &LastScope = MatchScopes.back();
4290 RecordedNodes.resize(LastScope.NumRecordedNodes);
4291 NodeStack.clear();
4292 NodeStack.append(LastScope.NodeStack.begin(), LastScope.NodeStack.end());
4293 N = NodeStack.back();
4294
4295 if (LastScope.NumMatchedMemRefs != MatchedMemRefs.size())
4296 MatchedMemRefs.resize(LastScope.NumMatchedMemRefs);
4297 MatcherIndex = LastScope.FailIndex;
4298
4299 LLVM_DEBUG(dbgs() << " Continuing at " << MatcherIndex << "\n");
4300
4301 InputChain = LastScope.InputChain;
4302 InputGlue = LastScope.InputGlue;
4303 if (!LastScope.HasChainNodesMatched)
4304 ChainNodesMatched.clear();
4305
4306 // Check to see what the offset is at the new MatcherIndex. If it is zero
4307 // we have reached the end of this scope, otherwise we have another child
4308 // in the current scope to try.
4309 unsigned NumToSkip = MatcherTable[MatcherIndex++];
4310 if (NumToSkip & 128)
4311 NumToSkip = GetVBR(NumToSkip, MatcherTable, MatcherIndex);
4312
4313 // If we have another child in this scope to match, update FailIndex and
4314 // try it.
4315 if (NumToSkip != 0) {
4316 LastScope.FailIndex = MatcherIndex+NumToSkip;
4317 break;
4318 }
4319
4320 // End of this scope, pop it and try the next child in the containing
4321 // scope.
4322 MatchScopes.pop_back();
4323 }
4324 }
4325}
4326
4327/// Return whether the node may raise an FP exception.
4329 // For machine opcodes, consult the MCID flag.
4330 if (N->isMachineOpcode()) {
4331 const MCInstrDesc &MCID = TII->get(N->getMachineOpcode());
4332 return MCID.mayRaiseFPException();
4333 }
4334
4335 // For ISD opcodes, only StrictFP opcodes may raise an FP
4336 // exception.
4337 if (N->isTargetOpcode())
4338 return N->isTargetStrictFPOpcode();
4339 return N->isStrictFPOpcode();
4340}
4341
4343 assert(N->getOpcode() == ISD::OR && "Unexpected opcode");
4344 auto *C = dyn_cast<ConstantSDNode>(N->getOperand(1));
4345 if (!C)
4346 return false;
4347
4348 // Detect when "or" is used to add an offset to a stack object.
4349 if (auto *FN = dyn_cast<FrameIndexSDNode>(N->getOperand(0))) {
4351 Align A = MFI.getObjectAlign(FN->getIndex());
4352 int32_t Off = C->getSExtValue();
4353 // If the alleged offset fits in the zero bits guaranteed by
4354 // the alignment, then this or is really an add.
4355 return (Off >= 0) && (((A.value() - 1) & Off) == unsigned(Off));
4356 }
4357 return false;
4358}
4359
4360void SelectionDAGISel::CannotYetSelect(SDNode *N) {
4361 std::string msg;
4362 raw_string_ostream Msg(msg);
4363 Msg << "Cannot select: ";
4364
4365 if (N->getOpcode() != ISD::INTRINSIC_W_CHAIN &&
4366 N->getOpcode() != ISD::INTRINSIC_WO_CHAIN &&
4367 N->getOpcode() != ISD::INTRINSIC_VOID) {
4368 N->printrFull(Msg, CurDAG);
4369 Msg << "\nIn function: " << MF->getName();
4370 } else {
4371 bool HasInputChain = N->getOperand(0).getValueType() == MVT::Other;
4372 unsigned iid = N->getConstantOperandVal(HasInputChain);
4373 if (iid < Intrinsic::num_intrinsics)
4374 Msg << "intrinsic %" << Intrinsic::getBaseName((Intrinsic::ID)iid);
4375 else if (const TargetIntrinsicInfo *TII = TM.getIntrinsicInfo())
4376 Msg << "target intrinsic %" << TII->getName(iid);
4377 else
4378 Msg << "unknown intrinsic #" << iid;
4379 }
4381}
unsigned const MachineRegisterInfo * MRI
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
MachineInstrBuilder & UseMI
amdgpu AMDGPU Register Bank Select
Rewrite undef for PHI
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Expand Atomic instructions
BlockVerifier::State From
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_ATTRIBUTE_ALWAYS_INLINE
LLVM_ATTRIBUTE_ALWAYS_INLINE - On compilers where we have a directive to do so, mark a method "always...
Definition: Compiler.h:261
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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
This file defines the DenseMap class.
bool End
Definition: ELF_riscv.cpp:480
This file defines the FastISel class.
IRTranslator LLVM IR MI
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
mir Rename Register Operands
Machine Instruction Scheduler
unsigned const TargetRegisterInfo * TRI
This file contains the declarations for metadata subclasses.
Module.h This file contains the declarations for the Module class.
uint64_t IntrinsicInst * II
#define P(N)
FunctionAnalysisManager FAM
const char LLVMTargetMachineRef TM
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckValueType(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const TargetLowering *TLI, const DataLayout &DL)
static cl::opt< bool > ViewSUnitDAGs("view-sunit-dags", cl::Hidden, cl::desc("Pop up a window to show SUnit dags after they are processed"))
static cl::opt< bool > ViewDAGCombineLT("view-dag-combine-lt-dags", cl::Hidden, cl::desc("Pop up a window to show dags before the post " "legalize types dag combine pass"))
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckPatternPredicate(unsigned Opcode, const unsigned char *MatcherTable, unsigned &MatcherIndex, const SelectionDAGISel &SDISel)
CheckPatternPredicate - Implements OP_CheckPatternPredicate.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChildSame(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const SmallVectorImpl< std::pair< SDValue, SDNode * > > &RecordedNodes, unsigned ChildNo)
CheckChildSame - Implements OP_CheckChildXSame.
static uint64_t decodeSignRotatedValue(uint64_t V)
Decode a signed value stored with the sign bit in the LSB for dense VBR encoding.
static cl::opt< bool > ViewISelDAGs("view-isel-dags", cl::Hidden, cl::desc("Pop up a window to show isel dags as they are selected"))
static LLVM_ATTRIBUTE_ALWAYS_INLINE uint64_t GetVBR(uint64_t Val, const unsigned char *MatcherTable, unsigned &Idx)
GetVBR - decode a vbr encoding whose top bit is set.
static void computeUsesMSVCFloatingPoint(const Triple &TT, const Function &F, MachineModuleInfo &MMI)
static void reportFastISelFailure(MachineFunction &MF, OptimizationRemarkEmitter &ORE, OptimizationRemarkMissed &R, bool ShouldAbort)
static cl::opt< bool > ViewDAGCombine2("view-dag-combine2-dags", cl::Hidden, cl::desc("Pop up a window to show dags before the second " "dag combine pass"))
static RegisterScheduler defaultListDAGScheduler("default", "Best scheduler for the target", createDefaultScheduler)
static unsigned IsPredicateKnownToFail(const unsigned char *Table, unsigned Index, SDValue N, bool &Result, const SelectionDAGISel &SDISel, SmallVectorImpl< std::pair< SDValue, SDNode * > > &RecordedNodes)
IsPredicateKnownToFail - If we know how and can do so without pushing a scope, evaluate the current n...
static cl::opt< int > EnableFastISelAbort("fast-isel-abort", cl::Hidden, cl::desc("Enable abort calls when \"fast\" instruction selection " "fails to lower an instruction: 0 disable the abort, 1 will " "abort but for args, calls and terminators, 2 will also " "abort for argument lowering, and 3 will never fallback " "to SelectionDAG."))
static void mapWasmLandingPadIndex(MachineBasicBlock *MBB, const CatchPadInst *CPI)
#define ISEL_DUMP(X)
static void processSingleLocVars(FunctionLoweringInfo &FuncInfo, FunctionVarLocs const *FnVarLocs)
Collect single location variable information generated with assignment tracking.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckInteger(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckAndImm(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const SelectionDAGISel &SDISel)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckOrImm(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const SelectionDAGISel &SDISel)
static cl::opt< bool > UseMBPI("use-mbpi", cl::desc("use Machine Branch Probability Info"), cl::init(true), cl::Hidden)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChildType(MVT::SimpleValueType VT, SDValue N, const TargetLowering *TLI, const DataLayout &DL, unsigned ChildNo)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckSame(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const SmallVectorImpl< std::pair< SDValue, SDNode * > > &RecordedNodes)
CheckSame - Implements OP_CheckSame.
static bool dontUseFastISelFor(const Function &Fn)
static bool findNonImmUse(SDNode *Root, SDNode *Def, SDNode *ImmedUse, bool IgnoreChains)
findNonImmUse - Return true if "Def" is a predecessor of "Root" via a path beyond "ImmedUse".
static cl::opt< bool > ViewDAGCombine1("view-dag-combine1-dags", cl::Hidden, cl::desc("Pop up a window to show dags before the first " "dag combine pass"))
static bool processIfEntryValueDbgDeclare(FunctionLoweringInfo &FuncInfo, const Value *Arg, DIExpression *Expr, DILocalVariable *Var, DebugLoc DbgLoc)
static cl::opt< bool > ViewSchedDAGs("view-sched-dags", cl::Hidden, cl::desc("Pop up a window to show sched dags as they are processed"))
static void processDbgDeclares(FunctionLoweringInfo &FuncInfo)
Collect llvm.dbg.declare information.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckType(MVT::SimpleValueType VT, SDValue N, const TargetLowering *TLI, const DataLayout &DL)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckCondCode(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N)
static bool hasExceptionPointerOrCodeUser(const CatchPadInst *CPI)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChild2CondCode(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N)
static cl::opt< bool > ViewLegalizeDAGs("view-legalize-dags", cl::Hidden, cl::desc("Pop up a window to show dags before legalize"))
static cl::opt< bool > ViewLegalizeTypesDAGs("view-legalize-types-dags", cl::Hidden, cl::desc("Pop up a window to show dags before legalize types"))
static SDNode * findGlueUse(SDNode *N)
findGlueUse - Return use of MVT::Glue value produced by the specified SDNode.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckNodePredicate(unsigned Opcode, const unsigned char *MatcherTable, unsigned &MatcherIndex, const SelectionDAGISel &SDISel, SDNode *N)
CheckNodePredicate - Implements OP_CheckNodePredicate.
static cl::opt< RegisterScheduler::FunctionPassCtor, false, RegisterPassParser< RegisterScheduler > > ISHeuristic("pre-RA-sched", cl::init(&createDefaultScheduler), cl::Hidden, cl::desc("Instruction schedulers available (before register" " allocation):"))
ISHeuristic command line option for instruction schedulers.
static cl::opt< bool > EnableFastISelFallbackReport("fast-isel-report-on-fallback", cl::Hidden, cl::desc("Emit a diagnostic when \"fast\" instruction selection " "falls back to SelectionDAG."))
static bool processDbgDeclare(FunctionLoweringInfo &FuncInfo, const Value *Address, DIExpression *Expr, DILocalVariable *Var, DebugLoc DbgLoc)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckOpcode(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDNode *N)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChildInteger(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, unsigned ChildNo)
static cl::opt< std::string > FilterDAGBasicBlockName("filter-view-dags", cl::Hidden, cl::desc("Only display the basic block whose name " "matches this for all view-*-dags options"))
static SDValue HandleMergeInputChains(SmallVectorImpl< SDNode * > &ChainNodesMatched, SelectionDAG *CurDAG)
HandleMergeInputChains - This implements the OPC_EmitMergeInputChains operation for when the pattern ...
static bool isFoldedOrDeadInstruction(const Instruction *I, const FunctionLoweringInfo &FuncInfo)
isFoldedOrDeadInstruction - Return true if the specified instruction is side-effect free and is eithe...
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
This file describes how to lower LLVM code to machine code.
This pass exposes codegen information to IR-level passes.
LLVM IR instance of the generic uniformity analysis.
Value * RHS
Value * LHS
DEMANGLE_DUMP_METHOD void dump() const
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
Class for arbitrary precision integers.
Definition: APInt.h:78
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition: APInt.h:1237
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
Definition: PassManager.h:424
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:405
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
This class represents an incoming formal argument to a Function.
Definition: Argument.h:31
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
iterator end()
Definition: BasicBlock.h:451
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition: BasicBlock.h:507
InstListType::const_iterator const_iterator
Definition: BasicBlock.h:168
const Instruction * getFirstNonPHI() const
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
Definition: BasicBlock.cpp:365
bool isEHPad() const
Return true if this basic block is an exception handling block.
Definition: BasicBlock.h:665
const Instruction * getFirstMayFaultInst() const
Returns the first potential AsynchEH faulty instruction currently it checks for loads/stores (which m...
Definition: BasicBlock.cpp:356
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis pass which computes BranchProbabilityInfo.
Legacy analysis pass which computes BranchProbabilityInfo.
ConstantFP - Floating Point Values [float, double].
Definition: Constants.h:269
This is the shared class of boolean and integer constants.
Definition: Constants.h:81
This is an important base class in LLVM.
Definition: Constant.h:42
DWARF expression.
bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
static DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
Record of a variable value-assignment, aka a non instruction representation of the dbg....
A debug info location.
Definition: DebugLoc.h:33
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:155
iterator end()
Definition: DenseMap.h:84
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:220
Diagnostic information for ISel fallback path.
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition: FastISel.h:66
void setLastLocalValue(MachineInstr *I)
Update the position of the last instruction emitted for materializing constants for use in the curren...
Definition: FastISel.h:237
void handleDbgInfo(const Instruction *II)
Target-independent lowering of non-instruction debug info associated with this instruction.
Definition: FastISel.cpp:1192
bool tryToFoldLoad(const LoadInst *LI, const Instruction *FoldInst)
We're checking to see if we can fold LI into FoldInst.
Definition: FastISel.cpp:2315
void removeDeadCode(MachineBasicBlock::iterator I, MachineBasicBlock::iterator E)
Remove all dead instructions between the I and E.
Definition: FastISel.cpp:410
void startNewBlock()
Set the current block to which generated machine instructions will be appended.
Definition: FastISel.cpp:123
bool selectInstruction(const Instruction *I)
Do "fast" instruction selection for the given LLVM IR instruction and append the generated machine in...
Definition: FastISel.cpp:1597
void finishBasicBlock()
Flush the local value map.
Definition: FastISel.cpp:136
void recomputeInsertPt()
Reset InsertPt to prepare for inserting instructions into the current block.
Definition: FastISel.cpp:401
bool lowerArguments()
Do "fast" instruction selection for function arguments and append the machine instructions to the cur...
Definition: FastISel.cpp:138
unsigned arg_size() const
arg_size - Return the number of funcletpad arguments.
Definition: InstrTypes.h:2441
Value * getArgOperand(unsigned i) const
getArgOperand/setArgOperand - Return/set the i-th funcletpad argument.
Definition: InstrTypes.h:2457
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
SmallPtrSet< const DbgVariableRecord *, 8 > PreprocessedDVRDeclares
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
int getArgumentFrameIndex(const Argument *A)
getArgumentFrameIndex - Get frame index for the byval argument.
bool isExportedInst(const Value *V) const
isExportedInst - Return true if the specified value is an instruction exported from its block.
SmallPtrSet< const DbgDeclareInst *, 8 > PreprocessedDbgDeclares
Collection of dbg.declare instructions handled after argument lowering and before ISel proper.
DenseMap< const Value *, Register > ValueMap
ValueMap - Since we emit code for the function a basic block at a time, we must remember which virtua...
MachineRegisterInfo * RegInfo
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
Definition: Pass.cpp:178
Data structure describing the variable locations in a function.
const VarLocInfo * single_locs_begin() const
DILocalVariable * getDILocalVariable(const VarLocInfo *Loc) const
Return the DILocalVariable for the location definition represented by ID.
const VarLocInfo * single_locs_end() const
One past the last single-location variable location definition.
const BasicBlock & getEntryBlock() const
Definition: Function.h:800
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition: Function.h:207
iterator_range< arg_iterator > args()
Definition: Function.h:855
DISubprogram * getSubprogram() const
Get the attached subprogram.
Definition: Metadata.cpp:1830
bool hasGC() const
hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm to use during code generatio...
Definition: Function.h:342
bool hasOptNone() const
Do not optimize this function (-O0).
Definition: Function.h:692
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition: Function.cpp:358
An analysis pass which caches information about the Function.
Definition: GCMetadata.h:180
An analysis pass which caches information about the entire Module.
Definition: GCMetadata.h:203
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
This class is used to form a handle around another node that is persistent and is updated across invo...
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
Definition: Instruction.h:466
bool isTerminator() const
Definition: Instruction.h:277
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:48
void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
This is an alternative analysis pass to BlockFrequencyInfoWrapperPass.
static void getLazyBFIAnalysisUsage(AnalysisUsage &AU)
Helper for client passes to set up the analysis usage on behalf of this pass.
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
Definition: MCContext.cpp:346
Describe properties that are true of each instruction in the target description file.
Definition: MCInstrDesc.h:198
bool mayStore() const
Return true if this instruction could possibly modify memory.
Definition: MCInstrDesc.h:444
bool mayLoad() const
Return true if this instruction could possibly read memory.
Definition: MCInstrDesc.h:438
bool mayRaiseFPException() const
Return true if this instruction may raise a floating-point exception.
Definition: MCInstrDesc.h:447
bool isCall() const
Return true if the instruction is a call.
Definition: MCInstrDesc.h:288
bool isReturn() const
Return true if the instruction is a return.
Definition: MCInstrDesc.h:276
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
Definition: MCInstrInfo.h:63
StringRef getName(unsigned Opcode) const
Returns the name for the instructions with the given opcode.
Definition: MCInstrInfo.h:70
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
const MDNode * getMD() const
Metadata node.
Definition: Metadata.h:1067
const MDOperand & getOperand(unsigned I) const
Definition: Metadata.h:1428
A single uniqued string.
Definition: Metadata.h:720
StringRef getString() const
Definition: Metadata.cpp:610
Machine Value Type.
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
instr_iterator instr_end()
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
iterator insertAfter(iterator I, MachineInstr *MI)
Insert MI into the instruction list after I.
bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
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 '...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasCalls() const
Return true if the current function has any function calls.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
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 WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setHasInlineAsm(bool B)
Set a flag that indicates that the function contains inline assembly.
void setWasmLandingPadIndex(const MachineBasicBlock *LPad, unsigned Index)
Map the landing pad to its index. Used for Wasm exception handling.
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.
bool hasInlineAsm() const
Returns true if the function contains any inline assembly.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
void finalizeDebugInstrRefs()
Finalise any partially emitted debug instructions.
void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef< unsigned > Sites)
Map the landing pad's EH symbol to the call site indexes.
void setUseDebugInstrRef(bool UseInstrRef)
Set whether this function will use instruction referencing or not.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
MCSymbol * addLandingPad(MachineBasicBlock *LandingPad)
Add a new panding pad, and extract the exception handling information from the landingpad instruction...
Function & getFunction()
Return the LLVM function that this machine code represents.
MachineModuleInfo & getMMI() const
bool shouldUseDebugInstrRef() const
Determine whether, in the current machine configuration, we should use instruction referencing or not...
const MachineFunctionProperties & getProperties() const
Get the function properties.
void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, int Slot, const DILocation *Loc)
Collect information used to emit debugging information of a variable in a stack slot.
const MachineBasicBlock & front() const
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
Definition: MachineInstr.h:69
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
Definition: MachineInstr.h:974
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:579
A description of a memory reference used in the backend.
This class contains meta information specific to a module.
const MCContext & getContext() const
bool usesMSVCFloatingPoint() const
void setUsesMSVCFloatingPoint(bool b)
Register getReg() const
getReg - Returns the register number.
MachinePassRegistry - Track the registration of machine passes.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
void EmitLiveInCopies(MachineBasicBlock *EntryMBB, const TargetRegisterInfo &TRI, const TargetInstrInfo &TII)
EmitLiveInCopies - Emit copies to initialize livein virtual registers into the given entry block.
ArrayRef< std::pair< MCRegister, Register > > liveins() const
iterator_range< use_instr_iterator > use_instructions(Register Reg) const
void addPhysRegsUsedFromRegMask(const uint32_t *RegMask)
addPhysRegsUsedFromRegMask - Mark any registers not in RegMask as used.
An SDNode that represents everything that will be needed to construct a MachineInstr.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
Definition: Module.cpp:333
This class is used by SelectionDAGISel to temporarily override the optimization level on a per-functi...
OptLevelChanger(SelectionDAGISel &ISel, CodeGenOptLevel NewOptLevel)
The optimization diagnostic interface.
void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for missed-optimization remarks.
An analysis over an "inner" IR unit that provides access to an analysis manager over a "outer" IR uni...
Definition: PassManager.h:688
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
AnalysisType * getAnalysisIfAvailable() const
getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information tha...
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:111
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:117
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
RegisterPassParser class - Handle the addition of new machine passes.
ScheduleDAGSDNodes *(*)(SelectionDAGISel *, CodeGenOptLevel) FunctionPassCtor
static MachinePassRegistry< FunctionPassCtor > Registry
RegisterScheduler class - Track the registration of instruction schedulers.
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
static unsigned virtReg2Index(Register Reg)
Convert a virtual register number to a 0-based index.
Definition: Register.h:77
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition: Register.h:91
static constexpr bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
Definition: Register.h:71
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
This class provides iterator support for SDUse operands that use a specific SDNode.
Represents one node in the SelectionDAG.
bool isMachineOpcode() const
Test if this node has a post-isel opcode, directly corresponding to a MachineInstr opcode.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
iterator_range< value_op_iterator > op_values() const
void setNodeId(int Id)
Set unique node id.
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
use_iterator use_begin() const
Provide iteration support to walk over all uses of an SDNode.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
static use_iterator use_end()
Represents a use of a SDNode.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
void copyToMachineFrameInfo(MachineFrameInfo &MFI) const
bool shouldEmitSDCheck(const BasicBlock &BB) const
ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs.
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
SelectionDAGISelLegacy(char &ID, std::unique_ptr< SelectionDAGISel > S)
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
SelectionDAGISel - This is the common base class used for SelectionDAG-based pattern-matching instruc...
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op, InlineAsm::ConstraintCode ConstraintID, std::vector< SDValue > &OutOps)
SelectInlineAsmMemoryOperand - Select the specified address as a target addressing mode,...
bool CheckOrMask(SDValue LHS, ConstantSDNode *RHS, int64_t DesiredMaskS) const
CheckOrMask - The isel is trying to match something like (or X, 255).
AssumptionCache * AC
void initializeAnalysisResults(MachineFunctionAnalysisManager &MFAM)
const TargetLowering * TLI
virtual void PostprocessISelDAG()
PostprocessISelDAG() - This hook allows the target to hack on the graph right after selection.
MachineFunction * MF
virtual bool CheckNodePredicate(SDNode *N, unsigned PredNo) const
CheckNodePredicate - This function is generated by tblgen in the target.
std::unique_ptr< OptimizationRemarkEmitter > ORE
Current optimization remark emitter.
MachineRegisterInfo * RegInfo
unsigned DAGSize
DAGSize - Size of DAG being instruction selected.
bool isOrEquivalentToAdd(const SDNode *N) const
virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N, unsigned PatternNo, SmallVectorImpl< std::pair< SDValue, SDNode * > > &Result)
virtual bool CheckPatternPredicate(unsigned PredNo) const
CheckPatternPredicate - This function is generated by tblgen in the target.
static int getNumFixedFromVariadicInfo(unsigned Flags)
getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the number of fixed arity values ...
const TargetLibraryInfo * LibInfo
static int getUninvalidatedNodeId(SDNode *N)
const TargetInstrInfo * TII
CodeGenOptLevel OptLevel
virtual bool CheckNodePredicateWithOperands(SDNode *N, unsigned PredNo, const SmallVectorImpl< SDValue > &Operands) const
CheckNodePredicateWithOperands - This function is generated by tblgen in the target.
GCFunctionInfo * GFI
void SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable, unsigned TableSize)
static void EnforceNodeIdInvariant(SDNode *N)
void ReplaceUses(SDValue F, SDValue T)
ReplaceUses - replace all uses of the old node F with the use of the new node T.
virtual bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const
IsProfitableToFold - Returns true if it's profitable to fold the specific operand node N of U during ...
virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo)
bool MatchFilterFuncName
True if the function currently processing is in the function printing list (i.e.
void SelectInlineAsmMemoryOperands(std::vector< SDValue > &Ops, const SDLoc &DL)
SelectInlineAsmMemoryOperands - Calls to this are automatically generated by tblgen.
static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root, CodeGenOptLevel OptLevel, bool IgnoreChains=false)
IsLegalToFold - Returns true if the specific operand node N of U can be folded during instruction sel...
virtual bool ComplexPatternFuncMutatesDAG() const
Return true if complex patterns for this target can mutate the DAG.
virtual void PreprocessISelDAG()
PreprocessISelDAG - This hook allows targets to hack on the graph before instruction selection starts...
bool CheckAndMask(SDValue LHS, ConstantSDNode *RHS, int64_t DesiredMaskS) const
CheckAndMask - The isel is trying to match something like (and X, 255).
SwiftErrorValueTracking * SwiftError
virtual StringRef getPatternForIndex(unsigned index)
getPatternForIndex - Patterns selected by tablegen during ISEL
bool mayRaiseFPException(SDNode *Node) const
Return whether the node may raise an FP exception.
std::unique_ptr< SelectionDAGBuilder > SDB
void ReplaceNode(SDNode *F, SDNode *T)
Replace all uses of F with T, then remove F from the DAG.
SelectionDAGISel(TargetMachine &tm, CodeGenOptLevel OL=CodeGenOptLevel::Default)
virtual bool runOnMachineFunction(MachineFunction &mf)
static void InvalidateNodeId(SDNode *N)
virtual StringRef getIncludePathForIndex(unsigned index)
getIncludePathForIndex - get the td source location of pattern instantiation
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:227
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
Definition: SelectionDAG.h:565
SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
bool LegalizeVectors()
This transforms the SelectionDAG into a SelectionDAG that only uses vector math operations supported ...
SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
void setFunctionLoweringInfo(FunctionLoweringInfo *FuncInfo)
Definition: SelectionDAG.h:473
SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
bool NewNodesMustHaveLegalTypes
When true, additional steps are taken to ensure that getConstant() and similar functions return DAG n...
Definition: SelectionDAG.h:390
void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
allnodes_const_iterator allnodes_begin() const
Definition: SelectionDAG.h:545
void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:486
void viewGraph(const std::string &Title)
Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
void Legalize()
This transforms the SelectionDAG into a SelectionDAG that is compatible with the target instruction s...
void Combine(CombineLevel Level, AAResults *AA, CodeGenOptLevel OptLevel)
This iterates over the nodes in the SelectionDAG, folding certain types of nodes together,...
void clear()
Clear state and free memory necessary to make this SelectionDAG ready to process a new block.
SDValue getRegister(unsigned Reg, EVT VT)
void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, Pass *PassPtr, const TargetLibraryInfo *LibraryInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
void RemoveDeadNodes()
This method deletes all unreachable nodes in the SelectionDAG.
void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, unsigned Reg, SDValue N)
Definition: SelectionDAG.h:785
SDValue getTargetConstantFP(double Val, const SDLoc &DL, EVT VT)
Definition: SelectionDAG.h:720
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
Definition: SelectionDAG.h:688
unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
MachineFunction & getMachineFunction() const
Definition: SelectionDAG.h:481
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, unsigned Reg, EVT VT)
Definition: SelectionDAG.h:811
const FunctionVarLocs * getFunctionVarLocs() const
Returns the result of the AssignmentTrackingAnalysis pass if it's available, otherwise return nullptr...
Definition: SelectionDAG.h:498
KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
Definition: SelectionDAG.h:574
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
Definition: SelectionDAG.h:568
ilist< SDNode >::iterator allnodes_iterator
Definition: SelectionDAG.h:548
bool LegalizeTypes()
This transforms the SelectionDAG into a SelectionDAG that only uses types natively supported by the t...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:344
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:479
bool empty() const
Definition: SmallVector.h:94
size_t size() const
Definition: SmallVector.h:91
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:696
void resize(size_type N)
Definition: SmallVector.h:651
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition: StringRef.h:131
bool createEntriesInEntryBlock(DebugLoc DbgLoc)
Create initial definitions of swifterror values in the entry block of the current function.
void setFunction(MachineFunction &MF)
Initialize data structures for specified new function.
void preassignVRegs(MachineBasicBlock *MBB, BasicBlock::const_iterator Begin, BasicBlock::const_iterator End)
void propagateVRegs()
Propagate assigned swifterror vregs through a function, synthesizing PHI nodes when needed to maintai...
Analysis pass providing the TargetTransformInfo.
TargetIntrinsicInfo - Interface to description of machine instruction set.
Analysis pass providing the TargetLibraryInfo.
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual Function * getSSPStackGuardCheck(const Module &M) const
If the target has a standard stack protection check function that performs validation and error handl...
Sched::Preference getSchedulingPreference() const
Return target scheduling preference.
bool isStrictFPEnabled() const
Return true if the target support strict float operation.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
LegalizeAction getOperationAction(unsigned Op, EVT VT) const
Return how this operation should be treated: either it is legal, needs to be promoted to a larger siz...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual Register getRegisterByName(const char *RegName, LLT Ty, const MachineFunction &MF) const
Return the register ID of the name passed in.
virtual void insertCopiesSplitCSR(MachineBasicBlock *Entry, const SmallVectorImpl< MachineBasicBlock * > &Exits) const
Insert explicit copies in entry and exit blocks.
virtual void AdjustInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const
This method should be implemented by targets that mark instructions with the 'hasPostISelHook' flag.
virtual void initializeSplitCSR(MachineBasicBlock *Entry) const
Perform necessary initialization to handle a subset of CSRs explicitly via copies.
virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
virtual FastISel * createFastISel(FunctionLoweringInfo &, const TargetLibraryInfo *) const
This method returns a target specific FastISel object, or null if the target does not support "fast" ...
virtual bool supportSplitCSR(MachineFunction *MF) const
Return true if the target supports that a subset of CSRs for the given machine function is handled ex...
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:77
virtual const TargetIntrinsicInfo * getIntrinsicInfo() const
If intrinsic information is available, return it. If not, return null.
const Triple & getTargetTriple() const
void setFastISel(bool Enable)
TargetOptions Options
void setOptLevel(CodeGenOptLevel Level)
Overrides the optimization level.
unsigned EnableFastISel
EnableFastISel - This flag enables fast-path instruction selection which trades away generated code q...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetLowering * getTargetLowering() const
Wrapper pass for TargetTransformInfo.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
bool hasBranchDivergence(const Function *F=nullptr) const
Return true if branch divergence exists.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
bool isTokenTy() const
Return true if this is 'token'.
Definition: Type.h:225
bool isVoidTy() const
Return true if this is 'void'.
Definition: Type.h:140
Analysis pass which computes UniformityInfo.
Legacy analysis pass which computes a CycleInfo.
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
User * getUser() const
Returns the User that contains this Use.
Definition: Use.h:72
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition: Value.h:434
iterator_range< user_iterator > users()
Definition: Value.h:421
bool use_empty() const
Definition: Value.h:344
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
self_iterator getIterator()
Definition: ilist_node.h:132
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:661
#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
bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
@ TargetConstantPool
Definition: ISDOpcodes.h:174
@ CONVERGENCECTRL_ANCHOR
Definition: ISDOpcodes.h:1431
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
Definition: ISDOpcodes.h:1212
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition: ISDOpcodes.h:490
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition: ISDOpcodes.h:44
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
Definition: ISDOpcodes.h:1101
@ TargetBlockAddress
Definition: ISDOpcodes.h:176
@ ConstantFP
Definition: ISDOpcodes.h:77
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition: ISDOpcodes.h:205
@ MEMBARRIER
MEMBARRIER - Compiler barrier only; generate a no-op.
Definition: ISDOpcodes.h:1269
@ STRICT_FSETCCS
Definition: ISDOpcodes.h:491
@ FrameIndex
Definition: ISDOpcodes.h:80
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
Definition: ISDOpcodes.h:1143
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
Definition: ISDOpcodes.h:1149
@ STRICT_UINT_TO_FP
Definition: ISDOpcodes.h:464
@ TargetExternalSymbol
Definition: ISDOpcodes.h:175
@ CONVERGENCECTRL_ENTRY
Definition: ISDOpcodes.h:1432
@ TargetJumpTable
Definition: ISDOpcodes.h:173
@ WRITE_REGISTER
Definition: ISDOpcodes.h:125
@ STRICT_LROUND
Definition: ISDOpcodes.h:445
@ UNDEF
UNDEF - An undefined node.
Definition: ISDOpcodes.h:218
@ RegisterMask
Definition: ISDOpcodes.h:75
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition: ISDOpcodes.h:68
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:71
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition: ISDOpcodes.h:215
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition: ISDOpcodes.h:170
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
Definition: ISDOpcodes.h:1266
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition: ISDOpcodes.h:47
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
Definition: ISDOpcodes.h:124
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition: ISDOpcodes.h:209
@ TargetConstantFP
Definition: ISDOpcodes.h:165
@ STRICT_LRINT
Definition: ISDOpcodes.h:447
@ TargetFrameIndex
Definition: ISDOpcodes.h:172
@ LIFETIME_START
This corresponds to the llvm.lifetime.
Definition: ISDOpcodes.h:1345
@ STRICT_SINT_TO_FP
STRICT_[US]INT_TO_FP - Convert a signed or unsigned integer to a floating point value.
Definition: ISDOpcodes.h:463
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
Definition: ISDOpcodes.h:1232
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
Definition: ISDOpcodes.h:1138
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition: ISDOpcodes.h:164
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition: ISDOpcodes.h:708
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition: ISDOpcodes.h:190
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
Definition: ISDOpcodes.h:1365
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition: ISDOpcodes.h:52
@ STRICT_LLRINT
Definition: ISDOpcodes.h:448
@ STRICT_LLROUND
Definition: ISDOpcodes.h:446
@ CONVERGENCECTRL_LOOP
Definition: ISDOpcodes.h:1433
@ INLINEASM
INLINEASM - Represents an inline asm block.
Definition: ISDOpcodes.h:1135
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition: ISDOpcodes.h:61
@ AssertZext
Definition: ISDOpcodes.h:62
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition: ISDOpcodes.h:198
@ TargetGlobalTLSAddress
Definition: ISDOpcodes.h:171
bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
Definition: ISDOpcodes.h:1574
StringRef getBaseName(ID id)
Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....
Definition: Function.cpp:1066
@ Kill
The last use of a register.
Reg
All possible values of the reg field in the ModR/M byte.
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
DiagnosticInfoOptimizationBase::Argument NV
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
ScheduleDAGSDNodes * createDefaultScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createDefaultScheduler - This creates an instruction scheduler appropriate for the target.
@ Offset
Definition: DWP.cpp:480
bool succ_empty(const Instruction *I)
Definition: CFG.h:255
ScheduleDAGSDNodes * createBURRListDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createBURRListDAGScheduler - This creates a bottom up register usage reduction list scheduler.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
ScheduleDAGSDNodes * createHybridListDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel)
createHybridListDAGScheduler - This creates a bottom up register pressure aware list scheduler that m...
MachineBasicBlock::iterator findSplitPointForStackProtector(MachineBasicBlock *BB, const TargetInstrInfo &TII)
Find the split point at which to splice the end of BB into its success stack protector check machine ...
bool TimePassesIsEnabled
If the user specifies the -time-passes argument on an LLVM tool command line then the value of this b...
LLT getLLTForMVT(MVT Ty)
Get a rough equivalent of an LLT for a given MVT.
void initializeBranchProbabilityInfoWrapperPassPass(PassRegistry &)
ScheduleDAGSDNodes * createFastDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createFastDAGScheduler - This creates a "fast" scheduler.
PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition: STLExtras.h:2059
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:1729
ScheduleDAGSDNodes * createDAGLinearizer(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createDAGLinearizer - This creates a "no-scheduling" scheduler which linearize the DAG using topologi...
void initializeAAResultsWrapperPassPass(PassRegistry &)
void initializeGCModuleInfoPass(PassRegistry &)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
bool isFunctionInPrintList(StringRef FunctionName)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
@ AfterLegalizeDAG
Definition: DAGCombine.h:19
@ AfterLegalizeVectorOps
Definition: DAGCombine.h:18
@ BeforeLegalizeTypes
Definition: DAGCombine.h:16
@ AfterLegalizeTypes
Definition: DAGCombine.h:17
ScheduleDAGSDNodes * createSourceListDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createSourceListDAGScheduler - This creates a bottom up list scheduler that schedules nodes in source...
bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
Definition: DebugInfo.cpp:2242
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1849
ScheduleDAGSDNodes * createILPListDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel)
createILPListDAGScheduler - This creates a bottom up register pressure aware list scheduler that trie...
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1879
void initializeTargetLibraryInfoWrapperPassPass(PassRegistry &)
ScheduleDAGSDNodes * createVLIWDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createVLIWDAGScheduler - Scheduler for VLIW targets.
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
Extended Value Type.
Definition: ValueTypes.h:34
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition: ValueTypes.h:136
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition: ValueTypes.h:358
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition: ValueTypes.h:306
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition: ValueTypes.h:151
This class is basically a combination of TimeRegion and Timer.
Definition: Timer.h:163
These are IR-level optimization flags that may be propagated to SDNodes.
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
Definition: SelectionDAG.h:310
void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, MCSymbol *InvokeEnd)
DenseMap< const BasicBlock *, int > BlockToStateMap
Definition: WinEHFuncInfo.h:95