Skip to content

Commit a78defc

Browse files
authored
Merge pull request #74 from fortanix/jb/lvi-ballooning-fix
Pull some upstream patches related to LVI mitigations compile time
2 parents 833dd1e + f50b36a commit a78defc

File tree

7 files changed

+277
-167
lines changed

7 files changed

+277
-167
lines changed

llvm/include/llvm/CodeGen/RDFLiveness.h

+31-7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include "llvm/MC/LaneBitmask.h"
1919
#include <map>
2020
#include <set>
21+
#include <unordered_map>
22+
#include <unordered_set>
2123
#include <utility>
2224

2325
namespace llvm {
@@ -28,6 +30,30 @@ class MachineDominatorTree;
2830
class MachineRegisterInfo;
2931
class TargetRegisterInfo;
3032

33+
} // namespace llvm
34+
35+
namespace llvm {
36+
namespace rdf {
37+
namespace detail {
38+
39+
using NodeRef = std::pair<NodeId, LaneBitmask>;
40+
41+
} // namespace detail
42+
} // namespace rdf
43+
} // namespace llvm
44+
45+
namespace std {
46+
47+
template <> struct hash<llvm::rdf::detail::NodeRef> {
48+
std::size_t operator()(llvm::rdf::detail::NodeRef R) const {
49+
return std::hash<llvm::rdf::NodeId>{}(R.first) ^
50+
std::hash<llvm::LaneBitmask::Type>{}(R.second.getAsInteger());
51+
}
52+
};
53+
54+
} // namespace std
55+
56+
namespace llvm {
3157
namespace rdf {
3258

3359
struct Liveness {
@@ -46,10 +72,9 @@ namespace rdf {
4672
std::map<MachineBasicBlock*,RegisterAggr> Map;
4773
};
4874

49-
using NodeRef = std::pair<NodeId, LaneBitmask>;
50-
using NodeRefSet = std::set<NodeRef>;
51-
// RegisterId in RefMap must be normalized.
52-
using RefMap = std::map<RegisterId, NodeRefSet>;
75+
using NodeRef = detail::NodeRef;
76+
using NodeRefSet = std::unordered_set<NodeRef>;
77+
using RefMap = std::unordered_map<RegisterId, NodeRefSet>;
5378

5479
Liveness(MachineRegisterInfo &mri, const DataFlowGraph &g)
5580
: DFG(g), TRI(g.getTRI()), PRI(g.getPRI()), MDT(g.getDT()),
@@ -110,15 +135,14 @@ namespace rdf {
110135
// Cache of mapping from node ids (for RefNodes) to the containing
111136
// basic blocks. Not computing it each time for each node reduces
112137
// the liveness calculation time by a large fraction.
113-
using NodeBlockMap = DenseMap<NodeId, MachineBasicBlock *>;
114-
NodeBlockMap NBMap;
138+
DenseMap<NodeId, MachineBasicBlock *> NBMap;
115139

116140
// Phi information:
117141
//
118142
// RealUseMap
119143
// map: NodeId -> (map: RegisterId -> NodeRefSet)
120144
// phi id -> (map: register -> set of reached non-phi uses)
121-
std::map<NodeId, RefMap> RealUseMap;
145+
DenseMap<NodeId, RefMap> RealUseMap;
122146

123147
// Inverse iterated dominance frontier.
124148
std::map<MachineBasicBlock*,std::set<MachineBasicBlock*>> IIDF;

llvm/include/llvm/CodeGen/RDFRegisters.h

+45-2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ namespace rdf {
9191
bool operator< (const RegisterRef &RR) const {
9292
return Reg < RR.Reg || (Reg == RR.Reg && Mask < RR.Mask);
9393
}
94+
95+
size_t hash() const {
96+
return std::hash<RegisterId>{}(Reg) ^
97+
std::hash<LaneBitmask::Type>{}(Mask.getAsInteger());
98+
}
9499
};
95100

96101

@@ -110,7 +115,11 @@ namespace rdf {
110115
return RegMasks.get(Register::stackSlot2Index(R));
111116
}
112117

113-
RegisterRef normalize(RegisterRef RR) const;
118+
LLVM_ATTRIBUTE_DEPRECATED(RegisterRef normalize(RegisterRef RR),
119+
"This function is now an identity function");
120+
RegisterRef normalize(RegisterRef RR) const {
121+
return RR;
122+
}
114123

115124
bool alias(RegisterRef RA, RegisterRef RB) const {
116125
if (!isRegMaskId(RA.Reg))
@@ -128,6 +137,10 @@ namespace rdf {
128137
return MaskInfos[Register::stackSlot2Index(MaskId)].Units;
129138
}
130139

140+
const BitVector &getUnitAliases(uint32_t U) const {
141+
return AliasInfos[U].Regs;
142+
}
143+
131144
RegisterRef mapTo(RegisterRef RR, unsigned R) const;
132145
const TargetRegisterInfo &getTRI() const { return TRI; }
133146

@@ -142,12 +155,16 @@ namespace rdf {
142155
struct MaskInfo {
143156
BitVector Units;
144157
};
158+
struct AliasInfo {
159+
BitVector Regs;
160+
};
145161

146162
const TargetRegisterInfo &TRI;
147163
IndexedSet<const uint32_t*> RegMasks;
148164
std::vector<RegInfo> RegInfos;
149165
std::vector<UnitInfo> UnitInfos;
150166
std::vector<MaskInfo> MaskInfos;
167+
std::vector<AliasInfo> AliasInfos;
151168

152169
bool aliasRR(RegisterRef RA, RegisterRef RB) const;
153170
bool aliasRM(RegisterRef RR, RegisterRef RM) const;
@@ -159,10 +176,15 @@ namespace rdf {
159176
: Units(pri.getTRI().getNumRegUnits()), PRI(pri) {}
160177
RegisterAggr(const RegisterAggr &RG) = default;
161178

179+
unsigned count() const { return Units.count(); }
162180
bool empty() const { return Units.none(); }
163181
bool hasAliasOf(RegisterRef RR) const;
164182
bool hasCoverOf(RegisterRef RR) const;
165183

184+
bool operator==(const RegisterAggr &A) const {
185+
return DenseMapInfo<BitVector>::isEqual(Units, A.Units);
186+
}
187+
166188
static bool isCoverOf(RegisterRef RA, RegisterRef RB,
167189
const PhysicalRegisterInfo &PRI) {
168190
return RegisterAggr(PRI).insert(RA).hasCoverOf(RB);
@@ -179,6 +201,10 @@ namespace rdf {
179201
RegisterRef clearIn(RegisterRef RR) const;
180202
RegisterRef makeRegRef() const;
181203

204+
size_t hash() const {
205+
return DenseMapInfo<BitVector>::getHashValue(Units);
206+
}
207+
182208
void print(raw_ostream &OS) const;
183209

184210
struct rr_iterator {
@@ -232,9 +258,26 @@ namespace rdf {
232258
LaneBitmask Mask;
233259
};
234260
raw_ostream &operator<< (raw_ostream &OS, const PrintLaneMaskOpt &P);
235-
236261
} // end namespace rdf
237262

238263
} // end namespace llvm
239264

265+
namespace std {
266+
template <> struct hash<llvm::rdf::RegisterRef> {
267+
size_t operator()(llvm::rdf::RegisterRef A) const {
268+
return A.hash();
269+
}
270+
};
271+
template <> struct hash<llvm::rdf::RegisterAggr> {
272+
size_t operator()(const llvm::rdf::RegisterAggr &A) const {
273+
return A.hash();
274+
}
275+
};
276+
template <> struct equal_to<llvm::rdf::RegisterAggr> {
277+
bool operator()(const llvm::rdf::RegisterAggr &A,
278+
const llvm::rdf::RegisterAggr &B) const {
279+
return A == B;
280+
}
281+
};
282+
}
240283
#endif // LLVM_LIB_TARGET_HEXAGON_RDFREGISTERS_H

llvm/lib/CodeGen/RDFGraph.cpp

-5
Original file line numberDiff line numberDiff line change
@@ -984,11 +984,6 @@ RegisterRef DataFlowGraph::restrictRef(RegisterRef AR, RegisterRef BR) const {
984984
LaneBitmask M = AR.Mask & BR.Mask;
985985
return M.any() ? RegisterRef(AR.Reg, M) : RegisterRef();
986986
}
987-
#ifndef NDEBUG
988-
// RegisterRef NAR = PRI.normalize(AR);
989-
// RegisterRef NBR = PRI.normalize(BR);
990-
// assert(NAR.Reg != NBR.Reg);
991-
#endif
992987
// This isn't strictly correct, because the overlap may happen in the
993988
// part masked out.
994989
if (PRI.alias(AR, BR))

0 commit comments

Comments
 (0)