}
else
{
+ //if (dest != ebp)
+ // dest->inExprs = intersectSets (dest->inExprs, ebp->outExprs, THROW_DEST);
+
/* delete only if killed in this block*/
deleteItemIf (&dest->inExprs, ifKilledInBlock, ebp);
/* union the ndompset with pointers set in this block */
/* computeDataFlow - does computations for data flow accross blocks */
/*-----------------------------------------------------------------*/
void
-computeDataFlow (eBBlock ** ebbs, int count)
+computeDataFlow (ebbIndex * ebbi)
{
+ eBBlock ** ebbs = ebbi->dfOrder;
+ int count = ebbi->count;
int i;
int change = 1;
/* get blocks that can come to this block */
pred = edgesTo (ebbs[i]);
- /* make a copy of the outExpressions or outDefs : to be */
+ /* make a copy of the outExpressions and outDefs : to be */
/* used for iteration */
if (optimize.global_cse)
{
oldOutExprs = setFromSet (ebbs[i]->outExprs);
oldKilledExprs = setFromSet (ebbs[i]->killedExprs);
}
- else
- oldOutDefs = bitVectCopy (ebbs[i]->outDefs);
+ oldOutDefs = bitVectCopy (ebbs[i]->outDefs);
setToNull ((void *) &ebbs[i]->inDefs);
/* indefitions are easy just merge them by union */
/* get the immediate dominator and put it there */
if (!pBlock)
{
- eBBlock *idom = immedDom (ebbs, ebbs[i]);
+ eBBlock *idom = immedDom (ebbi, ebbs[i]);
if (idom)
addSetHead (&pred, idom);
}
/* do cse with computeOnly flag set to TRUE */
/* this by far the quickest way of computing */
- cseBBlock (ebbs[i], TRUE, ebbs, count);
+ cseBBlock (ebbs[i], TRUE, ebbi);
/* if it change we will need to iterate */
if (optimize.global_cse)
change += !isSetsEqualWith (ebbs[i]->outExprs, oldOutExprs, isCseDefEqual);
change += !isSetsEqualWith (ebbs[i]->killedExprs, oldKilledExprs, isCseDefEqual);
}
- else
- change += !bitVectEqual (ebbs[i]->outDefs, oldOutDefs);
+ change += !bitVectEqual (ebbs[i]->outDefs, oldOutDefs);
}
if (!change) /* iterate till no change */