Skip to content

Commit f6088c1

Browse files
bcheng0127sys_zuul
authored andcommitted
Improve point to analysis for the code pattern with address register spill
Change-Id: I946cd92693f7d951daa9e0f5d4ff92eb530fe09b
1 parent 15fd68c commit f6088c1

File tree

1 file changed

+91
-54
lines changed

1 file changed

+91
-54
lines changed

visa/RegAlloc.cpp

Lines changed: 91 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -119,28 +119,39 @@ PointsToAnalysis::~PointsToAnalysis()
119119
// It's performed only once at the beginning of RA, at the point where all variables
120120
// are virtual and no spill code (either for address or GRF) has been inserted.
121121
//
122-
void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
122+
void PointsToAnalysis::doPointsToAnalysis(FlowGraph& fg)
123123
{
124-
125-
if( numAddrs == 0 )
124+
if (numAddrs == 0)
126125
{
127126
return;
128127
}
129128

130129
// keep a list of address taken variables
130+
std::list<G4_RegVar*> addrTakenDsts;
131+
std::map<G4_RegVar*, G4_RegVar*> addrTakenMapping;
131132
std::vector<G4_RegVar*> addrTakenVariables;
133+
132134
for (BB_LIST_ITER it = fg.begin(), itend = fg.end(); it != itend; ++it)
133135
{
134136
G4_BB* bb = (*it);
135137
for (INST_LIST_ITER iter = bb->begin(), iterEnd = bb->end(); iter != iterEnd; ++iter)
136138
{
137139
G4_INST* inst = (*iter);
138-
for (int i = 0; i < G4_MAX_SRCS; i++)
140+
141+
G4_DstRegRegion* dst = inst->getDst();
142+
if (dst != NULL && dst->getRegAccess() == Direct && dst->getType() != Type_UD)
139143
{
140-
G4_Operand* src = inst->getSrc(i);
141-
if (src != NULL && src->isAddrExp())
144+
G4_VarBase* ptr = dst->getBase();
145+
146+
for (int i = 0; i < G4_MAX_SRCS; i++)
142147
{
143-
addrTakenVariables.push_back(src->asAddrExp()->getRegVar());
148+
G4_Operand* src = inst->getSrc(i);
149+
if (src != NULL && src->isAddrExp())
150+
{
151+
addrTakenMapping[ptr->asRegVar()] = src->asAddrExp()->getRegVar();
152+
addrTakenDsts.push_back(ptr->asRegVar());
153+
addrTakenVariables.push_back(src->asAddrExp()->getRegVar());
154+
}
144155
}
145156
}
146157
}
@@ -154,7 +165,7 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
154165
{
155166
G4_INST* inst = (*iter);
156167

157-
if(inst->isPseudoKill() || inst->isLifeTimeEnd())
168+
if (inst->isPseudoKill() || inst->isLifeTimeEnd())
158169
{
159170
// No need to consider these lifetime placeholders for points2analysis
160171
continue;
@@ -169,16 +180,16 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
169180
{
170181

171182
// dst is an address variable. ExDesc A0 may be ignored since they are never used in indirect access
172-
if( inst->isMov() )
183+
if (inst->isMov())
173184
{
174185
G4_Operand* src = inst->getSrc(0);
175-
if( src->isAddrExp() )
186+
if (src->isAddrExp())
176187
{
177-
// case 1: mov A0 &GRF
188+
// case 1: mov A0 &GRF
178189
G4_RegVar* addrTaken = src->asAddrExp()->getRegVar();
179190
if (addrTaken != NULL)
180191
{
181-
addToPointsToSet( ptr->asRegVar(), addrTaken );
192+
addToPointsToSet(ptr->asRegVar(), addrTaken);
182193
}
183194
}
184195
else
@@ -190,50 +201,59 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
190201
{
191202
// case 2: mov A0 A1
192203
// merge the two addr's points-to set together
193-
if( ptr->asRegVar()->getId() != srcPtr->asRegVar()->getId() )
204+
if (ptr->asRegVar()->getId() != srcPtr->asRegVar()->getId())
194205
{
195-
mergePointsToSet( srcPtr->asRegVar(), ptr->asRegVar() );
206+
mergePointsToSet(srcPtr->asRegVar(), ptr->asRegVar());
196207
}
197208
}
198209
else
199210
{
200-
// case 3: mov A0 V2
201-
// conservatively assume address can point to anything
202-
DEBUG_MSG("unexpected addr move for pointer analysis:\n");
203-
DEBUG_EMIT(inst);
204-
DEBUG_MSG("\n")
205-
for (int i = 0, size = (int)addrTakenVariables.size(); i < size; i++)
211+
if (srcPtr &&
212+
srcPtr->isRegVar() &&
213+
addrTakenMapping[srcPtr->asRegVar()] != nullptr)
214+
{
215+
addToPointsToSet(ptr->asRegVar(), addrTakenMapping[srcPtr->asRegVar()]);
216+
}
217+
else
206218
{
207-
addToPointsToSet( ptr->asRegVar(), addrTakenVariables[i] );
219+
// case 3: mov A0 V2
220+
// conservatively assume address can point to anything
221+
DEBUG_MSG("unexpected addr move for pointer analysis:\n");
222+
DEBUG_EMIT(inst);
223+
DEBUG_MSG("\n")
224+
for (int i = 0, size = (int)addrTakenVariables.size(); i < size; i++)
225+
{
226+
addToPointsToSet(ptr->asRegVar(), addrTakenVariables[i]);
227+
}
208228
}
209229
}
210230
}
211231
}
212-
else if( inst->isArithmetic() )
232+
else if (inst->isArithmetic())
213233
{
214234
G4_Operand* src0 = inst->getSrc(0);
215235
G4_Operand* src1 = inst->getSrc(1);
216236
bool src0addr = false;
217-
if( src0->isAddrExp() )
237+
if (src0->isAddrExp())
218238
{
219239
src0addr = true;
220240
}
221-
else if( src0->isSrcRegRegion() && src0->getRegAccess() == Direct )
241+
else if (src0->isSrcRegRegion() && src0->getRegAccess() == Direct)
222242
{
223-
if( src0->isAddress() )
243+
if (src0->isAddress())
224244
{
225245
src0addr = true;
226246
}
227247
}
228248

229249
bool src1addr = false;
230-
if( src1->isAddrExp() )
250+
if (src1->isAddrExp())
231251
{
232252
src1addr = true;
233253
}
234-
else if( src1->isSrcRegRegion() && src1->getRegAccess() == Direct )
254+
else if (src1->isSrcRegRegion() && src1->getRegAccess() == Direct)
235255
{
236-
if( src1->isAddress() )
256+
if (src1->isAddress())
237257
{
238258
src1addr = true;
239259
}
@@ -243,37 +263,37 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
243263
{
244264
G4_Operand* src = src0addr ? src0 : src1;
245265

246-
if( src->isAddrExp() )
266+
if (src->isAddrExp())
247267
{
248268
// case 4: add/mul A0 &GRF src1
249269
G4_RegVar* addrTaken = src->asAddrExp()->getRegVar();
250-
addToPointsToSet( ptr->asRegVar(), addrTaken );
270+
addToPointsToSet(ptr->asRegVar(), addrTaken);
251271
}
252272
else
253273
{
254274
G4_VarBase* srcPtr = src->isSrcRegRegion() ? src->asSrcRegRegion()->getBase() : nullptr;
255275
// case 5: add/mul A0 A1 src1
256276
// merge the two addr's points-to set together
257-
if (srcPtr && (ptr->asRegVar()->getId() != srcPtr->asRegVar()->getId()) )
277+
if (srcPtr && (ptr->asRegVar()->getId() != srcPtr->asRegVar()->getId()))
258278
{
259-
mergePointsToSet( srcPtr->asRegVar(), ptr->asRegVar() );
279+
mergePointsToSet(srcPtr->asRegVar(), ptr->asRegVar());
260280
}
261281
}
262282
}
263283
else if (ptr->isRegVar() && ptr->asRegVar()->isPhyRegAssigned())
264284
{
265-
// OK, using builtin a0 or a0.2 directly.
285+
// OK, using builtin a0 or a0.2 directly.
266286
}
267287
else
268288
{
269289
// case 6: add/mul A0 V1 V2
270290
DEBUG_MSG("unexpected addr add/mul for pointer analysis:\n");
271291
DEBUG_EMIT(inst);
272292
DEBUG_MSG("\n")
273-
for (int i = 0, size = (int)addrTakenVariables.size(); i < size; i++)
274-
{
275-
addToPointsToSet( ptr->asRegVar(), addrTakenVariables[i] );
276-
}
293+
for (int i = 0, size = (int)addrTakenVariables.size(); i < size; i++)
294+
{
295+
addToPointsToSet(ptr->asRegVar(), addrTakenVariables[i]);
296+
}
277297
}
278298
}
279299
else
@@ -284,7 +304,24 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
284304
DEBUG_MSG("\n");
285305
for (int i = 0, size = (int)addrTakenVariables.size(); i < size; i++)
286306
{
287-
addToPointsToSet( ptr->asRegVar(), addrTakenVariables[i] );
307+
addToPointsToSet(ptr->asRegVar(), addrTakenVariables[i]);
308+
}
309+
}
310+
}
311+
else if (ptr->isRegVar() && !ptr->asRegVar()->getDeclare()->isMsgDesc())
312+
{
313+
for (int i = 0; i < G4_MAX_SRCS; i++)
314+
{
315+
G4_Operand* src = inst->getSrc(i);
316+
G4_VarBase* srcPtr = (src && src->isSrcRegRegion()) ? src->asSrcRegRegion()->getBase() : nullptr;
317+
if (srcPtr != nullptr && srcPtr->isRegVar())
318+
{
319+
std::list<G4_RegVar*>::iterator addrDst = std::find(addrTakenDsts.begin(), addrTakenDsts.end(), srcPtr->asRegVar());
320+
if (addrDst != addrTakenDsts.end())
321+
{
322+
addrTakenDsts.push_back(ptr->asRegVar());
323+
addrTakenMapping[ptr->asRegVar()] = addrTakenMapping[srcPtr->asRegVar()];
324+
}
288325
}
289326
}
290327
}
@@ -294,11 +331,11 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
294331

295332
#ifdef DEBUG_VERBOSE_ON
296333
DEBUG_VERBOSE("Results of points-to analysis:\n");
297-
for( unsigned int i = 0; i < numAddrs; i++ )
334+
for (unsigned int i = 0; i < numAddrs; i++)
298335
{
299336
DEBUG_VERBOSE("Addr " << i);
300337
REGVAR_VECTOR grfVec = pointsToSets[addrPointsToSetIndex[i]];
301-
for( unsigned int j = 0; j < grfVec.size(); j++ )
338+
for (unsigned int j = 0; j < grfVec.size(); j++)
302339
{
303340
DEBUG_EMIT(grfVec[j]);
304341
DEBUG_VERBOSE("\t");
@@ -316,16 +353,16 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
316353
G4_INST* inst = (*iter);
317354
G4_DstRegRegion* dst = inst->getDst();
318355

319-
if( dst != NULL &&
320-
dst->getRegAccess() == IndirGRF )
356+
if (dst != NULL &&
357+
dst->getRegAccess() == IndirGRF)
321358
{
322359
G4_VarBase* dstptr = dst->getBase();
323-
MUST_BE_TRUE( dstptr->isRegVar() && dstptr->asRegVar()->getDeclare()->getRegFile() == G4_ADDRESS,
324-
"base must be address" );
325-
addPointsToSetToBB( bb->getId(), dstptr->asRegVar() );
360+
MUST_BE_TRUE(dstptr->isRegVar() && dstptr->asRegVar()->getDeclare()->getRegFile() == G4_ADDRESS,
361+
"base must be address");
362+
addPointsToSetToBB(bb->getId(), dstptr->asRegVar());
326363
}
327364

328-
for( unsigned j = 0; j < G4_MAX_SRCS; j++ )
365+
for (unsigned j = 0; j < G4_MAX_SRCS; j++)
329366
{
330367
//
331368
// look for indirect reg access r[ptr] which refers addrTaken reg var
@@ -336,25 +373,25 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
336373

337374
G4_SrcRegRegion* src = inst->getSrc(j)->asSrcRegRegion();
338375

339-
if( src->getRegAccess() == IndirGRF )
376+
if (src->getRegAccess() == IndirGRF)
340377
{
341378
G4_VarBase* srcptr = src->getBase();
342-
MUST_BE_TRUE( srcptr->isRegVar() && srcptr->asRegVar()->getDeclare()->getRegFile() == G4_ADDRESS,
343-
"base must be address" );
344-
addPointsToSetToBB( bb->getId(), srcptr->asRegVar() );
379+
MUST_BE_TRUE(srcptr->isRegVar() && srcptr->asRegVar()->getDeclare()->getRegFile() == G4_ADDRESS,
380+
"base must be address");
381+
addPointsToSetToBB(bb->getId(), srcptr->asRegVar());
345382
}
346383
}
347384
}
348385
}
349386

350387
#ifdef DEBUG_VERBOSE_ON
351-
for( unsigned int i = 0; i < numBBs; i++ )
388+
for (unsigned int i = 0; i < numBBs; i++)
352389
{
353390
DEBUG_VERBOSE("Indirect uses for BB" << i << "\t");
354-
REGVAR_VECTOR grfVec = getIndrUseVectorForBB( i );
355-
for( unsigned int j = 0; j < grfVec.size(); j++ )
391+
REGVAR_VECTOR grfVec = getIndrUseVectorForBB(i);
392+
for (unsigned int j = 0; j < grfVec.size(); j++)
356393
{
357-
DEBUG_EMIT( grfVec[j] );
394+
DEBUG_EMIT(grfVec[j]);
358395
DEBUG_VERBOSE("\t");
359396
}
360397
DEBUG_VERBOSE("\n");

0 commit comments

Comments
 (0)