[llvm-shlib] Fix the version naming style of libLLVM for Windows (#85710)
[llvm-project.git] / llvm / utils / TableGen / GlobalISelEmitter.cpp
blob39dece85f7c73e44780415b7112ea12b00279e04
1 //===- GlobalISelEmitter.cpp - Generate an instruction selector -----------===//
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 /// \file
10 /// This tablegen backend emits code for use by the GlobalISel instruction
11 /// selector. See include/llvm/Target/GlobalISel/Target.td.
12 ///
13 /// This file analyzes the patterns recognized by the SelectionDAGISel tablegen
14 /// backend, filters out the ones that are unsupported, maps
15 /// SelectionDAG-specific constructs to their GlobalISel counterpart
16 /// (when applicable: MVT to LLT; SDNode to generic Instruction).
17 ///
18 /// Not all patterns are supported: pass the tablegen invocation
19 /// "-warn-on-skipped-patterns" to emit a warning when a pattern is skipped,
20 /// as well as why.
21 ///
22 /// The generated file defines a single method:
23 /// bool <Target>InstructionSelector::selectImpl(MachineInstr &I) const;
24 /// intended to be used in InstructionSelector::select as the first-step
25 /// selector for the patterns that don't require complex C++.
26 ///
27 /// FIXME: We'll probably want to eventually define a base
28 /// "TargetGenInstructionSelector" class.
29 ///
30 //===----------------------------------------------------------------------===//
32 #include "CodeGenDAGPatterns.h"
33 #include "CodeGenInstruction.h"
34 #include "CodeGenIntrinsics.h"
35 #include "CodeGenRegisters.h"
36 #include "CodeGenTarget.h"
37 #include "GlobalISelMatchTable.h"
38 #include "GlobalISelMatchTableExecutorEmitter.h"
39 #include "InfoByHwMode.h"
40 #include "SubtargetFeatureInfo.h"
41 #include "llvm/ADT/Statistic.h"
42 #include "llvm/CodeGen/LowLevelType.h"
43 #include "llvm/CodeGen/MachineValueType.h"
44 #include "llvm/Support/CodeGenCoverage.h"
45 #include "llvm/Support/CommandLine.h"
46 #include "llvm/Support/Error.h"
47 #include "llvm/Support/SaveAndRestore.h"
48 #include "llvm/Support/ScopedPrinter.h"
49 #include "llvm/TableGen/Error.h"
50 #include "llvm/TableGen/Record.h"
51 #include "llvm/TableGen/TableGenBackend.h"
52 #include <numeric>
53 #include <string>
55 using namespace llvm;
56 using namespace llvm::gi;
58 using action_iterator = RuleMatcher::action_iterator;
60 #define DEBUG_TYPE "gisel-emitter"
62 STATISTIC(NumPatternTotal, "Total number of patterns");
63 STATISTIC(NumPatternImported, "Number of patterns imported from SelectionDAG");
64 STATISTIC(NumPatternImportsSkipped, "Number of SelectionDAG imports skipped");
65 STATISTIC(NumPatternsTested,
66 "Number of patterns executed according to coverage information");
68 cl::OptionCategory GlobalISelEmitterCat("Options for -gen-global-isel");
70 static cl::opt<bool> WarnOnSkippedPatterns(
71 "warn-on-skipped-patterns",
72 cl::desc("Explain why a pattern was skipped for inclusion "
73 "in the GlobalISel selector"),
74 cl::init(false), cl::cat(GlobalISelEmitterCat));
76 static cl::opt<bool> GenerateCoverage(
77 "instrument-gisel-coverage",
78 cl::desc("Generate coverage instrumentation for GlobalISel"),
79 cl::init(false), cl::cat(GlobalISelEmitterCat));
81 static cl::opt<std::string> UseCoverageFile(
82 "gisel-coverage-file", cl::init(""),
83 cl::desc("Specify file to retrieve coverage information from"),
84 cl::cat(GlobalISelEmitterCat));
86 static cl::opt<bool> OptimizeMatchTable(
87 "optimize-match-table",
88 cl::desc("Generate an optimized version of the match table"),
89 cl::init(true), cl::cat(GlobalISelEmitterCat));
91 namespace {
93 static std::string explainPredicates(const TreePatternNode *N) {
94 std::string Explanation;
95 StringRef Separator = "";
96 for (const TreePredicateCall &Call : N->getPredicateCalls()) {
97 const TreePredicateFn &P = Call.Fn;
98 Explanation +=
99 (Separator + P.getOrigPatFragRecord()->getRecord()->getName()).str();
100 Separator = ", ";
102 if (P.isAlwaysTrue())
103 Explanation += " always-true";
104 if (P.isImmediatePattern())
105 Explanation += " immediate";
107 if (P.isUnindexed())
108 Explanation += " unindexed";
110 if (P.isNonExtLoad())
111 Explanation += " non-extload";
112 if (P.isAnyExtLoad())
113 Explanation += " extload";
114 if (P.isSignExtLoad())
115 Explanation += " sextload";
116 if (P.isZeroExtLoad())
117 Explanation += " zextload";
119 if (P.isNonTruncStore())
120 Explanation += " non-truncstore";
121 if (P.isTruncStore())
122 Explanation += " truncstore";
124 if (Record *VT = P.getMemoryVT())
125 Explanation += (" MemVT=" + VT->getName()).str();
126 if (Record *VT = P.getScalarMemoryVT())
127 Explanation += (" ScalarVT(MemVT)=" + VT->getName()).str();
129 if (ListInit *AddrSpaces = P.getAddressSpaces()) {
130 raw_string_ostream OS(Explanation);
131 OS << " AddressSpaces=[";
133 StringRef AddrSpaceSeparator;
134 for (Init *Val : AddrSpaces->getValues()) {
135 IntInit *IntVal = dyn_cast<IntInit>(Val);
136 if (!IntVal)
137 continue;
139 OS << AddrSpaceSeparator << IntVal->getValue();
140 AddrSpaceSeparator = ", ";
143 OS << ']';
146 int64_t MinAlign = P.getMinAlignment();
147 if (MinAlign > 0)
148 Explanation += " MinAlign=" + utostr(MinAlign);
150 if (P.isAtomicOrderingMonotonic())
151 Explanation += " monotonic";
152 if (P.isAtomicOrderingAcquire())
153 Explanation += " acquire";
154 if (P.isAtomicOrderingRelease())
155 Explanation += " release";
156 if (P.isAtomicOrderingAcquireRelease())
157 Explanation += " acq_rel";
158 if (P.isAtomicOrderingSequentiallyConsistent())
159 Explanation += " seq_cst";
160 if (P.isAtomicOrderingAcquireOrStronger())
161 Explanation += " >=acquire";
162 if (P.isAtomicOrderingWeakerThanAcquire())
163 Explanation += " <acquire";
164 if (P.isAtomicOrderingReleaseOrStronger())
165 Explanation += " >=release";
166 if (P.isAtomicOrderingWeakerThanRelease())
167 Explanation += " <release";
169 return Explanation;
172 std::string explainOperator(Record *Operator) {
173 if (Operator->isSubClassOf("SDNode"))
174 return (" (" + Operator->getValueAsString("Opcode") + ")").str();
176 if (Operator->isSubClassOf("Intrinsic"))
177 return (" (Operator is an Intrinsic, " + Operator->getName() + ")").str();
179 if (Operator->isSubClassOf("ComplexPattern"))
180 return (" (Operator is an unmapped ComplexPattern, " + Operator->getName() +
181 ")")
182 .str();
184 if (Operator->isSubClassOf("SDNodeXForm"))
185 return (" (Operator is an unmapped SDNodeXForm, " + Operator->getName() +
186 ")")
187 .str();
189 return (" (Operator " + Operator->getName() + " not understood)").str();
192 /// Helper function to let the emitter report skip reason error messages.
193 static Error failedImport(const Twine &Reason) {
194 return make_error<StringError>(Reason, inconvertibleErrorCode());
197 static Error isTrivialOperatorNode(const TreePatternNode *N) {
198 std::string Explanation;
199 std::string Separator;
201 bool HasUnsupportedPredicate = false;
202 for (const TreePredicateCall &Call : N->getPredicateCalls()) {
203 const TreePredicateFn &Predicate = Call.Fn;
205 if (Predicate.isAlwaysTrue())
206 continue;
208 if (Predicate.isImmediatePattern())
209 continue;
211 if (Predicate.hasNoUse())
212 continue;
214 if (Predicate.isNonExtLoad() || Predicate.isAnyExtLoad() ||
215 Predicate.isSignExtLoad() || Predicate.isZeroExtLoad())
216 continue;
218 if (Predicate.isNonTruncStore() || Predicate.isTruncStore())
219 continue;
221 if (Predicate.isLoad() && Predicate.getMemoryVT())
222 continue;
224 if (Predicate.isLoad() || Predicate.isStore()) {
225 if (Predicate.isUnindexed())
226 continue;
229 if (Predicate.isLoad() || Predicate.isStore() || Predicate.isAtomic()) {
230 const ListInit *AddrSpaces = Predicate.getAddressSpaces();
231 if (AddrSpaces && !AddrSpaces->empty())
232 continue;
234 if (Predicate.getMinAlignment() > 0)
235 continue;
238 if (Predicate.isAtomic() && Predicate.getMemoryVT())
239 continue;
241 if (Predicate.isAtomic() &&
242 (Predicate.isAtomicOrderingMonotonic() ||
243 Predicate.isAtomicOrderingAcquire() ||
244 Predicate.isAtomicOrderingRelease() ||
245 Predicate.isAtomicOrderingAcquireRelease() ||
246 Predicate.isAtomicOrderingSequentiallyConsistent() ||
247 Predicate.isAtomicOrderingAcquireOrStronger() ||
248 Predicate.isAtomicOrderingWeakerThanAcquire() ||
249 Predicate.isAtomicOrderingReleaseOrStronger() ||
250 Predicate.isAtomicOrderingWeakerThanRelease()))
251 continue;
253 if (Predicate.hasGISelPredicateCode())
254 continue;
256 HasUnsupportedPredicate = true;
257 Explanation = Separator + "Has a predicate (" + explainPredicates(N) + ")";
258 Separator = ", ";
259 Explanation += (Separator + "first-failing:" +
260 Predicate.getOrigPatFragRecord()->getRecord()->getName())
261 .str();
262 break;
265 if (!HasUnsupportedPredicate)
266 return Error::success();
268 return failedImport(Explanation);
271 static Record *getInitValueAsRegClass(Init *V) {
272 if (DefInit *VDefInit = dyn_cast<DefInit>(V)) {
273 if (VDefInit->getDef()->isSubClassOf("RegisterOperand"))
274 return VDefInit->getDef()->getValueAsDef("RegClass");
275 if (VDefInit->getDef()->isSubClassOf("RegisterClass"))
276 return VDefInit->getDef();
278 return nullptr;
281 static std::string getScopedName(unsigned Scope, const std::string &Name) {
282 return ("pred:" + Twine(Scope) + ":" + Name).str();
285 static std::string getMangledRootDefName(StringRef DefOperandName) {
286 return ("DstI[" + DefOperandName + "]").str();
289 //===- GlobalISelEmitter class --------------------------------------------===//
291 static Expected<LLTCodeGen> getInstResultType(const TreePatternNode *Dst) {
292 ArrayRef<TypeSetByHwMode> ChildTypes = Dst->getExtTypes();
293 if (ChildTypes.size() != 1)
294 return failedImport("Dst pattern child has multiple results");
296 std::optional<LLTCodeGen> MaybeOpTy;
297 if (ChildTypes.front().isMachineValueType()) {
298 MaybeOpTy = MVTToLLT(ChildTypes.front().getMachineValueType().SimpleTy);
301 if (!MaybeOpTy)
302 return failedImport("Dst operand has an unsupported type");
303 return *MaybeOpTy;
306 class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
307 public:
308 explicit GlobalISelEmitter(RecordKeeper &RK);
310 void emitAdditionalImpl(raw_ostream &OS) override;
312 void emitMIPredicateFns(raw_ostream &OS) override;
313 void emitI64ImmPredicateFns(raw_ostream &OS) override;
314 void emitAPFloatImmPredicateFns(raw_ostream &OS) override;
315 void emitAPIntImmPredicateFns(raw_ostream &OS) override;
316 void emitTestSimplePredicate(raw_ostream &OS) override;
317 void emitRunCustomAction(raw_ostream &OS) override;
319 void postProcessRule(RuleMatcher &M);
321 const CodeGenTarget &getTarget() const override { return Target; }
322 StringRef getClassName() const override { return ClassName; }
324 void run(raw_ostream &OS);
326 private:
327 std::string ClassName;
329 const RecordKeeper &RK;
330 const CodeGenDAGPatterns CGP;
331 const CodeGenTarget &Target;
332 CodeGenRegBank &CGRegs;
334 std::vector<Record *> AllPatFrags;
336 /// Keep track of the equivalence between SDNodes and Instruction by mapping
337 /// SDNodes to the GINodeEquiv mapping. We need to map to the GINodeEquiv to
338 /// check for attributes on the relation such as CheckMMOIsNonAtomic.
339 /// This is defined using 'GINodeEquiv' in the target description.
340 DenseMap<Record *, Record *> NodeEquivs;
342 /// Keep track of the equivalence between ComplexPattern's and
343 /// GIComplexOperandMatcher. Map entries are specified by subclassing
344 /// GIComplexPatternEquiv.
345 DenseMap<const Record *, const Record *> ComplexPatternEquivs;
347 /// Keep track of the equivalence between SDNodeXForm's and
348 /// GICustomOperandRenderer. Map entries are specified by subclassing
349 /// GISDNodeXFormEquiv.
350 DenseMap<const Record *, const Record *> SDNodeXFormEquivs;
352 /// Keep track of Scores of PatternsToMatch similar to how the DAG does.
353 /// This adds compatibility for RuleMatchers to use this for ordering rules.
354 DenseMap<uint64_t, int> RuleMatcherScores;
356 // Rule coverage information.
357 std::optional<CodeGenCoverage> RuleCoverage;
359 /// Variables used to help with collecting of named operands for predicates
360 /// with 'let PredicateCodeUsesOperands = 1'. WaitingForNamedOperands is set
361 /// to the number of named operands that predicate expects. Store locations in
362 /// StoreIdxForName correspond to the order in which operand names appear in
363 /// predicate's argument list.
364 /// When we visit named operand and WaitingForNamedOperands is not zero, add
365 /// matcher that will record operand and decrease counter.
366 unsigned WaitingForNamedOperands = 0;
367 StringMap<unsigned> StoreIdxForName;
369 void gatherOpcodeValues();
370 void gatherTypeIDValues();
371 void gatherNodeEquivs();
373 Record *findNodeEquiv(Record *N) const;
374 const CodeGenInstruction *getEquivNode(Record &Equiv,
375 const TreePatternNode *N) const;
377 Error importRulePredicates(RuleMatcher &M, ArrayRef<Record *> Predicates);
378 Expected<InstructionMatcher &>
379 createAndImportSelDAGMatcher(RuleMatcher &Rule,
380 InstructionMatcher &InsnMatcher,
381 const TreePatternNode *Src, unsigned &TempOpIdx);
382 Error importComplexPatternOperandMatcher(OperandMatcher &OM, Record *R,
383 unsigned &TempOpIdx) const;
384 Error importChildMatcher(RuleMatcher &Rule, InstructionMatcher &InsnMatcher,
385 const TreePatternNode *SrcChild,
386 bool OperandIsAPointer, bool OperandIsImmArg,
387 unsigned OpIdx, unsigned &TempOpIdx);
389 Expected<BuildMIAction &> createAndImportInstructionRenderer(
390 RuleMatcher &M, InstructionMatcher &InsnMatcher,
391 const TreePatternNode *Src, const TreePatternNode *Dst);
392 Expected<action_iterator> createAndImportSubInstructionRenderer(
393 action_iterator InsertPt, RuleMatcher &M, const TreePatternNode *Dst,
394 const TreePatternNode *Src, unsigned TempReg);
395 Expected<action_iterator>
396 createInstructionRenderer(action_iterator InsertPt, RuleMatcher &M,
397 const TreePatternNode *Dst);
399 Expected<action_iterator> importExplicitDefRenderers(
400 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
401 const TreePatternNode *Src, const TreePatternNode *Dst);
403 Expected<action_iterator> importExplicitUseRenderers(
404 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
405 const llvm::TreePatternNode *Dst, const TreePatternNode *Src);
406 Expected<action_iterator> importExplicitUseRenderer(
407 action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
408 const TreePatternNode *DstChild, const TreePatternNode *Src);
409 Error importDefaultOperandRenderers(action_iterator InsertPt, RuleMatcher &M,
410 BuildMIAction &DstMIBuilder,
411 const DAGDefaultOperand &DefaultOp) const;
412 Error
413 importImplicitDefRenderers(BuildMIAction &DstMIBuilder,
414 const std::vector<Record *> &ImplicitDefs) const;
416 /// Analyze pattern \p P, returning a matcher for it if possible.
417 /// Otherwise, return an Error explaining why we don't support it.
418 Expected<RuleMatcher> runOnPattern(const PatternToMatch &P);
420 void declareSubtargetFeature(Record *Predicate);
422 unsigned declareHwModeCheck(StringRef HwModeFeatures);
424 MatchTable buildMatchTable(MutableArrayRef<RuleMatcher> Rules, bool Optimize,
425 bool WithCoverage);
427 /// Infer a CodeGenRegisterClass for the type of \p SuperRegNode. The returned
428 /// CodeGenRegisterClass will support the CodeGenRegisterClass of
429 /// \p SubRegNode, and the subregister index defined by \p SubRegIdxNode.
430 /// If no register class is found, return std::nullopt.
431 std::optional<const CodeGenRegisterClass *>
432 inferSuperRegisterClassForNode(const TypeSetByHwMode &Ty,
433 const TreePatternNode *SuperRegNode,
434 const TreePatternNode *SubRegIdxNode);
435 std::optional<CodeGenSubRegIndex *>
436 inferSubRegIndexForNode(const TreePatternNode *SubRegIdxNode);
438 /// Infer a CodeGenRegisterClass which suppoorts \p Ty and \p SubRegIdxNode.
439 /// Return std::nullopt if no such class exists.
440 std::optional<const CodeGenRegisterClass *>
441 inferSuperRegisterClass(const TypeSetByHwMode &Ty,
442 const TreePatternNode *SubRegIdxNode);
444 /// Return the CodeGenRegisterClass associated with \p Leaf if it has one.
445 std::optional<const CodeGenRegisterClass *>
446 getRegClassFromLeaf(const TreePatternNode *Leaf);
448 /// Return a CodeGenRegisterClass for \p N if one can be found. Return
449 /// std::nullopt otherwise.
450 std::optional<const CodeGenRegisterClass *>
451 inferRegClassFromPattern(const TreePatternNode *N);
453 /// Return the size of the MemoryVT in this predicate, if possible.
454 std::optional<unsigned>
455 getMemSizeBitsFromPredicate(const TreePredicateFn &Predicate);
457 // Add builtin predicates.
458 Expected<InstructionMatcher &>
459 addBuiltinPredicates(const Record *SrcGIEquivOrNull,
460 const TreePredicateFn &Predicate,
461 InstructionMatcher &InsnMatcher, bool &HasAddedMatcher);
464 StringRef getPatFragPredicateEnumName(Record *R) { return R->getName(); }
466 void GlobalISelEmitter::gatherOpcodeValues() {
467 InstructionOpcodeMatcher::initOpcodeValuesMap(Target);
470 void GlobalISelEmitter::gatherTypeIDValues() {
471 LLTOperandMatcher::initTypeIDValuesMap();
474 void GlobalISelEmitter::gatherNodeEquivs() {
475 assert(NodeEquivs.empty());
476 for (Record *Equiv : RK.getAllDerivedDefinitions("GINodeEquiv"))
477 NodeEquivs[Equiv->getValueAsDef("Node")] = Equiv;
479 assert(ComplexPatternEquivs.empty());
480 for (Record *Equiv : RK.getAllDerivedDefinitions("GIComplexPatternEquiv")) {
481 Record *SelDAGEquiv = Equiv->getValueAsDef("SelDAGEquivalent");
482 if (!SelDAGEquiv)
483 continue;
484 ComplexPatternEquivs[SelDAGEquiv] = Equiv;
487 assert(SDNodeXFormEquivs.empty());
488 for (Record *Equiv : RK.getAllDerivedDefinitions("GISDNodeXFormEquiv")) {
489 Record *SelDAGEquiv = Equiv->getValueAsDef("SelDAGEquivalent");
490 if (!SelDAGEquiv)
491 continue;
492 SDNodeXFormEquivs[SelDAGEquiv] = Equiv;
496 Record *GlobalISelEmitter::findNodeEquiv(Record *N) const {
497 return NodeEquivs.lookup(N);
500 const CodeGenInstruction *
501 GlobalISelEmitter::getEquivNode(Record &Equiv, const TreePatternNode *N) const {
502 if (N->getNumChildren() >= 1) {
503 // setcc operation maps to two different G_* instructions based on the type.
504 if (!Equiv.isValueUnset("IfFloatingPoint") &&
505 MVT(N->getChild(0)->getSimpleType(0)).isFloatingPoint())
506 return &Target.getInstruction(Equiv.getValueAsDef("IfFloatingPoint"));
509 if (!Equiv.isValueUnset("IfConvergent") &&
510 N->getIntrinsicInfo(CGP)->isConvergent)
511 return &Target.getInstruction(Equiv.getValueAsDef("IfConvergent"));
513 for (const TreePredicateCall &Call : N->getPredicateCalls()) {
514 const TreePredicateFn &Predicate = Call.Fn;
515 if (!Equiv.isValueUnset("IfSignExtend") &&
516 (Predicate.isLoad() || Predicate.isAtomic()) &&
517 Predicate.isSignExtLoad())
518 return &Target.getInstruction(Equiv.getValueAsDef("IfSignExtend"));
519 if (!Equiv.isValueUnset("IfZeroExtend") &&
520 (Predicate.isLoad() || Predicate.isAtomic()) &&
521 Predicate.isZeroExtLoad())
522 return &Target.getInstruction(Equiv.getValueAsDef("IfZeroExtend"));
525 return &Target.getInstruction(Equiv.getValueAsDef("I"));
528 GlobalISelEmitter::GlobalISelEmitter(RecordKeeper &RK)
529 : GlobalISelMatchTableExecutorEmitter(), RK(RK), CGP(RK),
530 Target(CGP.getTargetInfo()), CGRegs(Target.getRegBank()) {
531 ClassName = Target.getName().str() + "InstructionSelector";
534 //===- Emitter ------------------------------------------------------------===//
536 Error GlobalISelEmitter::importRulePredicates(RuleMatcher &M,
537 ArrayRef<Record *> Predicates) {
538 for (Record *Pred : Predicates) {
539 if (Pred->getValueAsString("CondString").empty())
540 continue;
541 declareSubtargetFeature(Pred);
542 M.addRequiredFeature(Pred);
545 return Error::success();
548 std::optional<unsigned> GlobalISelEmitter::getMemSizeBitsFromPredicate(
549 const TreePredicateFn &Predicate) {
550 std::optional<LLTCodeGen> MemTyOrNone =
551 MVTToLLT(getValueType(Predicate.getMemoryVT()));
553 if (!MemTyOrNone)
554 return std::nullopt;
556 // Align so unusual types like i1 don't get rounded down.
557 return llvm::alignTo(
558 static_cast<unsigned>(MemTyOrNone->get().getSizeInBits()), 8);
561 Expected<InstructionMatcher &> GlobalISelEmitter::addBuiltinPredicates(
562 const Record *SrcGIEquivOrNull, const TreePredicateFn &Predicate,
563 InstructionMatcher &InsnMatcher, bool &HasAddedMatcher) {
564 if (Predicate.isLoad() || Predicate.isStore() || Predicate.isAtomic()) {
565 if (const ListInit *AddrSpaces = Predicate.getAddressSpaces()) {
566 SmallVector<unsigned, 4> ParsedAddrSpaces;
568 for (Init *Val : AddrSpaces->getValues()) {
569 IntInit *IntVal = dyn_cast<IntInit>(Val);
570 if (!IntVal)
571 return failedImport("Address space is not an integer");
572 ParsedAddrSpaces.push_back(IntVal->getValue());
575 if (!ParsedAddrSpaces.empty()) {
576 InsnMatcher.addPredicate<MemoryAddressSpacePredicateMatcher>(
577 0, ParsedAddrSpaces);
578 return InsnMatcher;
582 int64_t MinAlign = Predicate.getMinAlignment();
583 if (MinAlign > 0) {
584 InsnMatcher.addPredicate<MemoryAlignmentPredicateMatcher>(0, MinAlign);
585 return InsnMatcher;
589 // G_LOAD is used for both non-extending and any-extending loads.
590 if (Predicate.isLoad() && Predicate.isNonExtLoad()) {
591 InsnMatcher.addPredicate<MemoryVsLLTSizePredicateMatcher>(
592 0, MemoryVsLLTSizePredicateMatcher::EqualTo, 0);
593 return InsnMatcher;
595 if (Predicate.isLoad() && Predicate.isAnyExtLoad()) {
596 InsnMatcher.addPredicate<MemoryVsLLTSizePredicateMatcher>(
597 0, MemoryVsLLTSizePredicateMatcher::LessThan, 0);
598 return InsnMatcher;
601 if (Predicate.isStore()) {
602 if (Predicate.isTruncStore()) {
603 if (Predicate.getMemoryVT() != nullptr) {
604 // FIXME: If MemoryVT is set, we end up with 2 checks for the MMO size.
605 auto MemSizeInBits = getMemSizeBitsFromPredicate(Predicate);
606 if (!MemSizeInBits)
607 return failedImport("MemVT could not be converted to LLT");
609 InsnMatcher.addPredicate<MemorySizePredicateMatcher>(0, *MemSizeInBits /
611 } else {
612 InsnMatcher.addPredicate<MemoryVsLLTSizePredicateMatcher>(
613 0, MemoryVsLLTSizePredicateMatcher::LessThan, 0);
615 return InsnMatcher;
617 if (Predicate.isNonTruncStore()) {
618 // We need to check the sizes match here otherwise we could incorrectly
619 // match truncating stores with non-truncating ones.
620 InsnMatcher.addPredicate<MemoryVsLLTSizePredicateMatcher>(
621 0, MemoryVsLLTSizePredicateMatcher::EqualTo, 0);
625 assert(SrcGIEquivOrNull != nullptr && "Invalid SrcGIEquivOrNull value");
626 // No check required. We already did it by swapping the opcode.
627 if (!SrcGIEquivOrNull->isValueUnset("IfSignExtend") &&
628 Predicate.isSignExtLoad())
629 return InsnMatcher;
631 // No check required. We already did it by swapping the opcode.
632 if (!SrcGIEquivOrNull->isValueUnset("IfZeroExtend") &&
633 Predicate.isZeroExtLoad())
634 return InsnMatcher;
636 // No check required. G_STORE by itself is a non-extending store.
637 if (Predicate.isNonTruncStore())
638 return InsnMatcher;
640 if (Predicate.isLoad() || Predicate.isStore() || Predicate.isAtomic()) {
641 if (Predicate.getMemoryVT() != nullptr) {
642 auto MemSizeInBits = getMemSizeBitsFromPredicate(Predicate);
643 if (!MemSizeInBits)
644 return failedImport("MemVT could not be converted to LLT");
646 InsnMatcher.addPredicate<MemorySizePredicateMatcher>(0,
647 *MemSizeInBits / 8);
648 return InsnMatcher;
652 if (Predicate.isLoad() || Predicate.isStore()) {
653 // No check required. A G_LOAD/G_STORE is an unindexed load.
654 if (Predicate.isUnindexed())
655 return InsnMatcher;
658 if (Predicate.isAtomic()) {
659 if (Predicate.isAtomicOrderingMonotonic()) {
660 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>("Monotonic");
661 return InsnMatcher;
663 if (Predicate.isAtomicOrderingAcquire()) {
664 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>("Acquire");
665 return InsnMatcher;
667 if (Predicate.isAtomicOrderingRelease()) {
668 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>("Release");
669 return InsnMatcher;
671 if (Predicate.isAtomicOrderingAcquireRelease()) {
672 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>(
673 "AcquireRelease");
674 return InsnMatcher;
676 if (Predicate.isAtomicOrderingSequentiallyConsistent()) {
677 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>(
678 "SequentiallyConsistent");
679 return InsnMatcher;
683 if (Predicate.isAtomicOrderingAcquireOrStronger()) {
684 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>(
685 "Acquire", AtomicOrderingMMOPredicateMatcher::AO_OrStronger);
686 return InsnMatcher;
688 if (Predicate.isAtomicOrderingWeakerThanAcquire()) {
689 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>(
690 "Acquire", AtomicOrderingMMOPredicateMatcher::AO_WeakerThan);
691 return InsnMatcher;
694 if (Predicate.isAtomicOrderingReleaseOrStronger()) {
695 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>(
696 "Release", AtomicOrderingMMOPredicateMatcher::AO_OrStronger);
697 return InsnMatcher;
699 if (Predicate.isAtomicOrderingWeakerThanRelease()) {
700 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>(
701 "Release", AtomicOrderingMMOPredicateMatcher::AO_WeakerThan);
702 return InsnMatcher;
704 HasAddedMatcher = false;
705 return InsnMatcher;
708 Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
709 RuleMatcher &Rule, InstructionMatcher &InsnMatcher,
710 const TreePatternNode *Src, unsigned &TempOpIdx) {
711 const auto SavedFlags = Rule.setGISelFlags(Src->getGISelFlagsRecord());
713 Record *SrcGIEquivOrNull = nullptr;
714 const CodeGenInstruction *SrcGIOrNull = nullptr;
716 // Start with the defined operands (i.e., the results of the root operator).
717 if (Src->isLeaf()) {
718 Init *SrcInit = Src->getLeafValue();
719 if (isa<IntInit>(SrcInit)) {
720 InsnMatcher.addPredicate<InstructionOpcodeMatcher>(
721 &Target.getInstruction(RK.getDef("G_CONSTANT")));
722 } else
723 return failedImport(
724 "Unable to deduce gMIR opcode to handle Src (which is a leaf)");
725 } else {
726 SrcGIEquivOrNull = findNodeEquiv(Src->getOperator());
727 if (!SrcGIEquivOrNull)
728 return failedImport("Pattern operator lacks an equivalent Instruction" +
729 explainOperator(Src->getOperator()));
730 SrcGIOrNull = getEquivNode(*SrcGIEquivOrNull, Src);
732 // The operators look good: match the opcode
733 InsnMatcher.addPredicate<InstructionOpcodeMatcher>(SrcGIOrNull);
736 unsigned OpIdx = 0;
737 for (const TypeSetByHwMode &VTy : Src->getExtTypes()) {
738 // Results don't have a name unless they are the root node. The caller will
739 // set the name if appropriate.
740 const bool OperandIsAPointer =
741 SrcGIOrNull && SrcGIOrNull->isOutOperandAPointer(OpIdx);
742 OperandMatcher &OM = InsnMatcher.addOperand(OpIdx++, "", TempOpIdx);
743 if (auto Error = OM.addTypeCheckPredicate(VTy, OperandIsAPointer))
744 return failedImport(toString(std::move(Error)) +
745 " for result of Src pattern operator");
748 for (const TreePredicateCall &Call : Src->getPredicateCalls()) {
749 const TreePredicateFn &Predicate = Call.Fn;
750 bool HasAddedBuiltinMatcher = true;
751 if (Predicate.isAlwaysTrue())
752 continue;
754 if (Predicate.isImmediatePattern()) {
755 InsnMatcher.addPredicate<InstructionImmPredicateMatcher>(Predicate);
756 continue;
759 auto InsnMatcherOrError = addBuiltinPredicates(
760 SrcGIEquivOrNull, Predicate, InsnMatcher, HasAddedBuiltinMatcher);
761 if (auto Error = InsnMatcherOrError.takeError())
762 return std::move(Error);
764 // FIXME: This should be part of addBuiltinPredicates(). If we add this at
765 // the start of addBuiltinPredicates() without returning, then there might
766 // be cases where we hit the last return before which the
767 // HasAddedBuiltinMatcher will be set to false. The predicate could be
768 // missed if we add it in the middle or at the end due to return statements
769 // after the addPredicate<>() calls.
770 if (Predicate.hasNoUse()) {
771 InsnMatcher.addPredicate<NoUsePredicateMatcher>();
772 HasAddedBuiltinMatcher = true;
775 if (Predicate.hasGISelPredicateCode()) {
776 if (Predicate.usesOperands()) {
777 assert(WaitingForNamedOperands == 0 &&
778 "previous predicate didn't find all operands or "
779 "nested predicate that uses operands");
780 TreePattern *TP = Predicate.getOrigPatFragRecord();
781 WaitingForNamedOperands = TP->getNumArgs();
782 for (unsigned i = 0; i < WaitingForNamedOperands; ++i)
783 StoreIdxForName[getScopedName(Call.Scope, TP->getArgName(i))] = i;
785 InsnMatcher.addPredicate<GenericInstructionPredicateMatcher>(Predicate);
786 continue;
788 if (!HasAddedBuiltinMatcher) {
789 return failedImport("Src pattern child has predicate (" +
790 explainPredicates(Src) + ")");
794 if (SrcGIEquivOrNull &&
795 SrcGIEquivOrNull->getValueAsBit("CheckMMOIsNonAtomic"))
796 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>("NotAtomic");
797 else if (SrcGIEquivOrNull &&
798 SrcGIEquivOrNull->getValueAsBit("CheckMMOIsAtomic")) {
799 InsnMatcher.addPredicate<AtomicOrderingMMOPredicateMatcher>(
800 "Unordered", AtomicOrderingMMOPredicateMatcher::AO_OrStronger);
803 if (Src->isLeaf()) {
804 Init *SrcInit = Src->getLeafValue();
805 if (IntInit *SrcIntInit = dyn_cast<IntInit>(SrcInit)) {
806 OperandMatcher &OM =
807 InsnMatcher.addOperand(OpIdx++, Src->getName(), TempOpIdx);
808 OM.addPredicate<LiteralIntOperandMatcher>(SrcIntInit->getValue());
809 } else
810 return failedImport(
811 "Unable to deduce gMIR opcode to handle Src (which is a leaf)");
812 } else {
813 assert(SrcGIOrNull &&
814 "Expected to have already found an equivalent Instruction");
815 if (SrcGIOrNull->TheDef->getName() == "G_CONSTANT" ||
816 SrcGIOrNull->TheDef->getName() == "G_FCONSTANT") {
817 // imm/fpimm still have operands but we don't need to do anything with it
818 // here since we don't support ImmLeaf predicates yet. However, we still
819 // need to note the hidden operand to get GIM_CheckNumOperands correct.
820 InsnMatcher.addOperand(OpIdx++, "", TempOpIdx);
821 return InsnMatcher;
824 // Special case because the operand order is changed from setcc. The
825 // predicate operand needs to be swapped from the last operand to the first
826 // source.
828 unsigned NumChildren = Src->getNumChildren();
829 bool IsFCmp = SrcGIOrNull->TheDef->getName() == "G_FCMP";
831 if (IsFCmp || SrcGIOrNull->TheDef->getName() == "G_ICMP") {
832 const TreePatternNode *SrcChild = Src->getChild(NumChildren - 1);
833 if (SrcChild->isLeaf()) {
834 DefInit *DI = dyn_cast<DefInit>(SrcChild->getLeafValue());
835 Record *CCDef = DI ? DI->getDef() : nullptr;
836 if (!CCDef || !CCDef->isSubClassOf("CondCode"))
837 return failedImport("Unable to handle CondCode");
839 OperandMatcher &OM =
840 InsnMatcher.addOperand(OpIdx++, SrcChild->getName(), TempOpIdx);
841 StringRef PredType = IsFCmp ? CCDef->getValueAsString("FCmpPredicate")
842 : CCDef->getValueAsString("ICmpPredicate");
844 if (!PredType.empty()) {
845 OM.addPredicate<CmpPredicateOperandMatcher>(std::string(PredType));
846 // Process the other 2 operands normally.
847 --NumChildren;
852 // Match the used operands (i.e. the children of the operator).
853 bool IsIntrinsic =
854 SrcGIOrNull->TheDef->getName() == "G_INTRINSIC" ||
855 SrcGIOrNull->TheDef->getName() == "G_INTRINSIC_W_SIDE_EFFECTS" ||
856 SrcGIOrNull->TheDef->getName() == "G_INTRINSIC_CONVERGENT" ||
857 SrcGIOrNull->TheDef->getName() ==
858 "G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS";
859 const CodeGenIntrinsic *II = Src->getIntrinsicInfo(CGP);
860 if (IsIntrinsic && !II)
861 return failedImport("Expected IntInit containing intrinsic ID)");
863 for (unsigned i = 0; i != NumChildren; ++i) {
864 const TreePatternNode *SrcChild = Src->getChild(i);
866 // We need to determine the meaning of a literal integer based on the
867 // context. If this is a field required to be an immediate (such as an
868 // immarg intrinsic argument), the required predicates are different than
869 // a constant which may be materialized in a register. If we have an
870 // argument that is required to be an immediate, we should not emit an LLT
871 // type check, and should not be looking for a G_CONSTANT defined
872 // register.
873 bool OperandIsImmArg = SrcGIOrNull->isInOperandImmArg(i);
875 // SelectionDAG allows pointers to be represented with iN since it doesn't
876 // distinguish between pointers and integers but they are different types
877 // in GlobalISel. Coerce integers to pointers to address space 0 if the
878 // context indicates a pointer.
880 bool OperandIsAPointer = SrcGIOrNull->isInOperandAPointer(i);
882 if (IsIntrinsic) {
883 // For G_INTRINSIC/G_INTRINSIC_W_SIDE_EFFECTS, the operand immediately
884 // following the defs is an intrinsic ID.
885 if (i == 0) {
886 OperandMatcher &OM =
887 InsnMatcher.addOperand(OpIdx++, SrcChild->getName(), TempOpIdx);
888 OM.addPredicate<IntrinsicIDOperandMatcher>(II);
889 continue;
892 // We have to check intrinsics for llvm_anyptr_ty and immarg parameters.
894 // Note that we have to look at the i-1th parameter, because we don't
895 // have the intrinsic ID in the intrinsic's parameter list.
896 OperandIsAPointer |= II->isParamAPointer(i - 1);
897 OperandIsImmArg |= II->isParamImmArg(i - 1);
900 if (auto Error =
901 importChildMatcher(Rule, InsnMatcher, SrcChild, OperandIsAPointer,
902 OperandIsImmArg, OpIdx++, TempOpIdx))
903 return std::move(Error);
907 return InsnMatcher;
910 Error GlobalISelEmitter::importComplexPatternOperandMatcher(
911 OperandMatcher &OM, Record *R, unsigned &TempOpIdx) const {
912 const auto &ComplexPattern = ComplexPatternEquivs.find(R);
913 if (ComplexPattern == ComplexPatternEquivs.end())
914 return failedImport("SelectionDAG ComplexPattern (" + R->getName() +
915 ") not mapped to GlobalISel");
917 OM.addPredicate<ComplexPatternOperandMatcher>(OM, *ComplexPattern->second);
918 TempOpIdx++;
919 return Error::success();
922 // Get the name to use for a pattern operand. For an anonymous physical register
923 // input, this should use the register name.
924 static StringRef getSrcChildName(const TreePatternNode *SrcChild,
925 Record *&PhysReg) {
926 StringRef SrcChildName = SrcChild->getName();
927 if (SrcChildName.empty() && SrcChild->isLeaf()) {
928 if (auto *ChildDefInit = dyn_cast<DefInit>(SrcChild->getLeafValue())) {
929 auto *ChildRec = ChildDefInit->getDef();
930 if (ChildRec->isSubClassOf("Register")) {
931 SrcChildName = ChildRec->getName();
932 PhysReg = ChildRec;
937 return SrcChildName;
940 Error GlobalISelEmitter::importChildMatcher(
941 RuleMatcher &Rule, InstructionMatcher &InsnMatcher,
942 const TreePatternNode *SrcChild, bool OperandIsAPointer,
943 bool OperandIsImmArg, unsigned OpIdx, unsigned &TempOpIdx) {
945 Record *PhysReg = nullptr;
946 std::string SrcChildName = std::string(getSrcChildName(SrcChild, PhysReg));
947 if (!SrcChild->isLeaf() &&
948 SrcChild->getOperator()->isSubClassOf("ComplexPattern")) {
949 // The "name" of a non-leaf complex pattern (MY_PAT $op1, $op2) is
950 // "MY_PAT:op1:op2" and the ones with same "name" represent same operand.
951 std::string PatternName = std::string(SrcChild->getOperator()->getName());
952 for (unsigned i = 0; i < SrcChild->getNumChildren(); ++i) {
953 PatternName += ":";
954 PatternName += SrcChild->getChild(i)->getName();
956 SrcChildName = PatternName;
959 OperandMatcher &OM =
960 PhysReg ? InsnMatcher.addPhysRegInput(PhysReg, OpIdx, TempOpIdx)
961 : InsnMatcher.addOperand(OpIdx, SrcChildName, TempOpIdx);
962 if (OM.isSameAsAnotherOperand())
963 return Error::success();
965 ArrayRef<TypeSetByHwMode> ChildTypes = SrcChild->getExtTypes();
966 if (ChildTypes.size() != 1)
967 return failedImport("Src pattern child has multiple results");
969 // Check MBB's before the type check since they are not a known type.
970 if (!SrcChild->isLeaf()) {
971 if (SrcChild->getOperator()->isSubClassOf("SDNode")) {
972 auto &ChildSDNI = CGP.getSDNodeInfo(SrcChild->getOperator());
973 if (ChildSDNI.getSDClassName() == "BasicBlockSDNode") {
974 OM.addPredicate<MBBOperandMatcher>();
975 return Error::success();
977 if (SrcChild->getOperator()->getName() == "timm") {
978 OM.addPredicate<ImmOperandMatcher>();
980 // Add predicates, if any
981 for (const TreePredicateCall &Call : SrcChild->getPredicateCalls()) {
982 const TreePredicateFn &Predicate = Call.Fn;
984 // Only handle immediate patterns for now
985 if (Predicate.isImmediatePattern()) {
986 OM.addPredicate<OperandImmPredicateMatcher>(Predicate);
990 return Error::success();
995 // Immediate arguments have no meaningful type to check as they don't have
996 // registers.
997 if (!OperandIsImmArg) {
998 if (auto Error =
999 OM.addTypeCheckPredicate(ChildTypes.front(), OperandIsAPointer))
1000 return failedImport(toString(std::move(Error)) + " for Src operand (" +
1001 to_string(*SrcChild) + ")");
1004 // Try look up SrcChild for a (named) predicate operand if there is any.
1005 if (WaitingForNamedOperands) {
1006 auto &ScopedNames = SrcChild->getNamesAsPredicateArg();
1007 if (!ScopedNames.empty()) {
1008 auto PA = ScopedNames.begin();
1009 std::string Name = getScopedName(PA->getScope(), PA->getIdentifier());
1010 OM.addPredicate<RecordNamedOperandMatcher>(StoreIdxForName[Name], Name);
1011 --WaitingForNamedOperands;
1015 // Check for nested instructions.
1016 if (!SrcChild->isLeaf()) {
1017 if (SrcChild->getOperator()->isSubClassOf("ComplexPattern")) {
1018 // When a ComplexPattern is used as an operator, it should do the same
1019 // thing as when used as a leaf. However, the children of the operator
1020 // name the sub-operands that make up the complex operand and we must
1021 // prepare to reference them in the renderer too.
1022 unsigned RendererID = TempOpIdx;
1023 if (auto Error = importComplexPatternOperandMatcher(
1024 OM, SrcChild->getOperator(), TempOpIdx))
1025 return Error;
1027 for (unsigned i = 0, e = SrcChild->getNumChildren(); i != e; ++i) {
1028 auto *SubOperand = SrcChild->getChild(i);
1029 if (!SubOperand->getName().empty()) {
1030 if (auto Error = Rule.defineComplexSubOperand(
1031 SubOperand->getName(), SrcChild->getOperator(), RendererID, i,
1032 SrcChildName))
1033 return Error;
1037 return Error::success();
1040 auto MaybeInsnOperand = OM.addPredicate<InstructionOperandMatcher>(
1041 InsnMatcher.getRuleMatcher(), SrcChild->getName());
1042 if (!MaybeInsnOperand) {
1043 // This isn't strictly true. If the user were to provide exactly the same
1044 // matchers as the original operand then we could allow it. However, it's
1045 // simpler to not permit the redundant specification.
1046 return failedImport(
1047 "Nested instruction cannot be the same as another operand");
1050 // Map the node to a gMIR instruction.
1051 InstructionOperandMatcher &InsnOperand = **MaybeInsnOperand;
1052 auto InsnMatcherOrError = createAndImportSelDAGMatcher(
1053 Rule, InsnOperand.getInsnMatcher(), SrcChild, TempOpIdx);
1054 if (auto Error = InsnMatcherOrError.takeError())
1055 return Error;
1057 return Error::success();
1060 if (SrcChild->hasAnyPredicate())
1061 return failedImport("Src pattern child has unsupported predicate");
1063 // Check for constant immediates.
1064 if (auto *ChildInt = dyn_cast<IntInit>(SrcChild->getLeafValue())) {
1065 if (OperandIsImmArg) {
1066 // Checks for argument directly in operand list
1067 OM.addPredicate<LiteralIntOperandMatcher>(ChildInt->getValue());
1068 } else {
1069 // Checks for materialized constant
1070 OM.addPredicate<ConstantIntOperandMatcher>(ChildInt->getValue());
1072 return Error::success();
1075 // Check for def's like register classes or ComplexPattern's.
1076 if (auto *ChildDefInit = dyn_cast<DefInit>(SrcChild->getLeafValue())) {
1077 auto *ChildRec = ChildDefInit->getDef();
1079 // Check for register classes.
1080 if (ChildRec->isSubClassOf("RegisterClass") ||
1081 ChildRec->isSubClassOf("RegisterOperand")) {
1082 OM.addPredicate<RegisterBankOperandMatcher>(
1083 Target.getRegisterClass(getInitValueAsRegClass(ChildDefInit)));
1084 return Error::success();
1087 if (ChildRec->isSubClassOf("Register")) {
1088 // This just be emitted as a copy to the specific register.
1089 ValueTypeByHwMode VT = ChildTypes.front().getValueTypeByHwMode();
1090 const CodeGenRegisterClass *RC =
1091 CGRegs.getMinimalPhysRegClass(ChildRec, &VT);
1092 if (!RC) {
1093 return failedImport(
1094 "Could not determine physical register class of pattern source");
1097 OM.addPredicate<RegisterBankOperandMatcher>(*RC);
1098 return Error::success();
1101 // Check for ValueType.
1102 if (ChildRec->isSubClassOf("ValueType")) {
1103 // We already added a type check as standard practice so this doesn't need
1104 // to do anything.
1105 return Error::success();
1108 // Check for ComplexPattern's.
1109 if (ChildRec->isSubClassOf("ComplexPattern"))
1110 return importComplexPatternOperandMatcher(OM, ChildRec, TempOpIdx);
1112 if (ChildRec->isSubClassOf("ImmLeaf")) {
1113 return failedImport(
1114 "Src pattern child def is an unsupported tablegen class (ImmLeaf)");
1117 // Place holder for SRCVALUE nodes. Nothing to do here.
1118 if (ChildRec->getName() == "srcvalue")
1119 return Error::success();
1121 const bool ImmAllOnesV = ChildRec->getName() == "immAllOnesV";
1122 if (ImmAllOnesV || ChildRec->getName() == "immAllZerosV") {
1123 auto MaybeInsnOperand = OM.addPredicate<InstructionOperandMatcher>(
1124 InsnMatcher.getRuleMatcher(), SrcChild->getName(), false);
1125 InstructionOperandMatcher &InsnOperand = **MaybeInsnOperand;
1127 ValueTypeByHwMode VTy = ChildTypes.front().getValueTypeByHwMode();
1129 const CodeGenInstruction &BuildVector =
1130 Target.getInstruction(RK.getDef("G_BUILD_VECTOR"));
1131 const CodeGenInstruction &BuildVectorTrunc =
1132 Target.getInstruction(RK.getDef("G_BUILD_VECTOR_TRUNC"));
1134 // Treat G_BUILD_VECTOR as the canonical opcode, and G_BUILD_VECTOR_TRUNC
1135 // as an alternative.
1136 InsnOperand.getInsnMatcher().addPredicate<InstructionOpcodeMatcher>(
1137 ArrayRef({&BuildVector, &BuildVectorTrunc}));
1139 // TODO: Handle both G_BUILD_VECTOR and G_BUILD_VECTOR_TRUNC We could
1140 // theoretically not emit any opcode check, but getOpcodeMatcher currently
1141 // has to succeed.
1142 OperandMatcher &OM =
1143 InsnOperand.getInsnMatcher().addOperand(0, "", TempOpIdx);
1144 if (auto Error =
1145 OM.addTypeCheckPredicate(VTy, false /* OperandIsAPointer */))
1146 return failedImport(toString(std::move(Error)) +
1147 " for result of Src pattern operator");
1149 InsnOperand.getInsnMatcher().addPredicate<VectorSplatImmPredicateMatcher>(
1150 ImmAllOnesV ? VectorSplatImmPredicateMatcher::AllOnes
1151 : VectorSplatImmPredicateMatcher::AllZeros);
1152 return Error::success();
1155 return failedImport(
1156 "Src pattern child def is an unsupported tablegen class");
1159 return failedImport("Src pattern child is an unsupported kind");
1162 Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1163 action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1164 const TreePatternNode *DstChild, const TreePatternNode *Src) {
1166 const auto &SubOperand = Rule.getComplexSubOperand(DstChild->getName());
1167 if (SubOperand) {
1168 DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
1169 *std::get<0>(*SubOperand), DstChild->getName(),
1170 std::get<1>(*SubOperand), std::get<2>(*SubOperand));
1171 return InsertPt;
1174 if (!DstChild->isLeaf()) {
1175 if (DstChild->getOperator()->isSubClassOf("SDNodeXForm")) {
1176 auto Child = DstChild->getChild(0);
1177 auto I = SDNodeXFormEquivs.find(DstChild->getOperator());
1178 if (I != SDNodeXFormEquivs.end()) {
1179 Record *XFormOpc = DstChild->getOperator()->getValueAsDef("Opcode");
1180 if (XFormOpc->getName() == "timm") {
1181 // If this is a TargetConstant, there won't be a corresponding
1182 // instruction to transform. Instead, this will refer directly to an
1183 // operand in an instruction's operand list.
1184 DstMIBuilder.addRenderer<CustomOperandRenderer>(*I->second,
1185 Child->getName());
1186 } else {
1187 DstMIBuilder.addRenderer<CustomRenderer>(*I->second,
1188 Child->getName());
1191 return InsertPt;
1193 return failedImport("SDNodeXForm " + Child->getName() +
1194 " has no custom renderer");
1197 // We accept 'bb' here. It's an operator because BasicBlockSDNode isn't
1198 // inline, but in MI it's just another operand.
1199 if (DstChild->getOperator()->isSubClassOf("SDNode")) {
1200 auto &ChildSDNI = CGP.getSDNodeInfo(DstChild->getOperator());
1201 if (ChildSDNI.getSDClassName() == "BasicBlockSDNode") {
1202 DstMIBuilder.addRenderer<CopyRenderer>(DstChild->getName());
1203 return InsertPt;
1207 // Similarly, imm is an operator in TreePatternNode's view but must be
1208 // rendered as operands.
1209 // FIXME: The target should be able to choose sign-extended when appropriate
1210 // (e.g. on Mips).
1211 if (DstChild->getOperator()->getName() == "timm") {
1212 DstMIBuilder.addRenderer<CopyRenderer>(DstChild->getName());
1213 return InsertPt;
1214 } else if (DstChild->getOperator()->getName() == "imm") {
1215 DstMIBuilder.addRenderer<CopyConstantAsImmRenderer>(DstChild->getName());
1216 return InsertPt;
1217 } else if (DstChild->getOperator()->getName() == "fpimm") {
1218 DstMIBuilder.addRenderer<CopyFConstantAsFPImmRenderer>(
1219 DstChild->getName());
1220 return InsertPt;
1223 if (DstChild->getOperator()->isSubClassOf("Instruction")) {
1224 auto OpTy = getInstResultType(DstChild);
1225 if (!OpTy)
1226 return OpTy.takeError();
1228 unsigned TempRegID = Rule.allocateTempRegID();
1229 InsertPt =
1230 Rule.insertAction<MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1231 DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID);
1233 auto InsertPtOrError = createAndImportSubInstructionRenderer(
1234 ++InsertPt, Rule, DstChild, Src, TempRegID);
1235 if (auto Error = InsertPtOrError.takeError())
1236 return std::move(Error);
1237 return InsertPtOrError.get();
1240 return failedImport("Dst pattern child isn't a leaf node or an MBB" +
1241 llvm::to_string(*DstChild));
1244 // It could be a specific immediate in which case we should just check for
1245 // that immediate.
1246 if (const IntInit *ChildIntInit =
1247 dyn_cast<IntInit>(DstChild->getLeafValue())) {
1248 DstMIBuilder.addRenderer<ImmRenderer>(ChildIntInit->getValue());
1249 return InsertPt;
1252 // Otherwise, we're looking for a bog-standard RegisterClass operand.
1253 if (auto *ChildDefInit = dyn_cast<DefInit>(DstChild->getLeafValue())) {
1254 auto *ChildRec = ChildDefInit->getDef();
1256 ArrayRef<TypeSetByHwMode> ChildTypes = DstChild->getExtTypes();
1257 if (ChildTypes.size() != 1)
1258 return failedImport("Dst pattern child has multiple results");
1260 std::optional<LLTCodeGen> OpTyOrNone;
1261 if (ChildTypes.front().isMachineValueType())
1262 OpTyOrNone = MVTToLLT(ChildTypes.front().getMachineValueType().SimpleTy);
1263 if (!OpTyOrNone)
1264 return failedImport("Dst operand has an unsupported type");
1266 if (ChildRec->isSubClassOf("Register")) {
1267 DstMIBuilder.addRenderer<AddRegisterRenderer>(Target, ChildRec);
1268 return InsertPt;
1271 if (ChildRec->isSubClassOf("RegisterClass") ||
1272 ChildRec->isSubClassOf("RegisterOperand") ||
1273 ChildRec->isSubClassOf("ValueType")) {
1274 if (ChildRec->isSubClassOf("RegisterOperand") &&
1275 !ChildRec->isValueUnset("GIZeroRegister")) {
1276 DstMIBuilder.addRenderer<CopyOrAddZeroRegRenderer>(
1277 DstChild->getName(), ChildRec->getValueAsDef("GIZeroRegister"));
1278 return InsertPt;
1281 DstMIBuilder.addRenderer<CopyRenderer>(DstChild->getName());
1282 return InsertPt;
1285 if (ChildRec->isSubClassOf("SubRegIndex")) {
1286 CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx(ChildRec);
1287 DstMIBuilder.addRenderer<ImmRenderer>(SubIdx->EnumValue);
1288 return InsertPt;
1291 if (ChildRec->isSubClassOf("ComplexPattern")) {
1292 const auto &ComplexPattern = ComplexPatternEquivs.find(ChildRec);
1293 if (ComplexPattern == ComplexPatternEquivs.end())
1294 return failedImport(
1295 "SelectionDAG ComplexPattern not mapped to GlobalISel");
1297 const OperandMatcher &OM = Rule.getOperandMatcher(DstChild->getName());
1298 DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
1299 *ComplexPattern->second, DstChild->getName(),
1300 OM.getAllocatedTemporariesBaseID());
1301 return InsertPt;
1304 return failedImport(
1305 "Dst pattern child def is an unsupported tablegen class");
1308 // Handle the case where the MVT/register class is omitted in the dest pattern
1309 // but MVT exists in the source pattern.
1310 if (isa<UnsetInit>(DstChild->getLeafValue())) {
1311 for (unsigned NumOp = 0; NumOp < Src->getNumChildren(); NumOp++)
1312 if (Src->getChild(NumOp)->getName() == DstChild->getName()) {
1313 DstMIBuilder.addRenderer<CopyRenderer>(Src->getChild(NumOp)->getName());
1314 return InsertPt;
1317 return failedImport("Dst pattern child is an unsupported kind");
1320 Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
1321 RuleMatcher &M, InstructionMatcher &InsnMatcher, const TreePatternNode *Src,
1322 const TreePatternNode *Dst) {
1323 auto InsertPtOrError = createInstructionRenderer(M.actions_end(), M, Dst);
1324 if (auto Error = InsertPtOrError.takeError())
1325 return std::move(Error);
1327 action_iterator InsertPt = InsertPtOrError.get();
1328 BuildMIAction &DstMIBuilder = *static_cast<BuildMIAction *>(InsertPt->get());
1330 for (auto PhysInput : InsnMatcher.getPhysRegInputs()) {
1331 InsertPt = M.insertAction<BuildMIAction>(
1332 InsertPt, M.allocateOutputInsnID(),
1333 &Target.getInstruction(RK.getDef("COPY")));
1334 BuildMIAction &CopyToPhysRegMIBuilder =
1335 *static_cast<BuildMIAction *>(InsertPt->get());
1336 CopyToPhysRegMIBuilder.addRenderer<AddRegisterRenderer>(
1337 Target, PhysInput.first, true);
1338 CopyToPhysRegMIBuilder.addRenderer<CopyPhysRegRenderer>(PhysInput.first);
1341 if (auto Error =
1342 importExplicitDefRenderers(InsertPt, M, DstMIBuilder, Src, Dst)
1343 .takeError())
1344 return std::move(Error);
1346 if (auto Error =
1347 importExplicitUseRenderers(InsertPt, M, DstMIBuilder, Dst, Src)
1348 .takeError())
1349 return std::move(Error);
1351 return DstMIBuilder;
1354 Expected<action_iterator>
1355 GlobalISelEmitter::createAndImportSubInstructionRenderer(
1356 const action_iterator InsertPt, RuleMatcher &M, const TreePatternNode *Dst,
1357 const TreePatternNode *Src, unsigned TempRegID) {
1358 auto InsertPtOrError = createInstructionRenderer(InsertPt, M, Dst);
1360 // TODO: Assert there's exactly one result.
1362 if (auto Error = InsertPtOrError.takeError())
1363 return std::move(Error);
1365 BuildMIAction &DstMIBuilder =
1366 *static_cast<BuildMIAction *>(InsertPtOrError.get()->get());
1368 // Assign the result to TempReg.
1369 DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID, true);
1371 InsertPtOrError = importExplicitUseRenderers(InsertPtOrError.get(), M,
1372 DstMIBuilder, Dst, Src);
1373 if (auto Error = InsertPtOrError.takeError())
1374 return std::move(Error);
1376 // We need to make sure that when we import an INSERT_SUBREG as a
1377 // subinstruction that it ends up being constrained to the correct super
1378 // register and subregister classes.
1379 auto OpName = Target.getInstruction(Dst->getOperator()).TheDef->getName();
1380 if (OpName == "INSERT_SUBREG") {
1381 auto SubClass = inferRegClassFromPattern(Dst->getChild(1));
1382 if (!SubClass)
1383 return failedImport(
1384 "Cannot infer register class from INSERT_SUBREG operand #1");
1385 std::optional<const CodeGenRegisterClass *> SuperClass =
1386 inferSuperRegisterClassForNode(Dst->getExtType(0), Dst->getChild(0),
1387 Dst->getChild(2));
1388 if (!SuperClass)
1389 return failedImport(
1390 "Cannot infer register class for INSERT_SUBREG operand #0");
1391 // The destination and the super register source of an INSERT_SUBREG must
1392 // be the same register class.
1393 M.insertAction<ConstrainOperandToRegClassAction>(
1394 InsertPt, DstMIBuilder.getInsnID(), 0, **SuperClass);
1395 M.insertAction<ConstrainOperandToRegClassAction>(
1396 InsertPt, DstMIBuilder.getInsnID(), 1, **SuperClass);
1397 M.insertAction<ConstrainOperandToRegClassAction>(
1398 InsertPt, DstMIBuilder.getInsnID(), 2, **SubClass);
1399 return InsertPtOrError.get();
1402 if (OpName == "EXTRACT_SUBREG") {
1403 // EXTRACT_SUBREG selects into a subregister COPY but unlike most
1404 // instructions, the result register class is controlled by the
1405 // subregisters of the operand. As a result, we must constrain the result
1406 // class rather than check that it's already the right one.
1407 auto SuperClass = inferRegClassFromPattern(Dst->getChild(0));
1408 if (!SuperClass)
1409 return failedImport(
1410 "Cannot infer register class from EXTRACT_SUBREG operand #0");
1412 auto SubIdx = inferSubRegIndexForNode(Dst->getChild(1));
1413 if (!SubIdx)
1414 return failedImport("EXTRACT_SUBREG child #1 is not a subreg index");
1416 const auto SrcRCDstRCPair =
1417 (*SuperClass)->getMatchingSubClassWithSubRegs(CGRegs, *SubIdx);
1418 assert(SrcRCDstRCPair->second && "Couldn't find a matching subclass");
1419 M.insertAction<ConstrainOperandToRegClassAction>(
1420 InsertPt, DstMIBuilder.getInsnID(), 0, *SrcRCDstRCPair->second);
1421 M.insertAction<ConstrainOperandToRegClassAction>(
1422 InsertPt, DstMIBuilder.getInsnID(), 1, *SrcRCDstRCPair->first);
1424 // We're done with this pattern! It's eligible for GISel emission; return
1425 // it.
1426 return InsertPtOrError.get();
1429 // Similar to INSERT_SUBREG, we also have to handle SUBREG_TO_REG as a
1430 // subinstruction.
1431 if (OpName == "SUBREG_TO_REG") {
1432 auto SubClass = inferRegClassFromPattern(Dst->getChild(1));
1433 if (!SubClass)
1434 return failedImport(
1435 "Cannot infer register class from SUBREG_TO_REG child #1");
1436 auto SuperClass =
1437 inferSuperRegisterClass(Dst->getExtType(0), Dst->getChild(2));
1438 if (!SuperClass)
1439 return failedImport(
1440 "Cannot infer register class for SUBREG_TO_REG operand #0");
1441 M.insertAction<ConstrainOperandToRegClassAction>(
1442 InsertPt, DstMIBuilder.getInsnID(), 0, **SuperClass);
1443 M.insertAction<ConstrainOperandToRegClassAction>(
1444 InsertPt, DstMIBuilder.getInsnID(), 2, **SubClass);
1445 return InsertPtOrError.get();
1448 if (OpName == "REG_SEQUENCE") {
1449 auto SuperClass = inferRegClassFromPattern(Dst->getChild(0));
1450 M.insertAction<ConstrainOperandToRegClassAction>(
1451 InsertPt, DstMIBuilder.getInsnID(), 0, **SuperClass);
1453 unsigned Num = Dst->getNumChildren();
1454 for (unsigned I = 1; I != Num; I += 2) {
1455 const TreePatternNode *SubRegChild = Dst->getChild(I + 1);
1457 auto SubIdx = inferSubRegIndexForNode(SubRegChild);
1458 if (!SubIdx)
1459 return failedImport("REG_SEQUENCE child is not a subreg index");
1461 const auto SrcRCDstRCPair =
1462 (*SuperClass)->getMatchingSubClassWithSubRegs(CGRegs, *SubIdx);
1463 assert(SrcRCDstRCPair->second && "Couldn't find a matching subclass");
1464 M.insertAction<ConstrainOperandToRegClassAction>(
1465 InsertPt, DstMIBuilder.getInsnID(), I, *SrcRCDstRCPair->second);
1468 return InsertPtOrError.get();
1471 M.insertAction<ConstrainOperandsToDefinitionAction>(InsertPt,
1472 DstMIBuilder.getInsnID());
1473 return InsertPtOrError.get();
1476 Expected<action_iterator> GlobalISelEmitter::createInstructionRenderer(
1477 action_iterator InsertPt, RuleMatcher &M, const TreePatternNode *Dst) {
1478 Record *DstOp = Dst->getOperator();
1479 if (!DstOp->isSubClassOf("Instruction")) {
1480 if (DstOp->isSubClassOf("ValueType"))
1481 return failedImport(
1482 "Pattern operator isn't an instruction (it's a ValueType)");
1483 return failedImport("Pattern operator isn't an instruction");
1485 CodeGenInstruction *DstI = &Target.getInstruction(DstOp);
1487 // COPY_TO_REGCLASS is just a copy with a ConstrainOperandToRegClassAction
1488 // attached. Similarly for EXTRACT_SUBREG except that's a subregister copy.
1489 StringRef Name = DstI->TheDef->getName();
1490 if (Name == "COPY_TO_REGCLASS" || Name == "EXTRACT_SUBREG")
1491 DstI = &Target.getInstruction(RK.getDef("COPY"));
1493 return M.insertAction<BuildMIAction>(InsertPt, M.allocateOutputInsnID(),
1494 DstI);
1497 Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers(
1498 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1499 const TreePatternNode *Src, const TreePatternNode *Dst) {
1500 const CodeGenInstruction *DstI = DstMIBuilder.getCGI();
1501 const unsigned SrcNumDefs = Src->getExtTypes().size();
1502 const unsigned DstNumDefs = DstI->Operands.NumDefs;
1503 if (DstNumDefs == 0)
1504 return InsertPt;
1506 for (unsigned I = 0; I < SrcNumDefs; ++I) {
1507 std::string OpName = getMangledRootDefName(DstI->Operands[I].Name);
1508 // CopyRenderer saves a StringRef, so cannot pass OpName itself -
1509 // let's use a string with an appropriate lifetime.
1510 StringRef PermanentRef = M.getOperandMatcher(OpName).getSymbolicName();
1511 DstMIBuilder.addRenderer<CopyRenderer>(PermanentRef);
1514 // Some instructions have multiple defs, but are missing a type entry
1515 // (e.g. s_cc_out operands).
1516 if (Dst->getExtTypes().size() < DstNumDefs)
1517 return failedImport("unhandled discarded def");
1519 for (unsigned I = SrcNumDefs; I < DstNumDefs; ++I) {
1520 const TypeSetByHwMode &ExtTy = Dst->getExtType(I);
1521 if (!ExtTy.isMachineValueType())
1522 return failedImport("unsupported typeset");
1524 auto OpTy = MVTToLLT(ExtTy.getMachineValueType().SimpleTy);
1525 if (!OpTy)
1526 return failedImport("unsupported type");
1528 unsigned TempRegID = M.allocateTempRegID();
1529 InsertPt =
1530 M.insertAction<MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1531 DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID, true, nullptr, true);
1534 return InsertPt;
1537 Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1538 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1539 const llvm::TreePatternNode *Dst, const llvm::TreePatternNode *Src) {
1540 const CodeGenInstruction *DstI = DstMIBuilder.getCGI();
1541 CodeGenInstruction *OrigDstI = &Target.getInstruction(Dst->getOperator());
1543 StringRef Name = OrigDstI->TheDef->getName();
1544 unsigned ExpectedDstINumUses = Dst->getNumChildren();
1546 // EXTRACT_SUBREG needs to use a subregister COPY.
1547 if (Name == "EXTRACT_SUBREG") {
1548 if (!Dst->getChild(1)->isLeaf())
1549 return failedImport("EXTRACT_SUBREG child #1 is not a leaf");
1550 DefInit *SubRegInit = dyn_cast<DefInit>(Dst->getChild(1)->getLeafValue());
1551 if (!SubRegInit)
1552 return failedImport("EXTRACT_SUBREG child #1 is not a subreg index");
1554 CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx(SubRegInit->getDef());
1555 const TreePatternNode *ValChild = Dst->getChild(0);
1556 if (!ValChild->isLeaf()) {
1557 // We really have to handle the source instruction, and then insert a
1558 // copy from the subregister.
1559 auto ExtractSrcTy = getInstResultType(ValChild);
1560 if (!ExtractSrcTy)
1561 return ExtractSrcTy.takeError();
1563 unsigned TempRegID = M.allocateTempRegID();
1564 InsertPt = M.insertAction<MakeTempRegisterAction>(InsertPt, *ExtractSrcTy,
1565 TempRegID);
1567 auto InsertPtOrError = createAndImportSubInstructionRenderer(
1568 ++InsertPt, M, ValChild, Src, TempRegID);
1569 if (auto Error = InsertPtOrError.takeError())
1570 return std::move(Error);
1572 DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID, false, SubIdx);
1573 return InsertPt;
1576 // If this is a source operand, this is just a subregister copy.
1577 Record *RCDef = getInitValueAsRegClass(ValChild->getLeafValue());
1578 if (!RCDef)
1579 return failedImport("EXTRACT_SUBREG child #0 could not "
1580 "be coerced to a register class");
1582 CodeGenRegisterClass *RC = CGRegs.getRegClass(RCDef);
1584 const auto SrcRCDstRCPair =
1585 RC->getMatchingSubClassWithSubRegs(CGRegs, SubIdx);
1586 if (SrcRCDstRCPair) {
1587 assert(SrcRCDstRCPair->second && "Couldn't find a matching subclass");
1588 if (SrcRCDstRCPair->first != RC)
1589 return failedImport("EXTRACT_SUBREG requires an additional COPY");
1592 StringRef RegOperandName = Dst->getChild(0)->getName();
1593 if (const auto &SubOperand = M.getComplexSubOperand(RegOperandName)) {
1594 DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
1595 *std::get<0>(*SubOperand), RegOperandName, std::get<1>(*SubOperand),
1596 std::get<2>(*SubOperand), SubIdx);
1597 return InsertPt;
1600 DstMIBuilder.addRenderer<CopySubRegRenderer>(RegOperandName, SubIdx);
1601 return InsertPt;
1604 if (Name == "REG_SEQUENCE") {
1605 if (!Dst->getChild(0)->isLeaf())
1606 return failedImport("REG_SEQUENCE child #0 is not a leaf");
1608 Record *RCDef = getInitValueAsRegClass(Dst->getChild(0)->getLeafValue());
1609 if (!RCDef)
1610 return failedImport("REG_SEQUENCE child #0 could not "
1611 "be coerced to a register class");
1613 if ((ExpectedDstINumUses - 1) % 2 != 0)
1614 return failedImport("Malformed REG_SEQUENCE");
1616 for (unsigned I = 1; I != ExpectedDstINumUses; I += 2) {
1617 const TreePatternNode *ValChild = Dst->getChild(I);
1618 const TreePatternNode *SubRegChild = Dst->getChild(I + 1);
1620 if (DefInit *SubRegInit =
1621 dyn_cast<DefInit>(SubRegChild->getLeafValue())) {
1622 CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx(SubRegInit->getDef());
1624 auto InsertPtOrError =
1625 importExplicitUseRenderer(InsertPt, M, DstMIBuilder, ValChild, Src);
1626 if (auto Error = InsertPtOrError.takeError())
1627 return std::move(Error);
1628 InsertPt = InsertPtOrError.get();
1629 DstMIBuilder.addRenderer<SubRegIndexRenderer>(SubIdx);
1633 return InsertPt;
1636 // Render the explicit uses.
1637 unsigned DstINumUses = OrigDstI->Operands.size() - OrigDstI->Operands.NumDefs;
1638 if (Name == "COPY_TO_REGCLASS") {
1639 DstINumUses--; // Ignore the class constraint.
1640 ExpectedDstINumUses--;
1643 // NumResults - This is the number of results produced by the instruction in
1644 // the "outs" list.
1645 unsigned NumResults = OrigDstI->Operands.NumDefs;
1647 // Number of operands we know the output instruction must have. If it is
1648 // variadic, we could have more operands.
1649 unsigned NumFixedOperands = DstI->Operands.size();
1651 // Loop over all of the fixed operands of the instruction pattern, emitting
1652 // code to fill them all in. The node 'N' usually has number children equal to
1653 // the number of input operands of the instruction. However, in cases where
1654 // there are predicate operands for an instruction, we need to fill in the
1655 // 'execute always' values. Match up the node operands to the instruction
1656 // operands to do this.
1657 unsigned Child = 0;
1659 // Similarly to the code in TreePatternNode::ApplyTypeConstraints, count the
1660 // number of operands at the end of the list which have default values.
1661 // Those can come from the pattern if it provides enough arguments, or be
1662 // filled in with the default if the pattern hasn't provided them. But any
1663 // operand with a default value _before_ the last mandatory one will be
1664 // filled in with their defaults unconditionally.
1665 unsigned NonOverridableOperands = NumFixedOperands;
1666 while (NonOverridableOperands > NumResults &&
1667 CGP.operandHasDefault(DstI->Operands[NonOverridableOperands - 1].Rec))
1668 --NonOverridableOperands;
1670 unsigned NumDefaultOps = 0;
1671 for (unsigned I = 0; I != DstINumUses; ++I) {
1672 unsigned InstOpNo = DstI->Operands.NumDefs + I;
1674 // Determine what to emit for this operand.
1675 Record *OperandNode = DstI->Operands[InstOpNo].Rec;
1677 // If the operand has default values, introduce them now.
1678 if (CGP.operandHasDefault(OperandNode) &&
1679 (InstOpNo < NonOverridableOperands || Child >= Dst->getNumChildren())) {
1680 // This is a predicate or optional def operand which the pattern has not
1681 // overridden, or which we aren't letting it override; emit the 'default
1682 // ops' operands.
1684 Record *OperandNode = DstI->Operands[InstOpNo].Rec;
1685 if (auto Error = importDefaultOperandRenderers(
1686 InsertPt, M, DstMIBuilder, CGP.getDefaultOperand(OperandNode)))
1687 return std::move(Error);
1689 ++NumDefaultOps;
1690 continue;
1693 auto InsertPtOrError = importExplicitUseRenderer(InsertPt, M, DstMIBuilder,
1694 Dst->getChild(Child), Src);
1695 if (auto Error = InsertPtOrError.takeError())
1696 return std::move(Error);
1697 InsertPt = InsertPtOrError.get();
1698 ++Child;
1701 if (NumDefaultOps + ExpectedDstINumUses != DstINumUses)
1702 return failedImport("Expected " + llvm::to_string(DstINumUses) +
1703 " used operands but found " +
1704 llvm::to_string(ExpectedDstINumUses) +
1705 " explicit ones and " + llvm::to_string(NumDefaultOps) +
1706 " default ones");
1708 return InsertPt;
1711 Error GlobalISelEmitter::importDefaultOperandRenderers(
1712 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1713 const DAGDefaultOperand &DefaultOp) const {
1714 for (const auto &Op : DefaultOp.DefaultOps) {
1715 const auto *N = Op.get();
1716 if (!N->isLeaf())
1717 return failedImport("Could not add default op");
1719 const auto *DefaultOp = N->getLeafValue();
1721 if (const DefInit *DefaultDefOp = dyn_cast<DefInit>(DefaultOp)) {
1722 std::optional<LLTCodeGen> OpTyOrNone = MVTToLLT(N->getSimpleType(0));
1723 auto Def = DefaultDefOp->getDef();
1724 if (Def->getName() == "undef_tied_input") {
1725 unsigned TempRegID = M.allocateTempRegID();
1726 M.insertAction<MakeTempRegisterAction>(InsertPt, *OpTyOrNone,
1727 TempRegID);
1728 InsertPt = M.insertAction<BuildMIAction>(
1729 InsertPt, M.allocateOutputInsnID(),
1730 &Target.getInstruction(RK.getDef("IMPLICIT_DEF")));
1731 BuildMIAction &IDMIBuilder =
1732 *static_cast<BuildMIAction *>(InsertPt->get());
1733 IDMIBuilder.addRenderer<TempRegRenderer>(TempRegID);
1734 DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID);
1735 } else {
1736 DstMIBuilder.addRenderer<AddRegisterRenderer>(Target, Def);
1738 continue;
1741 if (const IntInit *DefaultIntOp = dyn_cast<IntInit>(DefaultOp)) {
1742 DstMIBuilder.addRenderer<ImmRenderer>(DefaultIntOp->getValue());
1743 continue;
1746 return failedImport("Could not add default op");
1749 return Error::success();
1752 Error GlobalISelEmitter::importImplicitDefRenderers(
1753 BuildMIAction &DstMIBuilder,
1754 const std::vector<Record *> &ImplicitDefs) const {
1755 if (!ImplicitDefs.empty())
1756 return failedImport("Pattern defines a physical register");
1757 return Error::success();
1760 std::optional<const CodeGenRegisterClass *>
1761 GlobalISelEmitter::getRegClassFromLeaf(const TreePatternNode *Leaf) {
1762 assert(Leaf && "Expected node?");
1763 assert(Leaf->isLeaf() && "Expected leaf?");
1764 Record *RCRec = getInitValueAsRegClass(Leaf->getLeafValue());
1765 if (!RCRec)
1766 return std::nullopt;
1767 CodeGenRegisterClass *RC = CGRegs.getRegClass(RCRec);
1768 if (!RC)
1769 return std::nullopt;
1770 return RC;
1773 std::optional<const CodeGenRegisterClass *>
1774 GlobalISelEmitter::inferRegClassFromPattern(const TreePatternNode *N) {
1775 if (!N)
1776 return std::nullopt;
1778 if (N->isLeaf())
1779 return getRegClassFromLeaf(N);
1781 // We don't have a leaf node, so we have to try and infer something. Check
1782 // that we have an instruction that we an infer something from.
1784 // Only handle things that produce a single type.
1785 if (N->getNumTypes() != 1)
1786 return std::nullopt;
1787 Record *OpRec = N->getOperator();
1789 // We only want instructions.
1790 if (!OpRec->isSubClassOf("Instruction"))
1791 return std::nullopt;
1793 // Don't want to try and infer things when there could potentially be more
1794 // than one candidate register class.
1795 auto &Inst = Target.getInstruction(OpRec);
1796 if (Inst.Operands.NumDefs > 1)
1797 return std::nullopt;
1799 // Handle any special-case instructions which we can safely infer register
1800 // classes from.
1801 StringRef InstName = Inst.TheDef->getName();
1802 bool IsRegSequence = InstName == "REG_SEQUENCE";
1803 if (IsRegSequence || InstName == "COPY_TO_REGCLASS") {
1804 // If we have a COPY_TO_REGCLASS, then we need to handle it specially. It
1805 // has the desired register class as the first child.
1806 const TreePatternNode *RCChild = N->getChild(IsRegSequence ? 0 : 1);
1807 if (!RCChild->isLeaf())
1808 return std::nullopt;
1809 return getRegClassFromLeaf(RCChild);
1811 if (InstName == "INSERT_SUBREG") {
1812 const TreePatternNode *Child0 = N->getChild(0);
1813 assert(Child0->getNumTypes() == 1 && "Unexpected number of types!");
1814 const TypeSetByHwMode &VTy = Child0->getExtType(0);
1815 return inferSuperRegisterClassForNode(VTy, Child0, N->getChild(2));
1817 if (InstName == "EXTRACT_SUBREG") {
1818 assert(N->getNumTypes() == 1 && "Unexpected number of types!");
1819 const TypeSetByHwMode &VTy = N->getExtType(0);
1820 return inferSuperRegisterClass(VTy, N->getChild(1));
1823 // Handle destination record types that we can safely infer a register class
1824 // from.
1825 const auto &DstIOperand = Inst.Operands[0];
1826 Record *DstIOpRec = DstIOperand.Rec;
1827 if (DstIOpRec->isSubClassOf("RegisterOperand")) {
1828 DstIOpRec = DstIOpRec->getValueAsDef("RegClass");
1829 const CodeGenRegisterClass &RC = Target.getRegisterClass(DstIOpRec);
1830 return &RC;
1833 if (DstIOpRec->isSubClassOf("RegisterClass")) {
1834 const CodeGenRegisterClass &RC = Target.getRegisterClass(DstIOpRec);
1835 return &RC;
1838 return std::nullopt;
1841 std::optional<const CodeGenRegisterClass *>
1842 GlobalISelEmitter::inferSuperRegisterClass(
1843 const TypeSetByHwMode &Ty, const TreePatternNode *SubRegIdxNode) {
1844 assert(SubRegIdxNode && "Expected subregister index node!");
1845 // We need a ValueTypeByHwMode for getSuperRegForSubReg.
1846 if (!Ty.isValueTypeByHwMode(false))
1847 return std::nullopt;
1848 if (!SubRegIdxNode->isLeaf())
1849 return std::nullopt;
1850 DefInit *SubRegInit = dyn_cast<DefInit>(SubRegIdxNode->getLeafValue());
1851 if (!SubRegInit)
1852 return std::nullopt;
1853 CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx(SubRegInit->getDef());
1855 // Use the information we found above to find a minimal register class which
1856 // supports the subregister and type we want.
1857 auto RC =
1858 Target.getSuperRegForSubReg(Ty.getValueTypeByHwMode(), CGRegs, SubIdx,
1859 /* MustBeAllocatable */ true);
1860 if (!RC)
1861 return std::nullopt;
1862 return *RC;
1865 std::optional<const CodeGenRegisterClass *>
1866 GlobalISelEmitter::inferSuperRegisterClassForNode(
1867 const TypeSetByHwMode &Ty, const TreePatternNode *SuperRegNode,
1868 const TreePatternNode *SubRegIdxNode) {
1869 assert(SuperRegNode && "Expected super register node!");
1870 // Check if we already have a defined register class for the super register
1871 // node. If we do, then we should preserve that rather than inferring anything
1872 // from the subregister index node. We can assume that whoever wrote the
1873 // pattern in the first place made sure that the super register and
1874 // subregister are compatible.
1875 if (std::optional<const CodeGenRegisterClass *> SuperRegisterClass =
1876 inferRegClassFromPattern(SuperRegNode))
1877 return *SuperRegisterClass;
1878 return inferSuperRegisterClass(Ty, SubRegIdxNode);
1881 std::optional<CodeGenSubRegIndex *> GlobalISelEmitter::inferSubRegIndexForNode(
1882 const TreePatternNode *SubRegIdxNode) {
1883 if (!SubRegIdxNode->isLeaf())
1884 return std::nullopt;
1886 DefInit *SubRegInit = dyn_cast<DefInit>(SubRegIdxNode->getLeafValue());
1887 if (!SubRegInit)
1888 return std::nullopt;
1889 return CGRegs.getSubRegIdx(SubRegInit->getDef());
1892 Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
1893 // Keep track of the matchers and actions to emit.
1894 int Score = P.getPatternComplexity(CGP);
1895 RuleMatcher M(P.getSrcRecord()->getLoc());
1896 RuleMatcherScores[M.getRuleID()] = Score;
1897 M.addAction<DebugCommentAction>(llvm::to_string(*P.getSrcPattern()) +
1898 " => " +
1899 llvm::to_string(*P.getDstPattern()));
1901 SmallVector<Record *, 4> Predicates;
1902 P.getPredicateRecords(Predicates);
1903 if (auto Error = importRulePredicates(M, Predicates))
1904 return std::move(Error);
1906 if (!P.getHwModeFeatures().empty())
1907 M.addHwModeIdx(declareHwModeCheck(P.getHwModeFeatures()));
1909 // Next, analyze the pattern operators.
1910 TreePatternNode *Src = P.getSrcPattern();
1911 TreePatternNode *Dst = P.getDstPattern();
1913 // If the root of either pattern isn't a simple operator, ignore it.
1914 if (auto Err = isTrivialOperatorNode(Dst))
1915 return failedImport("Dst pattern root isn't a trivial operator (" +
1916 toString(std::move(Err)) + ")");
1917 if (auto Err = isTrivialOperatorNode(Src))
1918 return failedImport("Src pattern root isn't a trivial operator (" +
1919 toString(std::move(Err)) + ")");
1921 // The different predicates and matchers created during
1922 // addInstructionMatcher use the RuleMatcher M to set up their
1923 // instruction ID (InsnVarID) that are going to be used when
1924 // M is going to be emitted.
1925 // However, the code doing the emission still relies on the IDs
1926 // returned during that process by the RuleMatcher when issuing
1927 // the recordInsn opcodes.
1928 // Because of that:
1929 // 1. The order in which we created the predicates
1930 // and such must be the same as the order in which we emit them,
1931 // and
1932 // 2. We need to reset the generation of the IDs in M somewhere between
1933 // addInstructionMatcher and emit
1935 // FIXME: Long term, we don't want to have to rely on this implicit
1936 // naming being the same. One possible solution would be to have
1937 // explicit operator for operation capture and reference those.
1938 // The plus side is that it would expose opportunities to share
1939 // the capture accross rules. The downside is that it would
1940 // introduce a dependency between predicates (captures must happen
1941 // before their first use.)
1942 InstructionMatcher &InsnMatcherTemp = M.addInstructionMatcher(Src->getName());
1943 unsigned TempOpIdx = 0;
1945 const auto SavedFlags = M.setGISelFlags(P.getSrcRecord());
1947 auto InsnMatcherOrError =
1948 createAndImportSelDAGMatcher(M, InsnMatcherTemp, Src, TempOpIdx);
1949 if (auto Error = InsnMatcherOrError.takeError())
1950 return std::move(Error);
1951 InstructionMatcher &InsnMatcher = InsnMatcherOrError.get();
1953 if (Dst->isLeaf()) {
1954 Record *RCDef = getInitValueAsRegClass(Dst->getLeafValue());
1955 if (RCDef) {
1956 const CodeGenRegisterClass &RC = Target.getRegisterClass(RCDef);
1958 // We need to replace the def and all its uses with the specified
1959 // operand. However, we must also insert COPY's wherever needed.
1960 // For now, emit a copy and let the register allocator clean up.
1961 auto &DstI = Target.getInstruction(RK.getDef("COPY"));
1962 const auto &DstIOperand = DstI.Operands[0];
1964 OperandMatcher &OM0 = InsnMatcher.getOperand(0);
1965 OM0.setSymbolicName(DstIOperand.Name);
1966 M.defineOperand(OM0.getSymbolicName(), OM0);
1967 OM0.addPredicate<RegisterBankOperandMatcher>(RC);
1969 auto &DstMIBuilder =
1970 M.addAction<BuildMIAction>(M.allocateOutputInsnID(), &DstI);
1971 DstMIBuilder.addRenderer<CopyRenderer>(DstIOperand.Name);
1972 DstMIBuilder.addRenderer<CopyRenderer>(Dst->getName());
1973 M.addAction<ConstrainOperandToRegClassAction>(0, 0, RC);
1975 // Erase the root.
1976 unsigned RootInsnID = M.getInsnVarID(InsnMatcher);
1977 M.addAction<EraseInstAction>(RootInsnID);
1979 // We're done with this pattern! It's eligible for GISel emission; return
1980 // it.
1981 ++NumPatternImported;
1982 return std::move(M);
1985 return failedImport("Dst pattern root isn't a known leaf");
1988 // Start with the defined operands (i.e., the results of the root operator).
1989 Record *DstOp = Dst->getOperator();
1990 if (!DstOp->isSubClassOf("Instruction"))
1991 return failedImport("Pattern operator isn't an instruction");
1993 auto &DstI = Target.getInstruction(DstOp);
1994 StringRef DstIName = DstI.TheDef->getName();
1996 unsigned DstNumDefs = DstI.Operands.NumDefs,
1997 SrcNumDefs = Src->getExtTypes().size();
1998 if (DstNumDefs < SrcNumDefs) {
1999 if (DstNumDefs != 0)
2000 return failedImport("Src pattern result has more defs than dst MI (" +
2001 to_string(SrcNumDefs) + " def(s) vs " +
2002 to_string(DstNumDefs) + " def(s))");
2004 bool FoundNoUsePred = false;
2005 for (const auto &Pred : InsnMatcher.predicates()) {
2006 if ((FoundNoUsePred = isa<NoUsePredicateMatcher>(Pred.get())))
2007 break;
2009 if (!FoundNoUsePred)
2010 return failedImport("Src pattern result has " + to_string(SrcNumDefs) +
2011 " def(s) without the HasNoUse predicate set to true "
2012 "but Dst MI has no def");
2015 // The root of the match also has constraints on the register bank so that it
2016 // matches the result instruction.
2017 unsigned OpIdx = 0;
2018 unsigned N = std::min(DstNumDefs, SrcNumDefs);
2019 for (unsigned I = 0; I < N; ++I) {
2020 const TypeSetByHwMode &VTy = Src->getExtType(I);
2022 const auto &DstIOperand = DstI.Operands[OpIdx];
2023 PointerUnion<Record *, const CodeGenRegisterClass *> MatchedRC =
2024 DstIOperand.Rec;
2025 if (DstIName == "COPY_TO_REGCLASS") {
2026 MatchedRC = getInitValueAsRegClass(Dst->getChild(1)->getLeafValue());
2028 if (MatchedRC.isNull())
2029 return failedImport(
2030 "COPY_TO_REGCLASS operand #1 isn't a register class");
2031 } else if (DstIName == "REG_SEQUENCE") {
2032 MatchedRC = getInitValueAsRegClass(Dst->getChild(0)->getLeafValue());
2033 if (MatchedRC.isNull())
2034 return failedImport("REG_SEQUENCE operand #0 isn't a register class");
2035 } else if (DstIName == "EXTRACT_SUBREG") {
2036 auto InferredClass = inferRegClassFromPattern(Dst->getChild(0));
2037 if (!InferredClass)
2038 return failedImport(
2039 "Could not infer class for EXTRACT_SUBREG operand #0");
2041 // We can assume that a subregister is in the same bank as it's super
2042 // register.
2043 MatchedRC = (*InferredClass)->getDef();
2044 } else if (DstIName == "INSERT_SUBREG") {
2045 auto MaybeSuperClass = inferSuperRegisterClassForNode(
2046 VTy, Dst->getChild(0), Dst->getChild(2));
2047 if (!MaybeSuperClass)
2048 return failedImport(
2049 "Cannot infer register class for INSERT_SUBREG operand #0");
2050 // Move to the next pattern here, because the register class we found
2051 // doesn't necessarily have a record associated with it. So, we can't
2052 // set DstIOpRec using this.
2053 MatchedRC = *MaybeSuperClass;
2054 } else if (DstIName == "SUBREG_TO_REG") {
2055 auto MaybeRegClass = inferSuperRegisterClass(VTy, Dst->getChild(2));
2056 if (!MaybeRegClass)
2057 return failedImport(
2058 "Cannot infer register class for SUBREG_TO_REG operand #0");
2059 MatchedRC = *MaybeRegClass;
2060 } else if (MatchedRC.get<Record *>()->isSubClassOf("RegisterOperand"))
2061 MatchedRC = MatchedRC.get<Record *>()->getValueAsDef("RegClass");
2062 else if (!MatchedRC.get<Record *>()->isSubClassOf("RegisterClass"))
2063 return failedImport("Dst MI def isn't a register class" +
2064 to_string(*Dst));
2066 OperandMatcher &OM = InsnMatcher.getOperand(OpIdx);
2067 // The operand names declared in the DstI instruction are unrelated to
2068 // those used in pattern's source and destination DAGs, so mangle the
2069 // former to prevent implicitly adding unexpected
2070 // GIM_CheckIsSameOperand predicates by the defineOperand method.
2071 OM.setSymbolicName(getMangledRootDefName(DstIOperand.Name));
2072 M.defineOperand(OM.getSymbolicName(), OM);
2073 if (MatchedRC.is<Record *>())
2074 MatchedRC = &Target.getRegisterClass(MatchedRC.get<Record *>());
2075 OM.addPredicate<RegisterBankOperandMatcher>(
2076 *MatchedRC.get<const CodeGenRegisterClass *>());
2077 ++OpIdx;
2080 auto DstMIBuilderOrError =
2081 createAndImportInstructionRenderer(M, InsnMatcher, Src, Dst);
2082 if (auto Error = DstMIBuilderOrError.takeError())
2083 return std::move(Error);
2084 BuildMIAction &DstMIBuilder = DstMIBuilderOrError.get();
2086 // Render the implicit defs.
2087 // These are only added to the root of the result.
2088 if (auto Error = importImplicitDefRenderers(DstMIBuilder, P.getDstRegs()))
2089 return std::move(Error);
2091 DstMIBuilder.chooseInsnToMutate(M);
2093 // Constrain the registers to classes. This is normally derived from the
2094 // emitted instruction but a few instructions require special handling.
2095 if (DstIName == "COPY_TO_REGCLASS") {
2096 // COPY_TO_REGCLASS does not provide operand constraints itself but the
2097 // result is constrained to the class given by the second child.
2098 Record *DstIOpRec =
2099 getInitValueAsRegClass(Dst->getChild(1)->getLeafValue());
2101 if (DstIOpRec == nullptr)
2102 return failedImport("COPY_TO_REGCLASS operand #1 isn't a register class");
2104 M.addAction<ConstrainOperandToRegClassAction>(
2105 0, 0, Target.getRegisterClass(DstIOpRec));
2106 } else if (DstIName == "EXTRACT_SUBREG") {
2107 auto SuperClass = inferRegClassFromPattern(Dst->getChild(0));
2108 if (!SuperClass)
2109 return failedImport(
2110 "Cannot infer register class from EXTRACT_SUBREG operand #0");
2112 auto SubIdx = inferSubRegIndexForNode(Dst->getChild(1));
2113 if (!SubIdx)
2114 return failedImport("EXTRACT_SUBREG child #1 is not a subreg index");
2116 // It would be nice to leave this constraint implicit but we're required
2117 // to pick a register class so constrain the result to a register class
2118 // that can hold the correct MVT.
2120 // FIXME: This may introduce an extra copy if the chosen class doesn't
2121 // actually contain the subregisters.
2122 assert(Src->getExtTypes().size() == 1 &&
2123 "Expected Src of EXTRACT_SUBREG to have one result type");
2125 const auto SrcRCDstRCPair =
2126 (*SuperClass)->getMatchingSubClassWithSubRegs(CGRegs, *SubIdx);
2127 if (!SrcRCDstRCPair) {
2128 return failedImport("subreg index is incompatible "
2129 "with inferred reg class");
2132 assert(SrcRCDstRCPair->second && "Couldn't find a matching subclass");
2133 M.addAction<ConstrainOperandToRegClassAction>(0, 0,
2134 *SrcRCDstRCPair->second);
2135 M.addAction<ConstrainOperandToRegClassAction>(0, 1, *SrcRCDstRCPair->first);
2136 } else if (DstIName == "INSERT_SUBREG") {
2137 assert(Src->getExtTypes().size() == 1 &&
2138 "Expected Src of INSERT_SUBREG to have one result type");
2139 // We need to constrain the destination, a super regsister source, and a
2140 // subregister source.
2141 auto SubClass = inferRegClassFromPattern(Dst->getChild(1));
2142 if (!SubClass)
2143 return failedImport(
2144 "Cannot infer register class from INSERT_SUBREG operand #1");
2145 auto SuperClass = inferSuperRegisterClassForNode(
2146 Src->getExtType(0), Dst->getChild(0), Dst->getChild(2));
2147 if (!SuperClass)
2148 return failedImport(
2149 "Cannot infer register class for INSERT_SUBREG operand #0");
2150 M.addAction<ConstrainOperandToRegClassAction>(0, 0, **SuperClass);
2151 M.addAction<ConstrainOperandToRegClassAction>(0, 1, **SuperClass);
2152 M.addAction<ConstrainOperandToRegClassAction>(0, 2, **SubClass);
2153 } else if (DstIName == "SUBREG_TO_REG") {
2154 // We need to constrain the destination and subregister source.
2155 assert(Src->getExtTypes().size() == 1 &&
2156 "Expected Src of SUBREG_TO_REG to have one result type");
2158 // Attempt to infer the subregister source from the first child. If it has
2159 // an explicitly given register class, we'll use that. Otherwise, we will
2160 // fail.
2161 auto SubClass = inferRegClassFromPattern(Dst->getChild(1));
2162 if (!SubClass)
2163 return failedImport(
2164 "Cannot infer register class from SUBREG_TO_REG child #1");
2165 // We don't have a child to look at that might have a super register node.
2166 auto SuperClass =
2167 inferSuperRegisterClass(Src->getExtType(0), Dst->getChild(2));
2168 if (!SuperClass)
2169 return failedImport(
2170 "Cannot infer register class for SUBREG_TO_REG operand #0");
2171 M.addAction<ConstrainOperandToRegClassAction>(0, 0, **SuperClass);
2172 M.addAction<ConstrainOperandToRegClassAction>(0, 2, **SubClass);
2173 } else if (DstIName == "REG_SEQUENCE") {
2174 auto SuperClass = inferRegClassFromPattern(Dst->getChild(0));
2176 M.addAction<ConstrainOperandToRegClassAction>(0, 0, **SuperClass);
2178 unsigned Num = Dst->getNumChildren();
2179 for (unsigned I = 1; I != Num; I += 2) {
2180 TreePatternNode *SubRegChild = Dst->getChild(I + 1);
2182 auto SubIdx = inferSubRegIndexForNode(SubRegChild);
2183 if (!SubIdx)
2184 return failedImport("REG_SEQUENCE child is not a subreg index");
2186 const auto SrcRCDstRCPair =
2187 (*SuperClass)->getMatchingSubClassWithSubRegs(CGRegs, *SubIdx);
2189 M.addAction<ConstrainOperandToRegClassAction>(0, I,
2190 *SrcRCDstRCPair->second);
2192 } else {
2193 M.addAction<ConstrainOperandsToDefinitionAction>(0);
2196 // Erase the root.
2197 unsigned RootInsnID = M.getInsnVarID(InsnMatcher);
2198 M.addAction<EraseInstAction>(RootInsnID);
2200 // We're done with this pattern! It's eligible for GISel emission; return it.
2201 ++NumPatternImported;
2202 return std::move(M);
2205 MatchTable
2206 GlobalISelEmitter::buildMatchTable(MutableArrayRef<RuleMatcher> Rules,
2207 bool Optimize, bool WithCoverage) {
2208 std::vector<Matcher *> InputRules;
2209 for (Matcher &Rule : Rules)
2210 InputRules.push_back(&Rule);
2212 if (!Optimize)
2213 return MatchTable::buildTable(InputRules, WithCoverage);
2215 unsigned CurrentOrdering = 0;
2216 StringMap<unsigned> OpcodeOrder;
2217 for (RuleMatcher &Rule : Rules) {
2218 const StringRef Opcode = Rule.getOpcode();
2219 assert(!Opcode.empty() && "Didn't expect an undefined opcode");
2220 if (OpcodeOrder.count(Opcode) == 0)
2221 OpcodeOrder[Opcode] = CurrentOrdering++;
2224 llvm::stable_sort(InputRules, [&OpcodeOrder](const Matcher *A,
2225 const Matcher *B) {
2226 auto *L = static_cast<const RuleMatcher *>(A);
2227 auto *R = static_cast<const RuleMatcher *>(B);
2228 return std::make_tuple(OpcodeOrder[L->getOpcode()], L->getNumOperands()) <
2229 std::make_tuple(OpcodeOrder[R->getOpcode()], R->getNumOperands());
2232 for (Matcher *Rule : InputRules)
2233 Rule->optimize();
2235 std::vector<std::unique_ptr<Matcher>> MatcherStorage;
2236 std::vector<Matcher *> OptRules =
2237 optimizeRules<GroupMatcher>(InputRules, MatcherStorage);
2239 for (Matcher *Rule : OptRules)
2240 Rule->optimize();
2242 OptRules = optimizeRules<SwitchMatcher>(OptRules, MatcherStorage);
2244 return MatchTable::buildTable(OptRules, WithCoverage);
2247 void GlobalISelEmitter::emitAdditionalImpl(raw_ostream &OS) {
2248 OS << "bool " << getClassName()
2249 << "::selectImpl(MachineInstr &I, CodeGenCoverage "
2250 "&CoverageInfo) const {\n"
2251 << " const PredicateBitset AvailableFeatures = "
2252 "getAvailableFeatures();\n"
2253 << " MachineIRBuilder B(I);\n"
2254 << " State.MIs.clear();\n"
2255 << " State.MIs.push_back(&I);\n\n"
2256 << " if (executeMatchTable(*this, State, ExecInfo, B"
2257 << ", getMatchTable(), TII, MF->getRegInfo(), TRI, RBI, AvailableFeatures"
2258 << ", &CoverageInfo)) {\n"
2259 << " return true;\n"
2260 << " }\n\n"
2261 << " return false;\n"
2262 << "}\n\n";
2265 void GlobalISelEmitter::emitMIPredicateFns(raw_ostream &OS) {
2266 std::vector<Record *> MatchedRecords;
2267 std::copy_if(AllPatFrags.begin(), AllPatFrags.end(),
2268 std::back_inserter(MatchedRecords), [&](Record *R) {
2269 return !R->getValueAsString("GISelPredicateCode").empty();
2271 emitMIPredicateFnsImpl<Record *>(
2273 " const MachineFunction &MF = *MI.getParent()->getParent();\n"
2274 " const MachineRegisterInfo &MRI = MF.getRegInfo();\n"
2275 " const auto &Operands = State.RecordedOperands;\n"
2276 " (void)Operands;\n"
2277 " (void)MRI;",
2278 ArrayRef<Record *>(MatchedRecords), &getPatFragPredicateEnumName,
2279 [&](Record *R) { return R->getValueAsString("GISelPredicateCode"); },
2280 "PatFrag predicates.");
2283 void GlobalISelEmitter::emitI64ImmPredicateFns(raw_ostream &OS) {
2284 std::vector<Record *> MatchedRecords;
2285 std::copy_if(AllPatFrags.begin(), AllPatFrags.end(),
2286 std::back_inserter(MatchedRecords), [&](Record *R) {
2287 bool Unset;
2288 return !R->getValueAsString("ImmediateCode").empty() &&
2289 !R->getValueAsBitOrUnset("IsAPFloat", Unset) &&
2290 !R->getValueAsBit("IsAPInt");
2292 emitImmPredicateFnsImpl<Record *>(
2293 OS, "I64", "int64_t", ArrayRef<Record *>(MatchedRecords),
2294 &getPatFragPredicateEnumName,
2295 [&](Record *R) { return R->getValueAsString("ImmediateCode"); },
2296 "PatFrag predicates.");
2299 void GlobalISelEmitter::emitAPFloatImmPredicateFns(raw_ostream &OS) {
2300 std::vector<Record *> MatchedRecords;
2301 std::copy_if(AllPatFrags.begin(), AllPatFrags.end(),
2302 std::back_inserter(MatchedRecords), [&](Record *R) {
2303 bool Unset;
2304 return !R->getValueAsString("ImmediateCode").empty() &&
2305 R->getValueAsBitOrUnset("IsAPFloat", Unset);
2307 emitImmPredicateFnsImpl<Record *>(
2308 OS, "APFloat", "const APFloat &", ArrayRef<Record *>(MatchedRecords),
2309 &getPatFragPredicateEnumName,
2310 [&](Record *R) { return R->getValueAsString("ImmediateCode"); },
2311 "PatFrag predicates.");
2314 void GlobalISelEmitter::emitAPIntImmPredicateFns(raw_ostream &OS) {
2315 std::vector<Record *> MatchedRecords;
2316 std::copy_if(AllPatFrags.begin(), AllPatFrags.end(),
2317 std::back_inserter(MatchedRecords), [&](Record *R) {
2318 return !R->getValueAsString("ImmediateCode").empty() &&
2319 R->getValueAsBit("IsAPInt");
2321 emitImmPredicateFnsImpl<Record *>(
2322 OS, "APInt", "const APInt &", ArrayRef<Record *>(MatchedRecords),
2323 &getPatFragPredicateEnumName,
2324 [&](Record *R) { return R->getValueAsString("ImmediateCode"); },
2325 "PatFrag predicates.");
2328 void GlobalISelEmitter::emitTestSimplePredicate(raw_ostream &OS) {
2329 OS << "bool " << getClassName() << "::testSimplePredicate(unsigned) const {\n"
2330 << " llvm_unreachable(\"" + getClassName() +
2331 " does not support simple predicates!\");\n"
2332 << " return false;\n"
2333 << "}\n";
2336 void GlobalISelEmitter::emitRunCustomAction(raw_ostream &OS) {
2337 OS << "void " << getClassName()
2338 << "::runCustomAction(unsigned, const MatcherState&, NewMIVector &) const "
2339 "{\n"
2340 << " llvm_unreachable(\"" + getClassName() +
2341 " does not support custom C++ actions!\");\n"
2342 << "}\n";
2345 void GlobalISelEmitter::postProcessRule(RuleMatcher &M) {
2346 SmallPtrSet<Record *, 16> UsedRegs;
2348 // TODO: deal with subregs?
2349 for (auto &A : M.actions()) {
2350 auto *MI = dyn_cast<BuildMIAction>(A.get());
2351 if (!MI)
2352 continue;
2354 for (auto *Use : MI->getCGI()->ImplicitUses)
2355 UsedRegs.insert(Use);
2358 for (auto &A : M.actions()) {
2359 auto *MI = dyn_cast<BuildMIAction>(A.get());
2360 if (!MI)
2361 continue;
2363 for (auto *Def : MI->getCGI()->ImplicitDefs) {
2364 if (!UsedRegs.contains(Def))
2365 MI->setDeadImplicitDef(Def);
2370 void GlobalISelEmitter::run(raw_ostream &OS) {
2371 if (!UseCoverageFile.empty()) {
2372 RuleCoverage = CodeGenCoverage();
2373 auto RuleCoverageBufOrErr = MemoryBuffer::getFile(UseCoverageFile);
2374 if (!RuleCoverageBufOrErr) {
2375 PrintWarning(SMLoc(), "Missing rule coverage data");
2376 RuleCoverage = std::nullopt;
2377 } else {
2378 if (!RuleCoverage->parse(*RuleCoverageBufOrErr.get(), Target.getName())) {
2379 PrintWarning(SMLoc(), "Ignoring invalid or missing rule coverage data");
2380 RuleCoverage = std::nullopt;
2385 // Track the run-time opcode values
2386 gatherOpcodeValues();
2387 // Track the run-time LLT ID values
2388 gatherTypeIDValues();
2390 // Track the GINodeEquiv definitions.
2391 gatherNodeEquivs();
2393 AllPatFrags = RK.getAllDerivedDefinitions("PatFrags");
2395 emitSourceFileHeader(
2396 ("Global Instruction Selector for the " + Target.getName() + " target")
2397 .str(),
2398 OS);
2399 std::vector<RuleMatcher> Rules;
2400 // Look through the SelectionDAG patterns we found, possibly emitting some.
2401 for (const PatternToMatch &Pat : CGP.ptms()) {
2402 ++NumPatternTotal;
2404 auto MatcherOrErr = runOnPattern(Pat);
2406 // The pattern analysis can fail, indicating an unsupported pattern.
2407 // Report that if we've been asked to do so.
2408 if (auto Err = MatcherOrErr.takeError()) {
2409 if (WarnOnSkippedPatterns) {
2410 PrintWarning(Pat.getSrcRecord()->getLoc(),
2411 "Skipped pattern: " + toString(std::move(Err)));
2412 } else {
2413 consumeError(std::move(Err));
2415 ++NumPatternImportsSkipped;
2416 continue;
2419 if (RuleCoverage) {
2420 if (RuleCoverage->isCovered(MatcherOrErr->getRuleID()))
2421 ++NumPatternsTested;
2422 else
2423 PrintWarning(Pat.getSrcRecord()->getLoc(),
2424 "Pattern is not covered by a test");
2426 Rules.push_back(std::move(MatcherOrErr.get()));
2427 postProcessRule(Rules.back());
2430 // Comparison function to order records by name.
2431 auto orderByName = [](const Record *A, const Record *B) {
2432 return A->getName() < B->getName();
2435 std::vector<Record *> ComplexPredicates =
2436 RK.getAllDerivedDefinitions("GIComplexOperandMatcher");
2437 llvm::sort(ComplexPredicates, orderByName);
2439 std::vector<StringRef> CustomRendererFns;
2440 transform(RK.getAllDerivedDefinitions("GICustomOperandRenderer"),
2441 std::back_inserter(CustomRendererFns), [](const auto &Record) {
2442 return Record->getValueAsString("RendererFn");
2444 // Sort and remove duplicates to get a list of unique renderer functions, in
2445 // case some were mentioned more than once.
2446 llvm::sort(CustomRendererFns);
2447 CustomRendererFns.erase(
2448 std::unique(CustomRendererFns.begin(), CustomRendererFns.end()),
2449 CustomRendererFns.end());
2451 // Create a table containing the LLT objects needed by the matcher and an enum
2452 // for the matcher to reference them with.
2453 std::vector<LLTCodeGen> TypeObjects;
2454 append_range(TypeObjects, KnownTypes);
2455 llvm::sort(TypeObjects);
2457 // Sort rules.
2458 llvm::stable_sort(Rules, [&](const RuleMatcher &A, const RuleMatcher &B) {
2459 int ScoreA = RuleMatcherScores[A.getRuleID()];
2460 int ScoreB = RuleMatcherScores[B.getRuleID()];
2461 if (ScoreA > ScoreB)
2462 return true;
2463 if (ScoreB > ScoreA)
2464 return false;
2465 if (A.isHigherPriorityThan(B)) {
2466 assert(!B.isHigherPriorityThan(A) && "Cannot be more important "
2467 "and less important at "
2468 "the same time");
2469 return true;
2471 return false;
2474 unsigned MaxTemporaries = 0;
2475 for (const auto &Rule : Rules)
2476 MaxTemporaries = std::max(MaxTemporaries, Rule.countRendererFns());
2478 // Build match table
2479 const MatchTable Table =
2480 buildMatchTable(Rules, OptimizeMatchTable, GenerateCoverage);
2482 emitPredicateBitset(OS, "GET_GLOBALISEL_PREDICATE_BITSET");
2483 emitTemporariesDecl(OS, "GET_GLOBALISEL_TEMPORARIES_DECL");
2484 emitTemporariesInit(OS, MaxTemporaries, "GET_GLOBALISEL_TEMPORARIES_INIT");
2485 emitExecutorImpl(OS, Table, TypeObjects, Rules, ComplexPredicates,
2486 CustomRendererFns, "GET_GLOBALISEL_IMPL");
2487 emitPredicatesDecl(OS, "GET_GLOBALISEL_PREDICATES_DECL");
2488 emitPredicatesInit(OS, "GET_GLOBALISEL_PREDICATES_INIT");
2491 void GlobalISelEmitter::declareSubtargetFeature(Record *Predicate) {
2492 SubtargetFeatures.try_emplace(Predicate, Predicate, SubtargetFeatures.size());
2495 unsigned GlobalISelEmitter::declareHwModeCheck(StringRef HwModeFeatures) {
2496 return HwModes.emplace(HwModeFeatures.str(), HwModes.size()).first->second;
2499 } // end anonymous namespace
2501 //===----------------------------------------------------------------------===//
2503 static TableGen::Emitter::OptClass<GlobalISelEmitter>
2504 X("gen-global-isel", "Generate GlobalISel selector");