1//===--- CodeGenHwModes.h ---------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8// Classes to parse and store HW mode information for instruction selection.
9//===----------------------------------------------------------------------===//
10
11#ifndef LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H
12#define LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H
13
14#include "SubtargetFeatureInfo.h"
15#include "llvm/ADT/ArrayRef.h"
16#include "llvm/ADT/DenseMap.h"
17#include "llvm/ADT/StringRef.h"
18#include <cassert>
19#include <map>
20#include <set>
21#include <utility>
22#include <vector>
23
24// HwModeId -> list of predicates (definition)
25
26namespace llvm {
27class Record;
28class RecordKeeper;
29
30struct CodeGenHwModes;
31
32struct HwModePredicates {
33 std::set<SubtargetFeatureLiteral> FeaturesSet;
34 std::set<std::set<SubtargetFeatureLiteral>> AnyOfFeatureSets;
35 bool HasNonAsmPredicates = false;
36
37 HwModePredicates() = default;
38 HwModePredicates(ArrayRef<const Record *> Preds);
39
40 static HwModePredicates createForDefaultMode(const CodeGenHwModes &CGH);
41 void add(const HwModePredicates &Other);
42 bool isSelfContradictory();
43 bool conflictsWith(const HwModePredicates &Other) const;
44};
45
46struct HwMode {
47 HwMode(const Record *R);
48 StringRef Name;
49 std::vector<const Record *> Predicates;
50 void dump() const;
51};
52
53struct HwModeSelect {
54 HwModeSelect(const Record *R, CodeGenHwModes &CGH);
55 using PairType = std::pair<unsigned, const Record *>;
56 std::vector<PairType> Items;
57 void dump() const;
58};
59
60struct CodeGenHwModes {
61 enum : unsigned { DefaultMode = 0 };
62 static StringRef DefaultModeName;
63
64 CodeGenHwModes(const RecordKeeper &R);
65 unsigned getHwModeId(const Record *R) const;
66 const HwMode &getMode(unsigned Id) const {
67 assert(Id != 0 && "Mode id of 0 is reserved for the default mode");
68 return Modes[Id - 1];
69 }
70 StringRef getModeName(unsigned Id, bool IncludeDefault = false) const {
71 if (IncludeDefault && Id == CodeGenHwModes::DefaultMode)
72 return DefaultModeName;
73 return getMode(Id).Name;
74 }
75 const HwModeSelect &getHwModeSelect(const Record *R) const;
76 const HwModePredicates &getModePredicates(unsigned ModeId) const;
77 const Record *resolveModeSelect(const Record *SelectRec,
78 ArrayRef<const Record *> PatPreds) const;
79 const std::map<const Record *, HwModeSelect> &getHwModeSelects() const {
80 return ModeSelects;
81 }
82 unsigned getNumModeIds() const { return Modes.size() + 1; }
83 void dump() const;
84
85private:
86 const RecordKeeper &Records;
87 DenseMap<const Record *, unsigned> ModeIds; // HwMode Record -> HwModeId
88 std::vector<HwMode> Modes;
89 std::map<const Record *, HwModeSelect> ModeSelects;
90 mutable std::vector<HwModePredicates> PredicatesByMode;
91};
92} // namespace llvm
93
94#endif // LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H
95