annotate lib/CodeGen/ExecutionDomainFix.cpp @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
134
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
1 //===- ExecutionDomainFix.cpp - Fix execution domain issues ----*- C++ -*--===//
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
2 //
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
4 //
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
7 //
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
9
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
10 #include "llvm/CodeGen/ExecutionDomainFix.h"
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
11 #include "llvm/CodeGen/MachineRegisterInfo.h"
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
12 #include "llvm/CodeGen/TargetInstrInfo.h"
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
13
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
14 using namespace llvm;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
15
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
16 #define DEBUG_TYPE "execution-deps-fix"
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
17
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
18 iterator_range<SmallVectorImpl<int>::const_iterator>
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
19 ExecutionDomainFix::regIndices(unsigned Reg) const {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
20 assert(Reg < AliasMap.size() && "Invalid register");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
21 const auto &Entry = AliasMap[Reg];
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
22 return make_range(Entry.begin(), Entry.end());
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
23 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
24
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
25 DomainValue *ExecutionDomainFix::alloc(int domain) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
26 DomainValue *dv = Avail.empty() ? new (Allocator.Allocate()) DomainValue
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
27 : Avail.pop_back_val();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
28 if (domain >= 0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
29 dv->addDomain(domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
30 assert(dv->Refs == 0 && "Reference count wasn't cleared");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
31 assert(!dv->Next && "Chained DomainValue shouldn't have been recycled");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
32 return dv;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
33 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
34
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
35 void ExecutionDomainFix::release(DomainValue *DV) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
36 while (DV) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
37 assert(DV->Refs && "Bad DomainValue");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
38 if (--DV->Refs)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
39 return;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
40
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
41 // There are no more DV references. Collapse any contained instructions.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
42 if (DV->AvailableDomains && !DV->isCollapsed())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
43 collapse(DV, DV->getFirstDomain());
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
44
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
45 DomainValue *Next = DV->Next;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
46 DV->clear();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
47 Avail.push_back(DV);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
48 // Also release the next DomainValue in the chain.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
49 DV = Next;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
50 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
51 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
52
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
53 DomainValue *ExecutionDomainFix::resolve(DomainValue *&DVRef) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
54 DomainValue *DV = DVRef;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
55 if (!DV || !DV->Next)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
56 return DV;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
57
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
58 // DV has a chain. Find the end.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
59 do
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
60 DV = DV->Next;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
61 while (DV->Next);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
62
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
63 // Update DVRef to point to DV.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
64 retain(DV);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
65 release(DVRef);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
66 DVRef = DV;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
67 return DV;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
68 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
69
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
70 void ExecutionDomainFix::setLiveReg(int rx, DomainValue *dv) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
71 assert(unsigned(rx) < NumRegs && "Invalid index");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
72 assert(!LiveRegs.empty() && "Must enter basic block first.");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
73
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
74 if (LiveRegs[rx] == dv)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
75 return;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
76 if (LiveRegs[rx])
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
77 release(LiveRegs[rx]);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
78 LiveRegs[rx] = retain(dv);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
79 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
80
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
81 void ExecutionDomainFix::kill(int rx) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
82 assert(unsigned(rx) < NumRegs && "Invalid index");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
83 assert(!LiveRegs.empty() && "Must enter basic block first.");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
84 if (!LiveRegs[rx])
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
85 return;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
86
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
87 release(LiveRegs[rx]);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
88 LiveRegs[rx] = nullptr;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
89 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
90
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
91 void ExecutionDomainFix::force(int rx, unsigned domain) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
92 assert(unsigned(rx) < NumRegs && "Invalid index");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
93 assert(!LiveRegs.empty() && "Must enter basic block first.");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
94 if (DomainValue *dv = LiveRegs[rx]) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
95 if (dv->isCollapsed())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
96 dv->addDomain(domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
97 else if (dv->hasDomain(domain))
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
98 collapse(dv, domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
99 else {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
100 // This is an incompatible open DomainValue. Collapse it to whatever and
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
101 // force the new value into domain. This costs a domain crossing.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
102 collapse(dv, dv->getFirstDomain());
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
103 assert(LiveRegs[rx] && "Not live after collapse?");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
104 LiveRegs[rx]->addDomain(domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
105 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
106 } else {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
107 // Set up basic collapsed DomainValue.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
108 setLiveReg(rx, alloc(domain));
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
109 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
110 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
111
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
112 void ExecutionDomainFix::collapse(DomainValue *dv, unsigned domain) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
113 assert(dv->hasDomain(domain) && "Cannot collapse");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
114
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
115 // Collapse all the instructions.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
116 while (!dv->Instrs.empty())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
117 TII->setExecutionDomain(*dv->Instrs.pop_back_val(), domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
118 dv->setSingleDomain(domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
119
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
120 // If there are multiple users, give them new, unique DomainValues.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
121 if (!LiveRegs.empty() && dv->Refs > 1)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
122 for (unsigned rx = 0; rx != NumRegs; ++rx)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
123 if (LiveRegs[rx] == dv)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
124 setLiveReg(rx, alloc(domain));
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
125 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
126
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
127 bool ExecutionDomainFix::merge(DomainValue *A, DomainValue *B) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
128 assert(!A->isCollapsed() && "Cannot merge into collapsed");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
129 assert(!B->isCollapsed() && "Cannot merge from collapsed");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
130 if (A == B)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
131 return true;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
132 // Restrict to the domains that A and B have in common.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
133 unsigned common = A->getCommonDomains(B->AvailableDomains);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
134 if (!common)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
135 return false;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
136 A->AvailableDomains = common;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
137 A->Instrs.append(B->Instrs.begin(), B->Instrs.end());
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
138
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
139 // Clear the old DomainValue so we won't try to swizzle instructions twice.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
140 B->clear();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
141 // All uses of B are referred to A.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
142 B->Next = retain(A);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
143
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
144 for (unsigned rx = 0; rx != NumRegs; ++rx) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
145 assert(!LiveRegs.empty() && "no space allocated for live registers");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
146 if (LiveRegs[rx] == B)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
147 setLiveReg(rx, A);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
148 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
149 return true;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
150 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
151
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
152 void ExecutionDomainFix::enterBasicBlock(
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
153 const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
154
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
155 MachineBasicBlock *MBB = TraversedMBB.MBB;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
156
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
157 // Set up LiveRegs to represent registers entering MBB.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
158 // Set default domain values to 'no domain' (nullptr)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
159 if (LiveRegs.empty())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
160 LiveRegs.assign(NumRegs, nullptr);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
161
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
162 // This is the entry block.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
163 if (MBB->pred_empty()) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
164 DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
165 return;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
166 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
167
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
168 // Try to coalesce live-out registers from predecessors.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
169 for (MachineBasicBlock *pred : MBB->predecessors()) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
170 assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
171 "Should have pre-allocated MBBInfos for all MBBs");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
172 LiveRegsDVInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
173 // Incoming is null if this is a backedge from a BB
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
174 // we haven't processed yet
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
175 if (Incoming.empty())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
176 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
177
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
178 for (unsigned rx = 0; rx != NumRegs; ++rx) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
179 DomainValue *pdv = resolve(Incoming[rx]);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
180 if (!pdv)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
181 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
182 if (!LiveRegs[rx]) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
183 setLiveReg(rx, pdv);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
184 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
185 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
186
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
187 // We have a live DomainValue from more than one predecessor.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
188 if (LiveRegs[rx]->isCollapsed()) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
189 // We are already collapsed, but predecessor is not. Force it.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
190 unsigned Domain = LiveRegs[rx]->getFirstDomain();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
191 if (!pdv->isCollapsed() && pdv->hasDomain(Domain))
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
192 collapse(pdv, Domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
193 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
194 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
195
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
196 // Currently open, merge in predecessor.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
197 if (!pdv->isCollapsed())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
198 merge(LiveRegs[rx], pdv);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
199 else
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
200 force(rx, pdv->getFirstDomain());
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
201 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
202 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
203 DEBUG(dbgs() << printMBBReference(*MBB)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
204 << (!TraversedMBB.IsDone ? ": incomplete\n"
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
205 : ": all preds known\n"));
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
206 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
207
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
208 void ExecutionDomainFix::leaveBasicBlock(
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
209 const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
210 assert(!LiveRegs.empty() && "Must enter basic block first.");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
211 unsigned MBBNumber = TraversedMBB.MBB->getNumber();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
212 assert(MBBNumber < MBBOutRegsInfos.size() &&
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
213 "Unexpected basic block number.");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
214 // Save register clearances at end of MBB - used by enterBasicBlock().
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
215 for (DomainValue *OldLiveReg : MBBOutRegsInfos[MBBNumber]) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
216 release(OldLiveReg);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
217 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
218 MBBOutRegsInfos[MBBNumber] = LiveRegs;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
219 LiveRegs.clear();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
220 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
221
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
222 bool ExecutionDomainFix::visitInstr(MachineInstr *MI) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
223 // Update instructions with explicit execution domains.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
224 std::pair<uint16_t, uint16_t> DomP = TII->getExecutionDomain(*MI);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
225 if (DomP.first) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
226 if (DomP.second)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
227 visitSoftInstr(MI, DomP.second);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
228 else
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
229 visitHardInstr(MI, DomP.first);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
230 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
231
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
232 return !DomP.first;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
233 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
234
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
235 void ExecutionDomainFix::processDefs(MachineInstr *MI, bool Kill) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
236 assert(!MI->isDebugValue() && "Won't process debug values");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
237 const MCInstrDesc &MCID = MI->getDesc();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
238 for (unsigned i = 0,
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
239 e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
240 i != e; ++i) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
241 MachineOperand &MO = MI->getOperand(i);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
242 if (!MO.isReg())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
243 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
244 if (MO.isUse())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
245 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
246 for (int rx : regIndices(MO.getReg())) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
247 // This instruction explicitly defines rx.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
248 DEBUG(dbgs() << printReg(RC->getRegister(rx), TRI) << ":\t" << *MI);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
249
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
250 // Kill off domains redefined by generic instructions.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
251 if (Kill)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
252 kill(rx);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
253 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
254 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
255 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
256
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
257 void ExecutionDomainFix::visitHardInstr(MachineInstr *mi, unsigned domain) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
258 // Collapse all uses.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
259 for (unsigned i = mi->getDesc().getNumDefs(),
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
260 e = mi->getDesc().getNumOperands();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
261 i != e; ++i) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
262 MachineOperand &mo = mi->getOperand(i);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
263 if (!mo.isReg())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
264 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
265 for (int rx : regIndices(mo.getReg())) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
266 force(rx, domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
267 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
268 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
269
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
270 // Kill all defs and force them.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
271 for (unsigned i = 0, e = mi->getDesc().getNumDefs(); i != e; ++i) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
272 MachineOperand &mo = mi->getOperand(i);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
273 if (!mo.isReg())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
274 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
275 for (int rx : regIndices(mo.getReg())) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
276 kill(rx);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
277 force(rx, domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
278 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
279 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
280 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
281
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
282 void ExecutionDomainFix::visitSoftInstr(MachineInstr *mi, unsigned mask) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
283 // Bitmask of available domains for this instruction after taking collapsed
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
284 // operands into account.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
285 unsigned available = mask;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
286
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
287 // Scan the explicit use operands for incoming domains.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
288 SmallVector<int, 4> used;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
289 if (!LiveRegs.empty())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
290 for (unsigned i = mi->getDesc().getNumDefs(),
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
291 e = mi->getDesc().getNumOperands();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
292 i != e; ++i) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
293 MachineOperand &mo = mi->getOperand(i);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
294 if (!mo.isReg())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
295 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
296 for (int rx : regIndices(mo.getReg())) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
297 DomainValue *dv = LiveRegs[rx];
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
298 if (dv == nullptr)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
299 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
300 // Bitmask of domains that dv and available have in common.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
301 unsigned common = dv->getCommonDomains(available);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
302 // Is it possible to use this collapsed register for free?
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
303 if (dv->isCollapsed()) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
304 // Restrict available domains to the ones in common with the operand.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
305 // If there are no common domains, we must pay the cross-domain
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
306 // penalty for this operand.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
307 if (common)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
308 available = common;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
309 } else if (common)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
310 // Open DomainValue is compatible, save it for merging.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
311 used.push_back(rx);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
312 else
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
313 // Open DomainValue is not compatible with instruction. It is useless
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
314 // now.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
315 kill(rx);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
316 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
317 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
318
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
319 // If the collapsed operands force a single domain, propagate the collapse.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
320 if (isPowerOf2_32(available)) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
321 unsigned domain = countTrailingZeros(available);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
322 TII->setExecutionDomain(*mi, domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
323 visitHardInstr(mi, domain);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
324 return;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
325 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
326
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
327 // Kill off any remaining uses that don't match available, and build a list of
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
328 // incoming DomainValues that we want to merge.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
329 SmallVector<int, 4> Regs;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
330 for (int rx : used) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
331 assert(!LiveRegs.empty() && "no space allocated for live registers");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
332 DomainValue *&LR = LiveRegs[rx];
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
333 // This useless DomainValue could have been missed above.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
334 if (!LR->getCommonDomains(available)) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
335 kill(rx);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
336 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
337 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
338 // Sorted insertion.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
339 // Enables giving priority to the latest domains during merging.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
340 auto I = std::upper_bound(
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
341 Regs.begin(), Regs.end(), rx, [&](int LHS, const int RHS) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
342 return RDA->getReachingDef(mi, RC->getRegister(LHS)) <
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
343 RDA->getReachingDef(mi, RC->getRegister(RHS));
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
344 });
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
345 Regs.insert(I, rx);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
346 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
347
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
348 // doms are now sorted in order of appearance. Try to merge them all, giving
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
349 // priority to the latest ones.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
350 DomainValue *dv = nullptr;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
351 while (!Regs.empty()) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
352 if (!dv) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
353 dv = LiveRegs[Regs.pop_back_val()];
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
354 // Force the first dv to match the current instruction.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
355 dv->AvailableDomains = dv->getCommonDomains(available);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
356 assert(dv->AvailableDomains && "Domain should have been filtered");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
357 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
358 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
359
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
360 DomainValue *Latest = LiveRegs[Regs.pop_back_val()];
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
361 // Skip already merged values.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
362 if (Latest == dv || Latest->Next)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
363 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
364 if (merge(dv, Latest))
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
365 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
366
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
367 // If latest didn't merge, it is useless now. Kill all registers using it.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
368 for (int i : used) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
369 assert(!LiveRegs.empty() && "no space allocated for live registers");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
370 if (LiveRegs[i] == Latest)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
371 kill(i);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
372 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
373 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
374
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
375 // dv is the DomainValue we are going to use for this instruction.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
376 if (!dv) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
377 dv = alloc();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
378 dv->AvailableDomains = available;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
379 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
380 dv->Instrs.push_back(mi);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
381
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
382 // Finally set all defs and non-collapsed uses to dv. We must iterate through
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
383 // all the operators, including imp-def ones.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
384 for (MachineOperand &mo : mi->operands()) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
385 if (!mo.isReg())
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
386 continue;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
387 for (int rx : regIndices(mo.getReg())) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
388 if (!LiveRegs[rx] || (mo.isDef() && LiveRegs[rx] != dv)) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
389 kill(rx);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
390 setLiveReg(rx, dv);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
391 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
392 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
393 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
394 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
395
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
396 void ExecutionDomainFix::processBasicBlock(
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
397 const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
398 enterBasicBlock(TraversedMBB);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
399 // If this block is not done, it makes little sense to make any decisions
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
400 // based on clearance information. We need to make a second pass anyway,
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
401 // and by then we'll have better information, so we can avoid doing the work
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
402 // to try and break dependencies now.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
403 for (MachineInstr &MI : *TraversedMBB.MBB) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
404 if (!MI.isDebugValue()) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
405 bool Kill = false;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
406 if (TraversedMBB.PrimaryPass)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
407 Kill = visitInstr(&MI);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
408 processDefs(&MI, Kill);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
409 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
410 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
411 leaveBasicBlock(TraversedMBB);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
412 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
413
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
414 bool ExecutionDomainFix::runOnMachineFunction(MachineFunction &mf) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
415 if (skipFunction(mf.getFunction()))
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
416 return false;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
417 MF = &mf;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
418 TII = MF->getSubtarget().getInstrInfo();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
419 TRI = MF->getSubtarget().getRegisterInfo();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
420 LiveRegs.clear();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
421 assert(NumRegs == RC->getNumRegs() && "Bad regclass");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
422
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
423 DEBUG(dbgs() << "********** FIX EXECUTION DOMAIN: "
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
424 << TRI->getRegClassName(RC) << " **********\n");
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
425
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
426 // If no relevant registers are used in the function, we can skip it
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
427 // completely.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
428 bool anyregs = false;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
429 const MachineRegisterInfo &MRI = mf.getRegInfo();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
430 for (unsigned Reg : *RC) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
431 if (MRI.isPhysRegUsed(Reg)) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
432 anyregs = true;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
433 break;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
434 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
435 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
436 if (!anyregs)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
437 return false;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
438
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
439 RDA = &getAnalysis<ReachingDefAnalysis>();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
440
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
441 // Initialize the AliasMap on the first use.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
442 if (AliasMap.empty()) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
443 // Given a PhysReg, AliasMap[PhysReg] returns a list of indices into RC and
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
444 // therefore the LiveRegs array.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
445 AliasMap.resize(TRI->getNumRegs());
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
446 for (unsigned i = 0, e = RC->getNumRegs(); i != e; ++i)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
447 for (MCRegAliasIterator AI(RC->getRegister(i), TRI, true); AI.isValid();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
448 ++AI)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
449 AliasMap[*AI].push_back(i);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
450 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
451
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
452 // Initialize the MBBOutRegsInfos
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
453 MBBOutRegsInfos.resize(mf.getNumBlockIDs());
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
454
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
455 // Traverse the basic blocks.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
456 LoopTraversal Traversal;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
457 LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
458 for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
459 processBasicBlock(TraversedMBB);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
460 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
461
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
462 for (LiveRegsDVInfo OutLiveRegs : MBBOutRegsInfos) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
463 for (DomainValue *OutLiveReg : OutLiveRegs) {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
464 if (OutLiveReg)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
465 release(OutLiveReg);
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
466 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
467 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
468 MBBOutRegsInfos.clear();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
469 Avail.clear();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
470 Allocator.DestroyAll();
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
471
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
472 return false;
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
473 }