Skip to content

Commit 4fe9d6c

Browse files
author
Krzysztof Parzyszek
committed
[RDF] Refine propagation of reached uses in liveness computation
llvm-svn: 300337
1 parent e32214b commit 4fe9d6c

File tree

3 files changed

+63
-5
lines changed

3 files changed

+63
-5
lines changed

Diff for: llvm/lib/Target/Hexagon/RDFLiveness.cpp

+14-5
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ void Liveness::computePhiInfo() {
425425
// phi use -> (map: reaching phi -> set of registers defined in between)
426426
std::map<NodeId,std::map<NodeId,RegisterAggr>> PhiUp;
427427
std::vector<NodeId> PhiUQ; // Work list of phis for upward propagation.
428+
std::map<NodeId,RegisterAggr> PhiDRs; // Phi -> registers defined by it.
428429

429430
// Go over all phis.
430431
for (NodeAddr<PhiNode*> PhiA : Phis) {
@@ -437,12 +438,15 @@ void Liveness::computePhiInfo() {
437438
// For each def, add to the queue all reached (non-phi) defs.
438439
SetVector<NodeId> DefQ;
439440
NodeSet PhiDefs;
441+
RegisterAggr DRs(PRI);
440442
for (NodeAddr<RefNode*> R : PhiRefs) {
441443
if (!DFG.IsRef<NodeAttrs::Def>(R))
442444
continue;
445+
DRs.insert(R.Addr->getRegRef(DFG));
443446
DefQ.insert(R.Id);
444447
PhiDefs.insert(R.Id);
445448
}
449+
PhiDRs.insert(std::make_pair(PhiA.Id, DRs));
446450

447451
// Collect the super-set of all possible reached uses. This set will
448452
// contain all uses reached from this phi, either directly from the
@@ -615,14 +619,19 @@ void Liveness::computePhiInfo() {
615619
// then add (R-MidDefs,U) to RealUseMap[P]
616620
//
617621
for (const std::pair<RegisterId,NodeRefSet> &T : RUM) {
618-
RegisterRef R = DFG.restrictRef(RegisterRef(T.first), UR);
619-
if (!R)
622+
RegisterRef R(T.first);
623+
// The current phi (PA) could be a phi for a regmask. It could
624+
// reach a whole variety of uses that are not related to the
625+
// specific upward phi (P.first).
626+
const RegisterAggr &DRs = PhiDRs.at(P.first);
627+
if (!DRs.hasAliasOf(R))
620628
continue;
629+
R = DRs.intersectWith(R);
621630
for (std::pair<NodeId,LaneBitmask> V : T.second) {
622-
RegisterRef S = DFG.restrictRef(RegisterRef(R.Reg, V.second), R);
623-
if (!S)
631+
LaneBitmask M = R.Mask & V.second;
632+
if (M.none())
624633
continue;
625-
if (RegisterRef SS = MidDefs.clearIn(S)) {
634+
if (RegisterRef SS = MidDefs.clearIn(RegisterRef(R.Reg, M))) {
626635
NodeRefSet &RS = RealUseMap[P.first][SS.Reg];
627636
Changed |= RS.insert({V.first,SS.Mask}).second;
628637
}

Diff for: llvm/lib/Target/Hexagon/RDFRegisters.cpp

+46
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,44 @@ RegisterAggr &RegisterAggr::insert(const RegisterAggr &RG) {
308308
return *this;
309309
}
310310

311+
RegisterAggr &RegisterAggr::intersect(RegisterRef RR) {
312+
if (PhysicalRegisterInfo::isRegMaskId(RR.Reg))
313+
return intersect(RegisterAggr(PRI).insert(RR));
314+
315+
RegisterRef NR = PRI.normalize(RR);
316+
auto F = Masks.find(NR.Reg);
317+
LaneBitmask M;
318+
if (F != Masks.end())
319+
M = NR.Mask & F->second;
320+
Masks.clear();
321+
ExpUnits.clear();
322+
CheckUnits = false;
323+
if (M.any())
324+
insert(RegisterRef(NR.Reg, M));
325+
return *this;
326+
}
327+
328+
RegisterAggr &RegisterAggr::intersect(const RegisterAggr &RG) {
329+
for (auto I = Masks.begin(); I != Masks.end(); ) {
330+
auto F = RG.Masks.find(I->first);
331+
if (F == RG.Masks.end()) {
332+
I = Masks.erase(I);
333+
} else {
334+
I->second &= F->second;
335+
++I;
336+
}
337+
}
338+
if (CheckUnits && RG.CheckUnits) {
339+
ExpUnits &= RG.ExpUnits;
340+
if (ExpUnits.empty())
341+
CheckUnits = false;
342+
} else {
343+
ExpUnits.clear();
344+
CheckUnits = false;
345+
}
346+
return *this;
347+
}
348+
311349
RegisterAggr &RegisterAggr::clear(RegisterRef RR) {
312350
if (PhysicalRegisterInfo::isRegMaskId(RR.Reg)) {
313351
// XXX SLOW
@@ -338,6 +376,14 @@ RegisterAggr &RegisterAggr::clear(const RegisterAggr &RG) {
338376
return *this;
339377
}
340378

379+
RegisterRef RegisterAggr::intersectWith(RegisterRef RR) const {
380+
RegisterAggr T(PRI);
381+
T.insert(RR).intersect(*this);
382+
if (T.empty())
383+
return RegisterRef();
384+
return RegisterRef(T.begin()->first, T.begin()->second);
385+
}
386+
341387
RegisterRef RegisterAggr::clearIn(RegisterRef RR) const {
342388
RegisterAggr T(PRI);
343389
T.insert(RR).clear(*this);

Diff for: llvm/lib/Target/Hexagon/RDFRegisters.h

+3
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,12 @@ namespace rdf {
141141

142142
RegisterAggr &insert(RegisterRef RR);
143143
RegisterAggr &insert(const RegisterAggr &RG);
144+
RegisterAggr &intersect(RegisterRef RR);
145+
RegisterAggr &intersect(const RegisterAggr &RG);
144146
RegisterAggr &clear(RegisterRef RR);
145147
RegisterAggr &clear(const RegisterAggr &RG);
146148

149+
RegisterRef intersectWith(RegisterRef RR) const;
147150
RegisterRef clearIn(RegisterRef RR) const;
148151

149152
void print(raw_ostream &OS) const;

0 commit comments

Comments
 (0)