blob: 458dcf2b0e26db67ac94e3c100d21c382ad99a0d [file] [log] [blame]
Marina Yatsinabe6cfa92018-01-22 10:06:50 +00001//===- ExecutionDomainFix.cpp - Fix execution domain issues ----*- C++ -*--===//
Jakob Stoklund Olesen352aa502010-03-25 17:25:00 +00002//
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//===----------------------------------------------------------------------===//
Jakob Stoklund Olesen352aa502010-03-25 17:25:00 +00009
Marina Yatsinad6bf9cd2018-01-22 10:06:33 +000010#include "llvm/CodeGen/ExecutionDomainFix.h"
Jakob Stoklund Olesen352aa502010-03-25 17:25:00 +000011#include "llvm/CodeGen/MachineRegisterInfo.h"
David Blaikie48319232017-11-08 01:01:31 +000012#include "llvm/CodeGen/TargetInstrInfo.h"
Eric Christopher9f85dcc2014-08-04 21:25:23 +000013
Jakob Stoklund Olesen352aa502010-03-25 17:25:00 +000014using namespace llvm;
15
Matthias Braun76900dd2017-03-18 05:05:40 +000016#define DEBUG_TYPE "execution-deps-fix"
Chandler Carruth8677f2f2014-04-22 02:02:50 +000017
Matthias Brauncd56c192014-12-17 19:13:47 +000018iterator_range<SmallVectorImpl<int>::const_iterator>
Marina Yatsinaef279182018-01-22 10:05:23 +000019ExecutionDomainFix::regIndices(unsigned Reg) const {
Jakob Stoklund Olesendf4b35e2011-09-27 23:50:46 +000020 assert(Reg < AliasMap.size() && "Invalid register");
Matthias Brauncd56c192014-12-17 19:13:47 +000021 const auto &Entry = AliasMap[Reg];
22 return make_range(Entry.begin(), Entry.end());
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +000023}
24
Marina Yatsinaef279182018-01-22 10:05:23 +000025DomainValue *ExecutionDomainFix::alloc(int domain) {
Marina Yatsina95ade182018-01-22 10:06:18 +000026 DomainValue *dv = Avail.empty() ? new (Allocator.Allocate()) DomainValue
27 : Avail.pop_back_val();
Jakob Stoklund Olesenbbef8152010-04-04 18:00:21 +000028 if (domain >= 0)
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +000029 dv->addDomain(domain);
Jakob Stoklund Olesen737e9a22011-11-08 23:26:00 +000030 assert(dv->Refs == 0 && "Reference count wasn't cleared");
Jakob Stoklund Olesendbc372f2011-11-09 00:06:18 +000031 assert(!dv->Next && "Chained DomainValue shouldn't have been recycled");
Jakob Stoklund Olesenbbef8152010-04-04 18:00:21 +000032 return dv;
33}
34
Marina Yatsinaef279182018-01-22 10:05:23 +000035void ExecutionDomainFix::release(DomainValue *DV) {
Jakob Stoklund Olesendbc372f2011-11-09 00:06:18 +000036 while (DV) {
37 assert(DV->Refs && "Bad DomainValue");
38 if (--DV->Refs)
39 return;
Jakob Stoklund Olesen35e93242011-11-08 21:57:44 +000040
Jakob Stoklund Olesendbc372f2011-11-09 00:06:18 +000041 // There are no more DV references. Collapse any contained instructions.
42 if (DV->AvailableDomains && !DV->isCollapsed())
43 collapse(DV, DV->getFirstDomain());
Jakob Stoklund Olesen35e93242011-11-08 21:57:44 +000044
Jakob Stoklund Olesendbc372f2011-11-09 00:06:18 +000045 DomainValue *Next = DV->Next;
46 DV->clear();
47 Avail.push_back(DV);
48 // Also release the next DomainValue in the chain.
49 DV = Next;
50 }
51}
52
Marina Yatsinaef279182018-01-22 10:05:23 +000053DomainValue *ExecutionDomainFix::resolve(DomainValue *&DVRef) {
Jakob Stoklund Olesendbc372f2011-11-09 00:06:18 +000054 DomainValue *DV = DVRef;
55 if (!DV || !DV->Next)
56 return DV;
57
58 // DV has a chain. Find the end.
Marina Yatsina95ade182018-01-22 10:06:18 +000059 do
60 DV = DV->Next;
Jakob Stoklund Olesendbc372f2011-11-09 00:06:18 +000061 while (DV->Next);
62
63 // Update DVRef to point to DV.
64 retain(DV);
65 release(DVRef);
66 DVRef = DV;
67 return DV;
Jakob Stoklund Olesenbbef8152010-04-04 18:00:21 +000068}
69
Marina Yatsinaef279182018-01-22 10:05:23 +000070void ExecutionDomainFix::setLiveReg(int rx, DomainValue *dv) {
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +000071 assert(unsigned(rx) < NumRegs && "Invalid index");
Marina Yatsina982e8802018-01-22 10:05:53 +000072 assert(!LiveRegs.empty() && "Must enter basic block first.");
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +000073
Marina Yatsina8957ed62018-01-22 10:06:01 +000074 if (LiveRegs[rx] == dv)
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +000075 return;
Marina Yatsina8957ed62018-01-22 10:06:01 +000076 if (LiveRegs[rx])
77 release(LiveRegs[rx]);
78 LiveRegs[rx] = retain(dv);
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +000079}
80
Marina Yatsinaef279182018-01-22 10:05:23 +000081void ExecutionDomainFix::kill(int rx) {
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +000082 assert(unsigned(rx) < NumRegs && "Invalid index");
Marina Yatsina982e8802018-01-22 10:05:53 +000083 assert(!LiveRegs.empty() && "Must enter basic block first.");
Marina Yatsina8957ed62018-01-22 10:06:01 +000084 if (!LiveRegs[rx])
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +000085 return;
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +000086
Marina Yatsina8957ed62018-01-22 10:06:01 +000087 release(LiveRegs[rx]);
88 LiveRegs[rx] = nullptr;
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +000089}
90
Marina Yatsinaef279182018-01-22 10:05:23 +000091void ExecutionDomainFix::force(int rx, unsigned domain) {
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +000092 assert(unsigned(rx) < NumRegs && "Invalid index");
Marina Yatsina982e8802018-01-22 10:05:53 +000093 assert(!LiveRegs.empty() && "Must enter basic block first.");
Marina Yatsina8957ed62018-01-22 10:06:01 +000094 if (DomainValue *dv = LiveRegs[rx]) {
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +000095 if (dv->isCollapsed())
96 dv->addDomain(domain);
Jakob Stoklund Olesen8ba1c6a2010-04-06 19:48:56 +000097 else if (dv->hasDomain(domain))
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +000098 collapse(dv, domain);
Jakob Stoklund Olesen8ba1c6a2010-04-06 19:48:56 +000099 else {
Jakob Stoklund Olesen56ab8752011-09-28 00:01:56 +0000100 // This is an incompatible open DomainValue. Collapse it to whatever and
101 // force the new value into domain. This costs a domain crossing.
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +0000102 collapse(dv, dv->getFirstDomain());
Marina Yatsina8957ed62018-01-22 10:06:01 +0000103 assert(LiveRegs[rx] && "Not live after collapse?");
104 LiveRegs[rx]->addDomain(domain);
Jakob Stoklund Olesen8ba1c6a2010-04-06 19:48:56 +0000105 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000106 } else {
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +0000107 // Set up basic collapsed DomainValue.
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +0000108 setLiveReg(rx, alloc(domain));
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000109 }
110}
111
Marina Yatsinaef279182018-01-22 10:05:23 +0000112void ExecutionDomainFix::collapse(DomainValue *dv, unsigned domain) {
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000113 assert(dv->hasDomain(domain) && "Cannot collapse");
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000114
115 // Collapse all the instructions.
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000116 while (!dv->Instrs.empty())
Duncan P. N. Exon Smith567409d2016-06-30 00:01:54 +0000117 TII->setExecutionDomain(*dv->Instrs.pop_back_val(), domain);
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000118 dv->setSingleDomain(domain);
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000119
120 // If there are multiple users, give them new, unique DomainValues.
Marina Yatsina982e8802018-01-22 10:05:53 +0000121 if (!LiveRegs.empty() && dv->Refs > 1)
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +0000122 for (unsigned rx = 0; rx != NumRegs; ++rx)
Marina Yatsina8957ed62018-01-22 10:06:01 +0000123 if (LiveRegs[rx] == dv)
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +0000124 setLiveReg(rx, alloc(domain));
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000125}
126
Marina Yatsinaef279182018-01-22 10:05:23 +0000127bool ExecutionDomainFix::merge(DomainValue *A, DomainValue *B) {
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000128 assert(!A->isCollapsed() && "Cannot merge into collapsed");
129 assert(!B->isCollapsed() && "Cannot merge from collapsed");
Jakob Stoklund Olesen85ffee22010-03-31 20:05:12 +0000130 if (A == B)
Jakob Stoklund Olesen5f282b52010-03-31 17:13:16 +0000131 return true;
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000132 // Restrict to the domains that A and B have in common.
133 unsigned common = A->getCommonDomains(B->AvailableDomains);
134 if (!common)
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000135 return false;
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000136 A->AvailableDomains = common;
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000137 A->Instrs.append(B->Instrs.begin(), B->Instrs.end());
Jakob Stoklund Olesene1b3e112011-11-08 20:57:04 +0000138
139 // Clear the old DomainValue so we won't try to swizzle instructions twice.
Jakob Stoklund Olesen737e9a22011-11-08 23:26:00 +0000140 B->clear();
Jakob Stoklund Olesendbc372f2011-11-09 00:06:18 +0000141 // All uses of B are referred to A.
142 B->Next = retain(A);
Jakob Stoklund Olesene1b3e112011-11-08 20:57:04 +0000143
Michael Ilseman9ecdca92014-12-15 18:48:43 +0000144 for (unsigned rx = 0; rx != NumRegs; ++rx) {
Marina Yatsina982e8802018-01-22 10:05:53 +0000145 assert(!LiveRegs.empty() && "no space allocated for live registers");
Marina Yatsina8957ed62018-01-22 10:06:01 +0000146 if (LiveRegs[rx] == B)
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +0000147 setLiveReg(rx, A);
Michael Ilseman9ecdca92014-12-15 18:48:43 +0000148 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000149 return true;
150}
151
Marina Yatsinaef279182018-01-22 10:05:23 +0000152void ExecutionDomainFix::enterBasicBlock(
153 const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
154
155 MachineBasicBlock *MBB = TraversedMBB.MBB;
156
157 // Set up LiveRegs to represent registers entering MBB.
Marina Yatsina8957ed62018-01-22 10:06:01 +0000158 // Set default domain values to 'no domain' (nullptr)
Marina Yatsina982e8802018-01-22 10:05:53 +0000159 if (LiveRegs.empty())
Marina Yatsina8957ed62018-01-22 10:06:01 +0000160 LiveRegs.assign(NumRegs, nullptr);
Marina Yatsinaef279182018-01-22 10:05:23 +0000161
162 // This is the entry block.
163 if (MBB->pred_empty()) {
Nicola Zaghen0818e782018-05-14 12:53:11 +0000164 LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n");
Marina Yatsinaef279182018-01-22 10:05:23 +0000165 return;
166 }
167
168 // Try to coalesce live-out registers from predecessors.
Marina Yatsina95ade182018-01-22 10:06:18 +0000169 for (MachineBasicBlock *pred : MBB->predecessors()) {
Marina Yatsina66bd7d72018-01-22 13:24:10 +0000170 assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
Marina Yatsina95ade182018-01-22 10:06:18 +0000171 "Should have pre-allocated MBBInfos for all MBBs");
172 LiveRegsDVInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
Keno Fischer2a3b42c2017-01-30 23:37:03 +0000173 // Incoming is null if this is a backedge from a BB
174 // we haven't processed yet
Marina Yatsina982e8802018-01-22 10:05:53 +0000175 if (Incoming.empty())
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000176 continue;
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000177
178 for (unsigned rx = 0; rx != NumRegs; ++rx) {
Marina Yatsina8957ed62018-01-22 10:06:01 +0000179 DomainValue *pdv = resolve(Incoming[rx]);
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000180 if (!pdv)
Jakob Stoklund Olesenf4c47682011-11-09 01:06:56 +0000181 continue;
Marina Yatsina8957ed62018-01-22 10:06:01 +0000182 if (!LiveRegs[rx]) {
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +0000183 setLiveReg(rx, pdv);
Chris Lattner563d83f2010-03-31 20:32:51 +0000184 continue;
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +0000185 }
Chris Lattner563d83f2010-03-31 20:32:51 +0000186
187 // We have a live DomainValue from more than one predecessor.
Marina Yatsina8957ed62018-01-22 10:06:01 +0000188 if (LiveRegs[rx]->isCollapsed()) {
Eric Christopher68c7a1c2014-05-20 17:11:11 +0000189 // We are already collapsed, but predecessor is not. Force it.
Marina Yatsina8957ed62018-01-22 10:06:01 +0000190 unsigned Domain = LiveRegs[rx]->getFirstDomain();
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000191 if (!pdv->isCollapsed() && pdv->hasDomain(Domain))
192 collapse(pdv, Domain);
Chris Lattner563d83f2010-03-31 20:32:51 +0000193 continue;
194 }
Jakob Stoklund Olesenbbef8152010-04-04 18:00:21 +0000195
Chris Lattner563d83f2010-03-31 20:32:51 +0000196 // Currently open, merge in predecessor.
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000197 if (!pdv->isCollapsed())
Marina Yatsina8957ed62018-01-22 10:06:01 +0000198 merge(LiveRegs[rx], pdv);
Chris Lattner563d83f2010-03-31 20:32:51 +0000199 else
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +0000200 force(rx, pdv->getFirstDomain());
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +0000201 }
202 }
Nicola Zaghen0818e782018-05-14 12:53:11 +0000203 LLVM_DEBUG(dbgs() << printMBBReference(*MBB)
204 << (!TraversedMBB.IsDone ? ": incomplete\n"
205 : ": all preds known\n"));
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000206}
207
Marina Yatsinaef279182018-01-22 10:05:23 +0000208void ExecutionDomainFix::leaveBasicBlock(
209 const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
Marina Yatsina982e8802018-01-22 10:05:53 +0000210 assert(!LiveRegs.empty() && "Must enter basic block first.");
Marina Yatsina66bd7d72018-01-22 13:24:10 +0000211 unsigned MBBNumber = TraversedMBB.MBB->getNumber();
Marina Yatsina95ade182018-01-22 10:06:18 +0000212 assert(MBBNumber < MBBOutRegsInfos.size() &&
213 "Unexpected basic block number.");
Marina Yatsinaef279182018-01-22 10:05:23 +0000214 // Save register clearances at end of MBB - used by enterBasicBlock().
Marina Yatsina8957ed62018-01-22 10:06:01 +0000215 for (DomainValue *OldLiveReg : MBBOutRegsInfos[MBBNumber]) {
216 release(OldLiveReg);
Jakob Stoklund Olesenf4c47682011-11-09 01:06:56 +0000217 }
Marina Yatsina8957ed62018-01-22 10:06:01 +0000218 MBBOutRegsInfos[MBBNumber] = LiveRegs;
Marina Yatsina982e8802018-01-22 10:05:53 +0000219 LiveRegs.clear();
Jakob Stoklund Olesen25265d02011-11-07 21:40:27 +0000220}
221
Marina Yatsinaef279182018-01-22 10:05:23 +0000222bool ExecutionDomainFix::visitInstr(MachineInstr *MI) {
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000223 // Update instructions with explicit execution domains.
Duncan P. N. Exon Smith567409d2016-06-30 00:01:54 +0000224 std::pair<uint16_t, uint16_t> DomP = TII->getExecutionDomain(*MI);
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000225 if (DomP.first) {
226 if (DomP.second)
227 visitSoftInstr(MI, DomP.second);
Jakob Stoklund Olesen25265d02011-11-07 21:40:27 +0000228 else
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000229 visitHardInstr(MI, DomP.first);
230 }
231
Keno Fischer2a3b42c2017-01-30 23:37:03 +0000232 return !DomP.first;
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000233}
234
Marina Yatsinaef279182018-01-22 10:05:23 +0000235void ExecutionDomainFix::processDefs(MachineInstr *MI, bool Kill) {
Shiva Chen24abe712018-05-09 02:42:00 +0000236 assert(!MI->isDebugInstr() && "Won't process debug values");
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000237 const MCInstrDesc &MCID = MI->getDesc();
238 for (unsigned i = 0,
Marina Yatsina95ade182018-01-22 10:06:18 +0000239 e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs();
240 i != e; ++i) {
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000241 MachineOperand &MO = MI->getOperand(i);
242 if (!MO.isReg())
243 continue;
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000244 if (MO.isUse())
245 continue;
Matthias Braunae6bbac2015-03-06 18:56:20 +0000246 for (int rx : regIndices(MO.getReg())) {
Matthias Brauncd56c192014-12-17 19:13:47 +0000247 // This instruction explicitly defines rx.
Nicola Zaghen0818e782018-05-14 12:53:11 +0000248 LLVM_DEBUG(dbgs() << printReg(RC->getRegister(rx), TRI) << ":\t" << *MI);
Andrew Tricka6a9ac52013-10-14 22:19:03 +0000249
Matthias Brauncd56c192014-12-17 19:13:47 +0000250 // Kill off domains redefined by generic instructions.
251 if (Kill)
252 kill(rx);
253 }
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000254 }
Marina Yatsinaef279182018-01-22 10:05:23 +0000255}
256
Marina Yatsinaef279182018-01-22 10:05:23 +0000257void ExecutionDomainFix::visitHardInstr(MachineInstr *mi, unsigned domain) {
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000258 // Collapse all uses.
259 for (unsigned i = mi->getDesc().getNumDefs(),
Marina Yatsina95ade182018-01-22 10:06:18 +0000260 e = mi->getDesc().getNumOperands();
261 i != e; ++i) {
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000262 MachineOperand &mo = mi->getOperand(i);
Marina Yatsina95ade182018-01-22 10:06:18 +0000263 if (!mo.isReg())
264 continue;
Matthias Braunae6bbac2015-03-06 18:56:20 +0000265 for (int rx : regIndices(mo.getReg())) {
Matthias Brauncd56c192014-12-17 19:13:47 +0000266 force(rx, domain);
267 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000268 }
269
270 // Kill all defs and force them.
271 for (unsigned i = 0, e = mi->getDesc().getNumDefs(); i != e; ++i) {
272 MachineOperand &mo = mi->getOperand(i);
Marina Yatsina95ade182018-01-22 10:06:18 +0000273 if (!mo.isReg())
274 continue;
Matthias Braunae6bbac2015-03-06 18:56:20 +0000275 for (int rx : regIndices(mo.getReg())) {
Matthias Brauncd56c192014-12-17 19:13:47 +0000276 kill(rx);
277 force(rx, domain);
278 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000279 }
280}
281
Marina Yatsinaef279182018-01-22 10:05:23 +0000282void ExecutionDomainFix::visitSoftInstr(MachineInstr *mi, unsigned mask) {
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000283 // Bitmask of available domains for this instruction after taking collapsed
284 // operands into account.
285 unsigned available = mask;
286
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000287 // Scan the explicit use operands for incoming domains.
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000288 SmallVector<int, 4> used;
Marina Yatsina982e8802018-01-22 10:05:53 +0000289 if (!LiveRegs.empty())
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +0000290 for (unsigned i = mi->getDesc().getNumDefs(),
Marina Yatsina95ade182018-01-22 10:06:18 +0000291 e = mi->getDesc().getNumOperands();
292 i != e; ++i) {
Chris Lattner563d83f2010-03-31 20:32:51 +0000293 MachineOperand &mo = mi->getOperand(i);
Marina Yatsina95ade182018-01-22 10:06:18 +0000294 if (!mo.isReg())
295 continue;
Matthias Braunae6bbac2015-03-06 18:56:20 +0000296 for (int rx : regIndices(mo.getReg())) {
Marina Yatsina8957ed62018-01-22 10:06:01 +0000297 DomainValue *dv = LiveRegs[rx];
Matthias Brauncd56c192014-12-17 19:13:47 +0000298 if (dv == nullptr)
299 continue;
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000300 // Bitmask of domains that dv and available have in common.
301 unsigned common = dv->getCommonDomains(available);
Chris Lattner563d83f2010-03-31 20:32:51 +0000302 // Is it possible to use this collapsed register for free?
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000303 if (dv->isCollapsed()) {
304 // Restrict available domains to the ones in common with the operand.
Andrew Tricka6a9ac52013-10-14 22:19:03 +0000305 // If there are no common domains, we must pay the cross-domain
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000306 // penalty for this operand.
Marina Yatsina95ade182018-01-22 10:06:18 +0000307 if (common)
308 available = common;
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000309 } else if (common)
310 // Open DomainValue is compatible, save it for merging.
Chris Lattner563d83f2010-03-31 20:32:51 +0000311 used.push_back(rx);
312 else
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000313 // Open DomainValue is not compatible with instruction. It is useless
314 // now.
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +0000315 kill(rx);
Chris Lattner563d83f2010-03-31 20:32:51 +0000316 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000317 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000318
319 // If the collapsed operands force a single domain, propagate the collapse.
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000320 if (isPowerOf2_32(available)) {
Michael J. Spencerc6af2432013-05-24 22:23:49 +0000321 unsigned domain = countTrailingZeros(available);
Duncan P. N. Exon Smith567409d2016-06-30 00:01:54 +0000322 TII->setExecutionDomain(*mi, domain);
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000323 visitHardInstr(mi, domain);
324 return;
325 }
326
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000327 // Kill off any remaining uses that don't match available, and build a list of
328 // incoming DomainValues that we want to merge.
Marina Yatsina8957ed62018-01-22 10:06:01 +0000329 SmallVector<int, 4> Regs;
Craig Topper73298512017-02-24 06:38:24 +0000330 for (int rx : used) {
Marina Yatsina982e8802018-01-22 10:05:53 +0000331 assert(!LiveRegs.empty() && "no space allocated for live registers");
Marina Yatsina8957ed62018-01-22 10:06:01 +0000332 DomainValue *&LR = LiveRegs[rx];
Jakob Stoklund Olesen1a5d2a82010-03-30 20:04:01 +0000333 // This useless DomainValue could have been missed above.
Marina Yatsina8957ed62018-01-22 10:06:01 +0000334 if (!LR->getCommonDomains(available)) {
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000335 kill(rx);
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000336 continue;
337 }
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000338 // Sorted insertion.
Marina Yatsina8957ed62018-01-22 10:06:01 +0000339 // Enables giving priority to the latest domains during merging.
Marina Yatsina95ade182018-01-22 10:06:18 +0000340 auto I = std::upper_bound(
341 Regs.begin(), Regs.end(), rx, [&](int LHS, const int RHS) {
342 return RDA->getReachingDef(mi, RC->getRegister(LHS)) <
343 RDA->getReachingDef(mi, RC->getRegister(RHS));
344 });
Marina Yatsina8957ed62018-01-22 10:06:01 +0000345 Regs.insert(I, rx);
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000346 }
347
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000348 // doms are now sorted in order of appearance. Try to merge them all, giving
349 // priority to the latest ones.
Craig Topper4ba84432014-04-14 00:51:57 +0000350 DomainValue *dv = nullptr;
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000351 while (!Regs.empty()) {
Chris Lattner563d83f2010-03-31 20:32:51 +0000352 if (!dv) {
Marina Yatsina8957ed62018-01-22 10:06:01 +0000353 dv = LiveRegs[Regs.pop_back_val()];
Jakob Stoklund Olesen7f5e43f2011-11-23 04:03:08 +0000354 // Force the first dv to match the current instruction.
355 dv->AvailableDomains = dv->getCommonDomains(available);
356 assert(dv->AvailableDomains && "Domain should have been filtered");
Chris Lattner563d83f2010-03-31 20:32:51 +0000357 continue;
358 }
Jakob Stoklund Olesenbbef8152010-04-04 18:00:21 +0000359
Marina Yatsina8957ed62018-01-22 10:06:01 +0000360 DomainValue *Latest = LiveRegs[Regs.pop_back_val()];
Jakob Stoklund Olesen2947f732011-11-15 01:15:25 +0000361 // Skip already merged values.
362 if (Latest == dv || Latest->Next)
363 continue;
364 if (merge(dv, Latest))
365 continue;
Jakob Stoklund Olesenbbef8152010-04-04 18:00:21 +0000366
Jakob Stoklund Olesene0103f02010-04-04 21:27:26 +0000367 // If latest didn't merge, it is useless now. Kill all registers using it.
Michael Ilseman9ecdca92014-12-15 18:48:43 +0000368 for (int i : used) {
Marina Yatsina982e8802018-01-22 10:05:53 +0000369 assert(!LiveRegs.empty() && "no space allocated for live registers");
Marina Yatsina8957ed62018-01-22 10:06:01 +0000370 if (LiveRegs[i] == Latest)
Michael Ilseman9ecdca92014-12-15 18:48:43 +0000371 kill(i);
372 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000373 }
374
375 // dv is the DomainValue we are going to use for this instruction.
Jakob Stoklund Olesen7f5e43f2011-11-23 04:03:08 +0000376 if (!dv) {
Jakob Stoklund Olesen6bcb9a72011-11-08 21:57:47 +0000377 dv = alloc();
Jakob Stoklund Olesen7f5e43f2011-11-23 04:03:08 +0000378 dv->AvailableDomains = available;
379 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000380 dv->Instrs.push_back(mi);
381
Silviu Baranga541a8582012-10-03 08:29:36 +0000382 // Finally set all defs and non-collapsed uses to dv. We must iterate through
383 // all the operators, including imp-def ones.
Marina Yatsinaf2a8b012018-01-22 10:05:37 +0000384 for (MachineOperand &mo : mi->operands()) {
Marina Yatsina95ade182018-01-22 10:06:18 +0000385 if (!mo.isReg())
386 continue;
Matthias Braunae6bbac2015-03-06 18:56:20 +0000387 for (int rx : regIndices(mo.getReg())) {
Marina Yatsina8957ed62018-01-22 10:06:01 +0000388 if (!LiveRegs[rx] || (mo.isDef() && LiveRegs[rx] != dv)) {
Matthias Brauncd56c192014-12-17 19:13:47 +0000389 kill(rx);
390 setLiveReg(rx, dv);
391 }
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000392 }
393 }
394}
395
Marina Yatsinaef279182018-01-22 10:05:23 +0000396void ExecutionDomainFix::processBasicBlock(
397 const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
398 enterBasicBlock(TraversedMBB);
Keno Fischer2a3b42c2017-01-30 23:37:03 +0000399 // If this block is not done, it makes little sense to make any decisions
400 // based on clearance information. We need to make a second pass anyway,
401 // and by then we'll have better information, so we can avoid doing the work
402 // to try and break dependencies now.
Marina Yatsinaef279182018-01-22 10:05:23 +0000403 for (MachineInstr &MI : *TraversedMBB.MBB) {
Shiva Chen24abe712018-05-09 02:42:00 +0000404 if (!MI.isDebugInstr()) {
Keno Fischer2a3b42c2017-01-30 23:37:03 +0000405 bool Kill = false;
Marina Yatsinaef279182018-01-22 10:05:23 +0000406 if (TraversedMBB.PrimaryPass)
Keno Fischer2a3b42c2017-01-30 23:37:03 +0000407 Kill = visitInstr(&MI);
Marina Yatsinaef279182018-01-22 10:05:23 +0000408 processDefs(&MI, Kill);
Keno Fischer2a3b42c2017-01-30 23:37:03 +0000409 }
410 }
Marina Yatsinaef279182018-01-22 10:05:23 +0000411 leaveBasicBlock(TraversedMBB);
Keno Fischer2a3b42c2017-01-30 23:37:03 +0000412}
413
Marina Yatsinaef279182018-01-22 10:05:23 +0000414bool ExecutionDomainFix::runOnMachineFunction(MachineFunction &mf) {
415 if (skipFunction(mf.getFunction()))
416 return false;
417 MF = &mf;
418 TII = MF->getSubtarget().getInstrInfo();
419 TRI = MF->getSubtarget().getRegisterInfo();
Marina Yatsina982e8802018-01-22 10:05:53 +0000420 LiveRegs.clear();
Marina Yatsinaef279182018-01-22 10:05:23 +0000421 assert(NumRegs == RC->getNumRegs() && "Bad regclass");
422
Nicola Zaghen0818e782018-05-14 12:53:11 +0000423 LLVM_DEBUG(dbgs() << "********** FIX EXECUTION DOMAIN: "
424 << TRI->getRegClassName(RC) << " **********\n");
Marina Yatsinaef279182018-01-22 10:05:23 +0000425
426 // If no relevant registers are used in the function, we can skip it
427 // completely.
428 bool anyregs = false;
429 const MachineRegisterInfo &MRI = mf.getRegInfo();
430 for (unsigned Reg : *RC) {
431 if (MRI.isPhysRegUsed(Reg)) {
432 anyregs = true;
433 break;
434 }
435 }
Marina Yatsina95ade182018-01-22 10:06:18 +0000436 if (!anyregs)
437 return false;
Marina Yatsinaef279182018-01-22 10:05:23 +0000438
Marina Yatsinaf2a8b012018-01-22 10:05:37 +0000439 RDA = &getAnalysis<ReachingDefAnalysis>();
440
Marina Yatsinaef279182018-01-22 10:05:23 +0000441 // Initialize the AliasMap on the first use.
442 if (AliasMap.empty()) {
443 // Given a PhysReg, AliasMap[PhysReg] returns a list of indices into RC and
444 // therefore the LiveRegs array.
445 AliasMap.resize(TRI->getNumRegs());
446 for (unsigned i = 0, e = RC->getNumRegs(); i != e; ++i)
Marina Yatsina95ade182018-01-22 10:06:18 +0000447 for (MCRegAliasIterator AI(RC->getRegister(i), TRI, true); AI.isValid();
448 ++AI)
Marina Yatsinaef279182018-01-22 10:05:23 +0000449 AliasMap[*AI].push_back(i);
450 }
451
452 // Initialize the MBBOutRegsInfos
Marina Yatsina982e8802018-01-22 10:05:53 +0000453 MBBOutRegsInfos.resize(mf.getNumBlockIDs());
Marina Yatsinaef279182018-01-22 10:05:23 +0000454
455 // Traverse the basic blocks.
456 LoopTraversal Traversal;
Marina Yatsinaf2a8b012018-01-22 10:05:37 +0000457 LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf);
458 for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) {
Marina Yatsinaef279182018-01-22 10:05:23 +0000459 processBasicBlock(TraversedMBB);
460 }
461
Marina Yatsina95ade182018-01-22 10:06:18 +0000462 for (LiveRegsDVInfo OutLiveRegs : MBBOutRegsInfos) {
Marina Yatsina8957ed62018-01-22 10:06:01 +0000463 for (DomainValue *OutLiveReg : OutLiveRegs) {
464 if (OutLiveReg)
465 release(OutLiveReg);
Marina Yatsina982e8802018-01-22 10:05:53 +0000466 }
Jakob Stoklund Olesenb26c7722011-11-07 23:08:21 +0000467 }
Marina Yatsinaef279182018-01-22 10:05:23 +0000468 MBBOutRegsInfos.clear();
Jakob Stoklund Olesenbbef8152010-04-04 18:00:21 +0000469 Avail.clear();
470 Allocator.DestroyAll();
Jakob Stoklund Olesene4b94b42010-03-29 23:24:21 +0000471
Jakob Stoklund Olesen352aa502010-03-25 17:25:00 +0000472 return false;
473}