@@ -119,28 +119,39 @@ PointsToAnalysis::~PointsToAnalysis()
119
119
// It's performed only once at the beginning of RA, at the point where all variables
120
120
// are virtual and no spill code (either for address or GRF) has been inserted.
121
121
//
122
- void PointsToAnalysis::doPointsToAnalysis (FlowGraph & fg)
122
+ void PointsToAnalysis::doPointsToAnalysis (FlowGraph& fg)
123
123
{
124
-
125
- if ( numAddrs == 0 )
124
+ if (numAddrs == 0 )
126
125
{
127
126
return ;
128
127
}
129
128
130
129
// keep a list of address taken variables
130
+ std::list<G4_RegVar*> addrTakenDsts;
131
+ std::map<G4_RegVar*, G4_RegVar*> addrTakenMapping;
131
132
std::vector<G4_RegVar*> addrTakenVariables;
133
+
132
134
for (BB_LIST_ITER it = fg.begin (), itend = fg.end (); it != itend; ++it)
133
135
{
134
136
G4_BB* bb = (*it);
135
137
for (INST_LIST_ITER iter = bb->begin (), iterEnd = bb->end (); iter != iterEnd; ++iter)
136
138
{
137
139
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)
139
143
{
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++)
142
147
{
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
+ }
144
155
}
145
156
}
146
157
}
@@ -154,7 +165,7 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
154
165
{
155
166
G4_INST* inst = (*iter);
156
167
157
- if (inst->isPseudoKill () || inst->isLifeTimeEnd ())
168
+ if (inst->isPseudoKill () || inst->isLifeTimeEnd ())
158
169
{
159
170
// No need to consider these lifetime placeholders for points2analysis
160
171
continue ;
@@ -169,16 +180,16 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
169
180
{
170
181
171
182
// 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 ())
173
184
{
174
185
G4_Operand* src = inst->getSrc (0 );
175
- if ( src->isAddrExp () )
186
+ if ( src->isAddrExp ())
176
187
{
177
- // case 1: mov A0 &GRF
188
+ // case 1: mov A0 &GRF
178
189
G4_RegVar* addrTaken = src->asAddrExp ()->getRegVar ();
179
190
if (addrTaken != NULL )
180
191
{
181
- addToPointsToSet ( ptr->asRegVar (), addrTaken );
192
+ addToPointsToSet (ptr->asRegVar (), addrTaken);
182
193
}
183
194
}
184
195
else
@@ -190,50 +201,59 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
190
201
{
191
202
// case 2: mov A0 A1
192
203
// 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 ())
194
205
{
195
- mergePointsToSet ( srcPtr->asRegVar (), ptr->asRegVar () );
206
+ mergePointsToSet (srcPtr->asRegVar (), ptr->asRegVar ());
196
207
}
197
208
}
198
209
else
199
210
{
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
206
218
{
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
+ }
208
228
}
209
229
}
210
230
}
211
231
}
212
- else if ( inst->isArithmetic () )
232
+ else if ( inst->isArithmetic ())
213
233
{
214
234
G4_Operand* src0 = inst->getSrc (0 );
215
235
G4_Operand* src1 = inst->getSrc (1 );
216
236
bool src0addr = false ;
217
- if ( src0->isAddrExp () )
237
+ if ( src0->isAddrExp ())
218
238
{
219
239
src0addr = true ;
220
240
}
221
- else if ( src0->isSrcRegRegion () && src0->getRegAccess () == Direct )
241
+ else if ( src0->isSrcRegRegion () && src0->getRegAccess () == Direct)
222
242
{
223
- if ( src0->isAddress () )
243
+ if ( src0->isAddress ())
224
244
{
225
245
src0addr = true ;
226
246
}
227
247
}
228
248
229
249
bool src1addr = false ;
230
- if ( src1->isAddrExp () )
250
+ if ( src1->isAddrExp ())
231
251
{
232
252
src1addr = true ;
233
253
}
234
- else if ( src1->isSrcRegRegion () && src1->getRegAccess () == Direct )
254
+ else if ( src1->isSrcRegRegion () && src1->getRegAccess () == Direct)
235
255
{
236
- if ( src1->isAddress () )
256
+ if ( src1->isAddress ())
237
257
{
238
258
src1addr = true ;
239
259
}
@@ -243,37 +263,37 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
243
263
{
244
264
G4_Operand* src = src0addr ? src0 : src1;
245
265
246
- if ( src->isAddrExp () )
266
+ if ( src->isAddrExp ())
247
267
{
248
268
// case 4: add/mul A0 &GRF src1
249
269
G4_RegVar* addrTaken = src->asAddrExp ()->getRegVar ();
250
- addToPointsToSet ( ptr->asRegVar (), addrTaken );
270
+ addToPointsToSet (ptr->asRegVar (), addrTaken);
251
271
}
252
272
else
253
273
{
254
274
G4_VarBase* srcPtr = src->isSrcRegRegion () ? src->asSrcRegRegion ()->getBase () : nullptr ;
255
275
// case 5: add/mul A0 A1 src1
256
276
// 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 ()))
258
278
{
259
- mergePointsToSet ( srcPtr->asRegVar (), ptr->asRegVar () );
279
+ mergePointsToSet (srcPtr->asRegVar (), ptr->asRegVar ());
260
280
}
261
281
}
262
282
}
263
283
else if (ptr->isRegVar () && ptr->asRegVar ()->isPhyRegAssigned ())
264
284
{
265
- // OK, using builtin a0 or a0.2 directly.
285
+ // OK, using builtin a0 or a0.2 directly.
266
286
}
267
287
else
268
288
{
269
289
// case 6: add/mul A0 V1 V2
270
290
DEBUG_MSG (" unexpected addr add/mul for pointer analysis:\n " );
271
291
DEBUG_EMIT (inst);
272
292
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
+ }
277
297
}
278
298
}
279
299
else
@@ -284,7 +304,24 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
284
304
DEBUG_MSG (" \n " );
285
305
for (int i = 0 , size = (int )addrTakenVariables.size (); i < size; i++)
286
306
{
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
+ }
288
325
}
289
326
}
290
327
}
@@ -294,11 +331,11 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
294
331
295
332
#ifdef DEBUG_VERBOSE_ON
296
333
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++)
298
335
{
299
336
DEBUG_VERBOSE (" Addr " << i);
300
337
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++)
302
339
{
303
340
DEBUG_EMIT (grfVec[j]);
304
341
DEBUG_VERBOSE (" \t " );
@@ -316,16 +353,16 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
316
353
G4_INST* inst = (*iter);
317
354
G4_DstRegRegion* dst = inst->getDst ();
318
355
319
- if ( dst != NULL &&
320
- dst->getRegAccess () == IndirGRF )
356
+ if ( dst != NULL &&
357
+ dst->getRegAccess () == IndirGRF)
321
358
{
322
359
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 ());
326
363
}
327
364
328
- for ( unsigned j = 0 ; j < G4_MAX_SRCS; j++ )
365
+ for ( unsigned j = 0 ; j < G4_MAX_SRCS; j++)
329
366
{
330
367
//
331
368
// look for indirect reg access r[ptr] which refers addrTaken reg var
@@ -336,25 +373,25 @@ void PointsToAnalysis::doPointsToAnalysis(FlowGraph & fg)
336
373
337
374
G4_SrcRegRegion* src = inst->getSrc (j)->asSrcRegRegion ();
338
375
339
- if ( src->getRegAccess () == IndirGRF )
376
+ if ( src->getRegAccess () == IndirGRF)
340
377
{
341
378
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 ());
345
382
}
346
383
}
347
384
}
348
385
}
349
386
350
387
#ifdef DEBUG_VERBOSE_ON
351
- for ( unsigned int i = 0 ; i < numBBs; i++ )
388
+ for ( unsigned int i = 0 ; i < numBBs; i++)
352
389
{
353
390
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++)
356
393
{
357
- DEBUG_EMIT ( grfVec[j] );
394
+ DEBUG_EMIT (grfVec[j]);
358
395
DEBUG_VERBOSE (" \t " );
359
396
}
360
397
DEBUG_VERBOSE (" \n " );
0 commit comments