@@ -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