statement inside a loop, it was not being considered part of the loop.
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1939
4a8a32a2-be11-0410-ad9d-
d568d2c75423
{
edge *ep = item;
V_ARG (set **, allRegion);
{
edge *ep = item;
V_ARG (set **, allRegion);
+ V_ARG (eBBlock **,ebbs);
+ V_ARG (int,count);
region *aloop = newRegion ();
eBBlock *block;
region *aloop = newRegion ();
eBBlock *block;
+ int dfMin = count ,dfMax =0, i;
/* make sure regionStack is empty */
while (!STACK_EMPTY (regionStack))
/* make sure regionStack is empty */
while (!STACK_EMPTY (regionStack))
+ /* set max & min dfNum for loopRegion */
+ for ( block = setFirstItem(aloop->regBlocks); block;
+ block = setNextItem(aloop->regBlocks)) {
+ if (block->dfnum > dfMax) dfMax = block->dfnum;
+ if (block->dfnum < dfMin) dfMin = block->dfnum;
+ }
+
+ /* all blocks that have dfnumbers between dfMin & dfMax are also
+ part of loop */
+ for (i = 0 ; i < count ; i++) {
+ if (ebbs[i]->dfnum > dfMin && ebbs[i]->dfnum < dfMax) {
+ loopInsert(&aloop->regBlocks,ebbs[i]);
+ }
+ }
/* now add it to the set */
addSetHead (allRegion, aloop);
return 0;
/* now add it to the set */
addSetHead (allRegion, aloop);
return 0;
/* for each of these back edges get the blocks that */
/* constitute the loops */
/* for each of these back edges get the blocks that */
/* constitute the loops */
- applyToSet (bEdges, createLoop, &allRegion);
+ applyToSet (bEdges, createLoop, &allRegion, ebbs,count);
/* now we will create regions from these loops */
/* loops with the same entry points are considered to be the */
/* now we will create regions from these loops */
/* loops with the same entry points are considered to be the */