]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/Hexagon/RDFRegisters.h
Merge clang trunk r300422 and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / Hexagon / RDFRegisters.h
1 //===--- RDFRegisters.h -----------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef LLVM_LIB_TARGET_HEXAGON_RDFREGISTERS_H
11 #define LLVM_LIB_TARGET_HEXAGON_RDFREGISTERS_H
12
13 #include "llvm/ADT/BitVector.h"
14 #include "llvm/Target/TargetRegisterInfo.h"
15
16 #include <set>
17 #include <unordered_map>
18 #include <vector>
19
20 namespace llvm {
21 namespace rdf {
22
23   typedef uint32_t RegisterId;
24
25   // Template class for a map translating uint32_t into arbitrary types.
26   // The map will act like an indexed set: upon insertion of a new object,
27   // it will automatically assign a new index to it. Index of 0 is treated
28   // as invalid and is never allocated.
29   template <typename T, unsigned N = 32>
30   struct IndexedSet {
31     IndexedSet() : Map() { Map.reserve(N); }
32
33     T get(uint32_t Idx) const {
34       // Index Idx corresponds to Map[Idx-1].
35       assert(Idx != 0 && !Map.empty() && Idx-1 < Map.size());
36       return Map[Idx-1];
37     }
38
39     uint32_t insert(T Val) {
40       // Linear search.
41       auto F = llvm::find(Map, Val);
42       if (F != Map.end())
43         return F - Map.begin() + 1;
44       Map.push_back(Val);
45       return Map.size();  // Return actual_index + 1.
46     }
47
48     uint32_t find(T Val) const {
49       auto F = llvm::find(Map, Val);
50       assert(F != Map.end());
51       return F - Map.begin() + 1;
52     }
53
54     typedef typename std::vector<T>::const_iterator const_iterator;
55     const_iterator begin() const { return Map.begin(); }
56     const_iterator end() const { return Map.end(); }
57
58   private:
59     std::vector<T> Map;
60   };
61
62   struct RegisterRef {
63     RegisterId Reg = 0;
64     LaneBitmask Mask = LaneBitmask::getNone();
65
66     RegisterRef() = default;
67     explicit RegisterRef(RegisterId R, LaneBitmask M = LaneBitmask::getAll())
68       : Reg(R), Mask(R != 0 ? M : LaneBitmask::getNone()) {}
69
70     operator bool() const {
71       return Reg != 0 && Mask.any();
72     }
73     bool operator== (const RegisterRef &RR) const {
74       return Reg == RR.Reg && Mask == RR.Mask;
75     }
76     bool operator!= (const RegisterRef &RR) const {
77       return !operator==(RR);
78     }
79     bool operator< (const RegisterRef &RR) const {
80       return Reg < RR.Reg || (Reg == RR.Reg && Mask < RR.Mask);
81     }
82   };
83
84
85   struct PhysicalRegisterInfo {
86     PhysicalRegisterInfo(const TargetRegisterInfo &tri,
87                          const MachineFunction &mf);
88
89     static bool isRegMaskId(RegisterId R) {
90       return TargetRegisterInfo::isStackSlot(R);
91     }
92     RegisterId getRegMaskId(const uint32_t *RM) const {
93       return TargetRegisterInfo::index2StackSlot(RegMasks.find(RM));
94     }
95     const uint32_t *getRegMaskBits(RegisterId R) const {
96       return RegMasks.get(TargetRegisterInfo::stackSlot2Index(R));
97     }
98     RegisterRef normalize(RegisterRef RR) const;
99
100     bool alias(RegisterRef RA, RegisterRef RB) const {
101       if (!isRegMaskId(RA.Reg))
102         return !isRegMaskId(RB.Reg) ? aliasRR(RA, RB) : aliasRM(RA, RB);
103       return !isRegMaskId(RB.Reg) ? aliasRM(RB, RA) : aliasMM(RA, RB);
104     }
105     std::set<RegisterId> getAliasSet(RegisterId Reg) const;
106
107     RegisterRef getRefForUnit(uint32_t U) const {
108       return RegisterRef(UnitInfos[U].Reg, UnitInfos[U].Mask);
109     }
110
111     const TargetRegisterInfo &getTRI() const { return TRI; }
112
113   private:
114     struct RegInfo {
115       const TargetRegisterClass *RegClass = nullptr;
116     };
117     struct UnitInfo {
118       RegisterId Reg = 0;
119       LaneBitmask Mask;
120     };
121
122     const TargetRegisterInfo &TRI;
123     std::vector<RegInfo> RegInfos;
124     std::vector<UnitInfo> UnitInfos;
125     IndexedSet<const uint32_t*> RegMasks;
126
127     bool aliasRR(RegisterRef RA, RegisterRef RB) const;
128     bool aliasRM(RegisterRef RR, RegisterRef RM) const;
129     bool aliasMM(RegisterRef RM, RegisterRef RN) const;
130   };
131
132
133   struct RegisterAggr {
134     RegisterAggr(const PhysicalRegisterInfo &pri)
135         : Units(pri.getTRI().getNumRegUnits()), PRI(pri) {}
136     RegisterAggr(const RegisterAggr &RG) = default;
137
138     bool empty() const { return Units.empty(); }
139     bool hasAliasOf(RegisterRef RR) const;
140     bool hasCoverOf(RegisterRef RR) const;
141     static bool isCoverOf(RegisterRef RA, RegisterRef RB,
142                           const PhysicalRegisterInfo &PRI) {
143       return RegisterAggr(PRI).insert(RA).hasCoverOf(RB);
144     }
145
146     RegisterAggr &insert(RegisterRef RR);
147     RegisterAggr &insert(const RegisterAggr &RG);
148     RegisterAggr &intersect(RegisterRef RR);
149     RegisterAggr &intersect(const RegisterAggr &RG);
150     RegisterAggr &clear(RegisterRef RR);
151     RegisterAggr &clear(const RegisterAggr &RG);
152
153     RegisterRef intersectWith(RegisterRef RR) const;
154     RegisterRef clearIn(RegisterRef RR) const;
155     RegisterRef makeRegRef() const;
156
157     void print(raw_ostream &OS) const;
158
159     struct rr_iterator {
160       typedef std::map<RegisterId,LaneBitmask> MapType;
161     private:
162       MapType Masks;
163       MapType::iterator Pos;
164       unsigned Index;
165       const RegisterAggr *Owner;
166     public:
167       rr_iterator(const RegisterAggr &RG, bool End);
168       RegisterRef operator*() const {
169         return RegisterRef(Pos->first, Pos->second);
170       }
171       rr_iterator &operator++() {
172         ++Pos;
173         ++Index;
174         return *this;
175       }
176       bool operator==(const rr_iterator &I) const {
177         assert(Owner == I.Owner);
178         return Index == I.Index;
179       }
180       bool operator!=(const rr_iterator &I) const {
181         return !(*this == I);
182       }
183     };
184
185     rr_iterator rr_begin() const {
186       return rr_iterator(*this, false);
187     }
188     rr_iterator rr_end() const {
189       return rr_iterator(*this, true);
190     }
191
192   private:
193     BitVector Units;
194     const PhysicalRegisterInfo &PRI;
195   };
196
197
198   // Optionally print the lane mask, if it is not ~0.
199   struct PrintLaneMaskOpt {
200     PrintLaneMaskOpt(LaneBitmask M) : Mask(M) {}
201     LaneBitmask Mask;
202   };
203   raw_ostream &operator<< (raw_ostream &OS, const PrintLaneMaskOpt &P);
204
205 } // namespace rdf
206 } // namespace llvm
207
208 #endif
209