X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCloop.c;h=238cf250b3915e0e439792f4dc8c3b93d332bfc2;hb=d8be5b9eef951edcd88af05a6800d46fffed9582;hp=7ab87a7ff8277d62140a6b17be62365b2b250715;hpb=9a33d11ed4da527058a0407d9ae493865430f316;p=fw%2Fsdcc diff --git a/src/SDCCloop.c b/src/SDCCloop.c index 7ab87a7f..238cf250 100644 --- a/src/SDCCloop.c +++ b/src/SDCCloop.c @@ -259,8 +259,11 @@ DEFSETFUNC (createLoop) { edge *ep = item; V_ARG (set **, allRegion); + V_ARG (eBBlock **,ebbs); + V_ARG (int,count); region *aloop = newRegion (); eBBlock *block; + int dfMin = count ,dfMax =0, i; /* make sure regionStack is empty */ while (!STACK_EMPTY (regionStack)) @@ -279,6 +282,22 @@ DEFSETFUNC (createLoop) } aloop->entry = ep->to; + /* 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 && + !isinSet(aloop->regBlocks,ebbs[i])) { + if (!ebbs[i]->partOfLoop) ebbs[i]->partOfLoop = aloop; + } + } /* now add it to the set */ addSetHead (allRegion, aloop); @@ -446,11 +465,21 @@ loopInvariants (region * theLoop, eBBlock ** ebbs, int count) int lin, rin; cseDef *ivar; - /* if there are function calls in this block and this - is a pointer get, the function could have changed it - so skip, ISO-C99 according to David A. Long */ - if (fCallsInBlock && POINTER_GET(ic)) { - continue; + /* jwk: TODO this is only needed if the call is between + here and the definition, but I am too lazy to do that now */ + + /* if there are function calls in this block */ + if (fCallsInBlock) { + + /* if this is a pointer get */ + if (POINTER_GET(ic)) { + continue; + } + + /* if this is an assignment from a global */ + if (ic->op=='=' && isOperandGlobal(IC_RIGHT(ic))) { + continue; + } } if (SKIP_IC (ic) || POINTER_SET (ic) || ic->op == IFX) @@ -1044,7 +1073,7 @@ loopInduction (region * loopReg, eBBlock ** ebbs, int count) /* add the induction variable vector to the last block in the loop */ lastBlock->isLastInLoop = 1; - lastBlock->linds = indVect; + lastBlock->linds = bitVectUnion(lastBlock->linds,indVect); } setToNull ((void **) &indVars); @@ -1144,7 +1173,7 @@ createLoopRegions (eBBlock ** ebbs, int count) /* 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 */