X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fds390%2Fralloc.c;h=3fab7c2dc497c4f3e161e0c9d050642ee650a617;hb=4660c9268ba19a8ff964673539cb9286e2574d38;hp=cd3947356f2c185d5866269031611e3ddf50d29e;hpb=edacee178430e759706c60ca562733983c406b42;p=fw%2Fsdcc diff --git a/src/ds390/ralloc.c b/src/ds390/ralloc.c index cd394735..3fab7c2d 100644 --- a/src/ds390/ralloc.c +++ b/src/ds390/ralloc.c @@ -380,13 +380,11 @@ noOverLap (set * itmpStack, symbol * fsym) { symbol *sym; - for (sym = setFirstItem (itmpStack); sym; sym = setNextItem (itmpStack)) { - if (sym->liveTo > fsym->liveFrom) + if (sym->liveTo >= fsym->liveFrom) return 0; - } return 1; @@ -1149,19 +1147,21 @@ serialRegAssign (eBBlock ** ebbs, int count) /* if it has a spillocation & is used less than all other live ranges then spill this */ - if (willCS && sym->usl.spillLoc) - { - - symbol *leastUsed = - leastUsedLR (liveRangesWith (spillable, - allLRs, - ebbs[i], - ic)); - if (leastUsed && - leastUsed->used > sym->used) - { - spillThis (sym); - continue; + if (willCS) { + if (sym->usl.spillLoc) { + symbol *leastUsed = leastUsedLR (liveRangesWith (spillable, + allLRs, ebbs[i], ic)); + if (leastUsed && leastUsed->used > sym->used) { + spillThis (sym); + continue; + } + } else { + /* if none of the liveRanges have a spillLocation then better + to spill this one than anything else already assigned to registers */ + if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) { + spillThis (sym); + continue; + } } } @@ -1169,7 +1169,7 @@ serialRegAssign (eBBlock ** ebbs, int count) then mark it */ if (POINTER_GET (ic) && IS_SYMOP (IC_LEFT (ic)) && getSize (OP_SYMBOL (IC_LEFT (ic))->type) - <= PTRSIZE) + <= (unsigned) PTRSIZE) { ds390_ptrRegReq++; ptrRegSet = 1; @@ -1595,20 +1595,26 @@ packRegsForAssign (iCode * ic, eBBlock * ebp) /* if the true symbol is defined in far space or on stack then we should not since this will increase register pressure */ +#if 0 if (isOperandInFarSpace (IC_RESULT (ic))) { if ((dic = farSpacePackable (ic))) goto pack; else return 0; - } +#else + if (isOperandInFarSpace(IC_RESULT(ic)) && !farSpacePackable(ic)) { + return 0; + } +#endif + /* find the definition of iTempNN scanning backwards if we find a a use of the true symbol in before we find the definition then we cannot */ for (dic = ic->prev; dic; dic = dic->prev) { - +#if 0 // jwk 20010410, the JanVanBelle case /* if there is a function call and this is a parameter & not my parameter then don't pack it */ if ((dic->op == CALL || dic->op == PCALL) && @@ -1618,6 +1624,14 @@ packRegsForAssign (iCode * ic, eBBlock * ebp) dic = NULL; break; } +#else + /* if there is a function call then don't pack it */ + if ((dic->op == CALL || dic->op == PCALL)) + { + dic = NULL; + break; + } +#endif if (SKIP_IC2 (dic)) continue; @@ -1885,7 +1899,7 @@ packRegsForOneuse (iCode * ic, operand * op, eBBlock * ebp) /* only upto 2 bytes since we cannot predict the usage of b, & acc */ - if (getSize (operandType (op)) > (fReturnSize_390 - 2) && + if (getSize (operandType (op)) > (fReturnSizeDS390 - 2) && ic->op != RETURN && ic->op != SEND && !POINTER_SET (ic) && @@ -2022,7 +2036,7 @@ isBitwiseOptimizable (iCode * ic) bit | bit bit | x */ - if (IS_LITERAL (rtype) || + if ( IS_LITERAL (rtype) || (IS_BITVAR (ltype) && IN_BITSPACE (SPEC_OCLS (ltype)))) return TRUE; else @@ -2194,7 +2208,10 @@ packForPush (iCode * ic, eBBlock * ebp) for (lic = ic; lic != dic ; lic = lic->prev) { if (bitVectBitValue(dbv,lic->key)) return ; } - + /* extend the live range of replaced operand if needed */ + if (OP_SYMBOL(IC_RIGHT(dic))->liveTo < ic->seq) { + OP_SYMBOL(IC_RIGHT(dic))->liveTo = ic->seq; + } /* we now we know that it has one & only one def & use and the that the definition is an assignment */ IC_LEFT (ic) = IC_RIGHT (dic); @@ -2315,14 +2332,12 @@ packRegisters (eBBlock * ebp) } } +#if 0 /* if the condition of an if instruction is defined in the previous instruction then mark the itemp as a conditional */ if ((IS_CONDITIONAL (ic) || - ((ic->op == BITWISEAND || - ic->op == '|' || - ic->op == '^') && - isBitwiseOptimizable (ic))) && + (IS_BITWISE_OP(ic) && isBitwiseOptimizable(ic))) && ic->next && ic->next->op == IFX && isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) && OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq) @@ -2331,6 +2346,22 @@ packRegisters (eBBlock * ebp) OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND; continue; } +#else + /* if the condition of an if instruction + is defined in the previous instruction and + this is the only usage then + mark the itemp as a conditional */ + if ((IS_CONDITIONAL (ic) || + (IS_BITWISE_OP(ic) && isBitwiseOptimizable (ic))) && + ic->next && ic->next->op == IFX && + bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 && + isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) && + OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq) + { + OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND; + continue; + } +#endif /* reduce for support function calls */ if (ic->supportRtn || ic->op == '+' || ic->op == '-')