1 /* This port is in development, UNSTABLE, DEVELOPERS ONLY! */
4 R0-^-R2(R0L-R2H) used for scratch (byte, word, pointer)
5 R3L-^-R6H used for bytes
7 R15/R6-v-R4 used for words
12 /*------------------------------------------------------------------------
14 SDCCralloc.c - source file for register allocation. (xa51) specific
18 This program is free software; you can redistribute it and/or modify it
19 under the terms of the GNU General Public License as published by the
20 Free Software Foundation; either version 2, or (at your option) any
23 This program is distributed in the hope that it will be useful,
24 but WITHOUT ANY WARRANTY; without even the implied warranty of
25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 GNU General Public License for more details.
28 You should have received a copy of the GNU General Public License
29 along with this program; if not, write to the Free Software
30 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
32 In other words, you are welcome to use, share and improve this program.
33 You are forbidden to forbid anyone else to use, share and improve
34 what you give them. Help stamp out software-hoarding!
35 -------------------------------------------------------------------------*/
41 extern void genXA51Code (iCode *);
53 bitVect *totRegAssigned; /* final set of LRs that got into registers */
56 bitVect *funcrUsed; /* registers used in a function */
63 // index size type name regMask isFree symbol
64 {R0L_ID, 1, REG_SCR, "r0l", 0x0001, 1, NULL}, // r0l used for scratch
65 {R0H_ID, 1, REG_SCR, "r0h", 0x0002, 1, NULL}, // r0h used for scratch
66 {R1L_ID, 1, REG_SCR, "r1l", 0x0004, 1, NULL}, // r1l used for scratch
67 {R1H_ID, 1, REG_SCR, "r1h", 0x0008, 1, NULL}, // r1h used for scratch
68 {R2L_ID, 1, REG_PTR, "r2l", 0x0010, 1, NULL},
69 {R2H_ID, 1, REG_PTR, "r2h", 0x0020, 1, NULL},
70 {R3L_ID, 1, REG_PTR, "r3l", 0x0040, 1, NULL},
71 {R3H_ID, 1, REG_PTR, "r3h", 0x0080, 1, NULL},
72 {R4L_ID, 1, REG_PTR, "r4l", 0x0100, 1, NULL},
73 {R4H_ID, 1, REG_PTR, "r4h", 0x0200, 1, NULL},
74 {R5L_ID, 1, REG_PTR, "r5l", 0x0400, 1, NULL},
75 {R5H_ID, 1, REG_PTR, "r5h", 0x0800, 1, NULL},
76 {R6L_ID, 1, REG_PTR, "r6l", 0x1000, 1, NULL},
77 {R6H_ID, 1, REG_PTR, "r6h", 0x2000, 1, NULL},
78 {R7L_ID, 1, REG_STK, "r7l", 0x4000, 1, NULL}, // r7=SP
79 {R7H_ID, 1, REG_STK, "r7h", 0x8000, 1, NULL}, // r7=SP
81 {R0_ID, 2, REG_SCR, "r0", 0x0003, 1, NULL}, // r0 used for scratch
82 {R1_ID, 2, REG_SCR, "r1", 0x000c, 1, NULL}, // r1 used for scratch
83 {R2_ID, 2, REG_PTR, "r2", 0x0030, 1, NULL},
84 {R3_ID, 2, REG_PTR, "r3", 0x00c0, 1, NULL},
85 {R4_ID, 2, REG_PTR, "r4", 0x0300, 1, NULL},
86 {R5_ID, 2, REG_PTR, "r5", 0x0c00, 1, NULL},
87 {R6_ID, 2, REG_PTR, "r6", 0x3000, 1, NULL},
88 {R7_ID, 2, REG_STK, "r7", 0xc000, 1, NULL}, // r7=SP
89 #if 0 // some derivates have even more! (only bit/word access no ptr use)
90 {R8_ID, 2, REG_GPR, "r8", 0x010000, 1, NULL},
91 {R9_ID, 2, REG_GPR, "r9", 0x020000, 1, NULL},
92 {R10_ID, 2, REG_GPR, "r10", 0x040000, 1, NULL},
93 {R11_ID, 2, REG_GPR, "r11", 0x080000, 1, NULL},
94 {R12_ID, 2, REG_GPR, "r12", 0x100000, 1, NULL},
95 {R13_ID, 2, REG_GPR, "r13", 0x200000, 1, NULL},
96 {R14_ID, 2, REG_GPR, "r14", 0x400000, 1, NULL},
97 {R15_ID, 2, REG_GPR, "r15", 0x800000, 1, NULL},
99 {R0R1_ID, 4, REG_GPR, "(r0,r1)", 0x000f, 1, NULL},
100 {R2R3_ID, 4, REG_GPR, "(r2,r3)", 0x00f0, 1, NULL},
101 {R4R5_ID, 4, REG_GPR, "(r4,r5)", 0x0f00, 1, NULL},
102 {R6R7_ID, 4, REG_GPR, "(r6,r7)", 0xf000, 1, NULL},
105 int xa51_nRegs=sizeof(regsXA51)/sizeof(regs);
107 // the currently in use registers
108 unsigned long xa51RegsInUse=0;
110 // this should be set with a command line switch
111 bool xa51HasGprRegs=0;
113 /*-----------------------------------------------------------------*/
114 /* xa51_regWithMask - returns pointer to register with mask */
115 /*-----------------------------------------------------------------*/
116 regs *xa51_regWithMask (unsigned long mask) {
118 for (i=0; i<xa51_nRegs; i++) {
119 if (regsXA51[i].regMask==mask) {
126 /*-----------------------------------------------------------------*/
127 /* checkRegsMask - check the consistancy of the regMask redundancy */
128 /*-----------------------------------------------------------------*/
130 void checkRegMask(char *f) { // for debugging purposes only
132 unsigned long regMask=0;
134 // rebuild the regmask
135 for (i=0; i<xa51_nRegs; i++) {
136 if (!regsXA51[i].isFree) {
137 regMask |= regsXA51[i].regMask;
142 if (regMask != xa51RegsInUse) {
143 fprintf (stderr, "error(%s): regMask inconsistent 0x%08lx != 0x%08lx\n",
144 f, regMask, xa51RegsInUse);
145 regMask=regMask^xa51RegsInUse;
146 fprintf (stderr, "%s used by %s\n",
147 xa51_regWithMask(regMask)->name,
148 xa51_regWithMask(regMask)->sym->name);
155 char *regTypeToStr(short type) {
158 case REG_PTR: return "ptr"; break; // pointer
159 case REG_GPR: return "gpr"; break; // general purpose
160 case REG_CND: return "cnd"; break; // condition (bit)
161 case REG_STK: return "stk"; break; // stack
162 case REG_SCR: return "scr"; break; // scratch
163 default: return "???";
167 /*-----------------------------------------------------------------*/
168 /* freeReg - frees a previous allocated register */
169 /*-----------------------------------------------------------------*/
170 static void freeReg (regs * reg, bool silent) {
172 checkRegMask(__FUNCTION__);
175 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
176 "freeReg - freeing NULL register");
181 D0(fprintf (stderr, "freeReg: (%08lx) %s (%s) ", xa51RegsInUse,
182 reg->name, reg->sym->name));
185 if (reg->isFree || ((xa51RegsInUse®->regMask)!=reg->regMask)) {
186 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
187 "freeReg - freeing unused register(s)");
190 xa51RegsInUse &= ~reg->regMask;
193 if (!silent) D0(fprintf (stderr, "(%08lx)\n", xa51RegsInUse));
195 checkRegMask(__FUNCTION__);
198 /*-----------------------------------------------------------------*/
199 /* allocReg - allocates register of given size (byte, word, dword) */
200 /* and type (ptr, gpr, cnd) */
201 /*-----------------------------------------------------------------*/
202 static bool allocReg (short size, short type, symbol *sym,
203 short offset, bool silent) {
206 checkRegMask(__FUNCTION__);
209 D0(fprintf (stderr, "allocReg (%08lx) for %s size:%d, type:%s ",
212 size, regTypeToStr(type)));
217 // TODO: gaps could be filled for dwords too
219 // let's see if we can fill a gap
220 for (i=0; i<xa51_nRegs; i++) {
221 if (regsXA51[i].size==2 && regsXA51[i].type==type) {
222 unsigned long mask=regsXA51[i].regMask & ~xa51RegsInUse;
223 if (mask && mask!=regsXA51[i].regMask) {
224 regs *reg=xa51_regWithMask(mask);
226 sym->regs[offset]=reg;
227 xa51RegsInUse |= mask;
228 reg->isFree=0; // redundant
231 D0(fprintf (stderr, "(using gap) %s\n", reg->name));
233 checkRegMask(__FUNCTION__);
238 // no we can't, fall through
240 for (i=0; i<xa51_nRegs; i++) {
241 if (regsXA51[i].size==size &&
242 regsXA51[i].type==type &&
243 (regsXA51[i].regMask & xa51RegsInUse)==0) {
244 xa51RegsInUse |= regsXA51[i].regMask;
245 regsXA51[i].isFree = 0; // redundant
246 regsXA51[i].sym = sym;
248 D0(fprintf (stderr, "%s\n", regsXA51[i].name));
250 sym->regs[offset]=®sXA51[i];
251 checkRegMask(__FUNCTION__);
256 D0(fprintf (stderr, "failed (%08lx)\n", xa51RegsInUse));
258 checkRegMask(__FUNCTION__);
262 // this must be a generic pointer
264 D0(fprintf (stderr, "trying 1+2\n"));
266 // get the generic part (gpr regs can't be byte)
267 if (allocReg (1, REG_PTR, sym, offset+1, silent)) {
268 // get the pointer part
269 if (allocReg (2, REG_PTR, sym, offset, silent)) {
270 checkRegMask(__FUNCTION__);
273 freeReg(sym->regs[offset+1], silent);
274 sym->regs[offset+1]=NULL;
276 checkRegMask(__FUNCTION__);
279 case 4: // this is a dword
281 D0(fprintf (stderr, "trying 2+2\n"));
283 if ((xa51HasGprRegs && allocReg (2, REG_GPR, sym, offset, silent)) ||
284 allocReg (2, REG_PTR, sym, offset, silent)) {
285 if ((xa51HasGprRegs && allocReg (2, REG_GPR, sym, offset+1, silent)) ||
286 allocReg (2, REG_PTR, sym, offset+1, silent)) {
287 checkRegMask(__FUNCTION__);
291 if (sym->regs[offset]) {
292 freeReg(sym->regs[offset], FALSE);
293 sym->regs[offset]=NULL;
295 checkRegMask(__FUNCTION__);
299 fprintf (stderr, "\nallocReg: cannot allocate reg of size %d\n", size);
304 /*-------------------------------------------------------------------*/
305 /* freeAllRegs - frees all registers */
306 /*-------------------------------------------------------------------*/
307 // just to be sure, this should not be needed
308 static void freeAllRegs (void) {
313 checkRegMask(__FUNCTION__);
316 for (i=0; i<xa51_nRegs; i++) {
317 if (!regsXA51[i].isFree) {
318 strcat (regsFreed, regsXA51[i].name);
319 strcat (regsFreed, " ");
320 regsXA51[i].isFree=1;
321 regsXA51[i].sym=NULL;
327 fprintf (stderr, "freeAllRegisters: %d regs freed (%s)\n", nfr, regsFreed);
332 /*-----------------------------------------------------------------*/
333 /* allDefsOutOfRange - all definitions are out of a range */
334 /*-----------------------------------------------------------------*/
335 static bool allDefsOutOfRange (bitVect * defs, int fseq, int toseq) {
341 for (i = 0; i < defs->size; i++)
345 if (bitVectBitValue (defs, i) &&
346 (ic = hTabItemWithKey (iCodehTab, i)) &&
347 (ic->seq >= fseq && ic->seq <= toseq))
353 /*-----------------------------------------------------------------*/
354 /* computeSpillable - given a point find the spillable live ranges */
355 /*-----------------------------------------------------------------*/
356 static bitVect *computeSpillable (iCode * ic) {
359 /* spillable live ranges are those that are live at this
360 point . the following categories need to be subtracted
362 a) - those that are already spilt
363 b) - if being used by this one
364 c) - defined by this one */
366 spillable = bitVectCopy (ic->rlive);
368 bitVectCplAnd (spillable, _G.spiltSet); /* those already spilt */
370 bitVectCplAnd (spillable, ic->uses); /* used in this one */
371 bitVectUnSetBit (spillable, ic->defKey); /* defined by this one */
372 spillable = bitVectIntersect (spillable, _G.regAssigned);
377 /*-----------------------------------------------------------------*/
378 /* noSpilLoc - return true if a variable has no spil location */
379 /*-----------------------------------------------------------------*/
381 noSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
383 return (sym->usl.spillLoc ? 0 : 1);
386 /*-----------------------------------------------------------------*/
387 /* hasSpilLoc - will return 1 if the symbol has spil location */
388 /*-----------------------------------------------------------------*/
390 hasSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
392 return (sym->usl.spillLoc ? 1 : 0);
395 /*-----------------------------------------------------------------*/
396 /* hasSpilLocnoUptr - will return 1 if the symbol has spil location */
397 /* but is not used as a pointer */
398 /*-----------------------------------------------------------------*/
400 hasSpilLocnoUptr (symbol * sym, eBBlock * ebp, iCode * ic)
402 return ((sym->usl.spillLoc && !sym->uptr) ? 1 : 0);
405 /*-----------------------------------------------------------------*/
406 /* rematable - will return 1 if the remat flag is set */
407 /*-----------------------------------------------------------------*/
409 rematable (symbol * sym, eBBlock * ebp, iCode * ic)
414 /*-----------------------------------------------------------------*/
415 /* notUsedInBlock - not used in this block */
416 /*-----------------------------------------------------------------*/
418 notUsedInBlock (symbol * sym, eBBlock * ebp, iCode * ic)
420 return (!bitVectBitsInCommon (sym->defs, ebp->usesDefs) &&
421 allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq));
422 /* return (!bitVectBitsInCommon(sym->defs,ebp->usesDefs)); */
425 /*-----------------------------------------------------------------*/
426 /* notUsedInRemaining - not used or defined in remain of the block */
427 /*-----------------------------------------------------------------*/
429 notUsedInRemaining (symbol * sym, eBBlock * ebp, iCode * ic)
431 return ((usedInRemaining (operandFromSymbol (sym), ic) ? 0 : 1) &&
432 allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq));
435 /*-----------------------------------------------------------------*/
436 /* allLRs - return true for all */
437 /*-----------------------------------------------------------------*/
439 allLRs (symbol * sym, eBBlock * ebp, iCode * ic)
444 /*-----------------------------------------------------------------*/
445 /* liveRangesWith - applies function to a given set of live range */
446 /*-----------------------------------------------------------------*/
448 liveRangesWith (bitVect * lrs, int (func) (symbol *, eBBlock *, iCode *),
449 eBBlock * ebp, iCode * ic)
454 if (!lrs || !lrs->size)
457 for (i = 1; i < lrs->size; i++)
460 if (!bitVectBitValue (lrs, i))
463 /* if we don't find it in the live range
464 hash table we are in serious trouble */
465 if (!(sym = hTabItemWithKey (liveRanges, i)))
467 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
468 "liveRangesWith could not find liveRange");
472 if (func (sym, ebp, ic) && bitVectBitValue (_G.regAssigned, sym->key))
473 addSetHead (&rset, sym);
480 /*-----------------------------------------------------------------*/
481 /* leastUsedLR - given a set determines which is the least used */
482 /*-----------------------------------------------------------------*/
484 leastUsedLR (set * sset)
486 symbol *sym = NULL, *lsym = NULL;
488 sym = lsym = setFirstItem (sset);
493 for (; lsym; lsym = setNextItem (sset))
496 /* if usage is the same then prefer
497 the spill the smaller of the two */
498 if (lsym->used == sym->used)
499 if (getSize (lsym->type) < getSize (sym->type))
503 if (lsym->used < sym->used)
508 setToNull ((void **) &sset);
513 /*-----------------------------------------------------------------*/
514 /* noOverLap - will iterate through the list looking for over lap */
515 /*-----------------------------------------------------------------*/
517 noOverLap (set * itmpStack, symbol * fsym)
522 for (sym = setFirstItem (itmpStack); sym;
523 sym = setNextItem (itmpStack))
525 if (bitVectBitValue(sym->clashes,fsym->key)) return 0;
531 /*-----------------------------------------------------------------*/
532 /* isFree - will return 1 if the a free spil location is found */
533 /*-----------------------------------------------------------------*/
534 static DEFSETFUNC (isFree) {
536 V_ARG (symbol **, sloc);
537 V_ARG (symbol *, fsym);
539 /* if already found */
543 /* if it is free && and the itmp assigned to
544 this does not have any overlapping live ranges
545 with the one currently being assigned and
546 the size can be accomodated */
548 noOverLap (sym->usl.itmpStack, fsym) &&
549 /* TODO: this is a waste but causes to many problems
550 getSize (sym->type) >= getSize (fsym->type)) {
552 getSize (sym->type) == getSize (fsym->type)) {
560 /*-----------------------------------------------------------------*/
561 /* createStackSpil - create a location on the stack to spil */
562 /*-----------------------------------------------------------------*/
564 createStackSpil (symbol * sym)
569 D1(fprintf (stderr, " createStackSpil for %s\n", sym->name));
571 /* first go try and find a free one that is already
572 existing on the stack */
573 if (applyToSet (_G.stackSpil, isFree, &sloc, sym))
575 /* found a free one : just update & return */
576 sym->usl.spillLoc = sloc;
579 addSetHead (&sloc->usl.itmpStack, sym);
580 D1(fprintf (stderr, " using existing %s\n", sloc->name));
584 sprintf (slocBuffer, "sloc%d", _G.slocNum++);
585 sloc = newiTemp (slocBuffer);
587 /* set the type to the spilling symbol */
588 sloc->type = copyLinkChain (sym->type);
589 sloc->etype = getSpec (sloc->type);
590 SPEC_SCLS (sloc->etype) = S_STACK;
591 SPEC_EXTR (sloc->etype) = 0;
592 SPEC_STAT (sloc->etype) = 0;
593 SPEC_VOLATILE(sloc->etype) = 0;
594 SPEC_ABSA(sloc->etype) = 0;
598 sloc->isref = 1; /* to prevent compiler warning */
600 currFunc->stack += getSize (sloc->type);
601 _G.stackExtend += getSize (sloc->type);
603 /* add it to the _G.stackSpil set */
604 addSetHead (&_G.stackSpil, sloc);
605 sym->usl.spillLoc = sloc;
608 /* add it to the set of itempStack set
609 of the spill location */
610 addSetHead (&sloc->usl.itmpStack, sym);
614 /*-----------------------------------------------------------------*/
615 /* spillThis - spils a specific operand */
616 /*-----------------------------------------------------------------*/
618 spillThis (symbol * sym)
622 D1(fprintf (stderr, " spillThis: %s\n", sym->name));
624 /* if this is rematerializable or has a spillLocation
625 we are okay, else we need to create a spillLocation
627 if (!(sym->remat || sym->usl.spillLoc))
628 createStackSpil (sym);
631 /* mark it has spilt & put it in the spilt set */
632 sym->isspilt = sym->spillA = 1;
633 _G.spiltSet = bitVectSetBit (_G.spiltSet, sym->key);
635 bitVectUnSetBit (_G.regAssigned, sym->key);
636 bitVectUnSetBit (_G.totRegAssigned, sym->key);
638 for (i = 0; i < sym->nRegs; i++)
642 freeReg (sym->regs[i], FALSE);
645 if (sym->usl.spillLoc && !sym->remat)
646 sym->usl.spillLoc->allocreq++;
650 /*-----------------------------------------------------------------*/
651 /* selectSpil - select a iTemp to spil : rather a simple procedure */
652 /*-----------------------------------------------------------------*/
654 selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym)
656 bitVect *lrcs = NULL;
660 /* get the spillable live ranges */
661 lrcs = computeSpillable (ic);
663 /* get all live ranges that are rematerizable */
664 if ((selectS = liveRangesWith (lrcs, rematable, ebp, ic)))
666 /* return the least used of these */
667 return leastUsedLR (selectS);
670 /* if the symbol is local to the block then */
671 if (forSym->liveTo < ebp->lSeq)
674 /* check if there are any live ranges allocated
675 to registers that are not used in this block */
676 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInBlock, ebp, ic)))
678 sym = leastUsedLR (selectS);
679 /* if this is not rematerializable */
688 /* check if there are any live ranges that not
689 used in the remainder of the block */
690 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic)))
692 sym = leastUsedLR (selectS);
705 /* find live ranges with spillocation && not used as pointers */
706 if ((selectS = liveRangesWith (lrcs, hasSpilLocnoUptr, ebp, ic)))
709 sym = leastUsedLR (selectS);
710 /* mark this as allocation required */
711 sym->usl.spillLoc->allocreq++;
715 /* find live ranges with spillocation */
716 if ((selectS = liveRangesWith (lrcs, hasSpilLoc, ebp, ic)))
719 sym = leastUsedLR (selectS);
720 sym->usl.spillLoc->allocreq++;
724 /* couldn't find then we need to create a spil
725 location on the stack , for which one? the least
727 if ((selectS = liveRangesWith (lrcs, noSpilLoc, ebp, ic)))
730 /* return a created spil location */
731 sym = createStackSpil (leastUsedLR (selectS));
732 sym->usl.spillLoc->allocreq++;
736 /* this is an extreme situation we will spill
737 this one : happens very rarely but it does happen */
742 /*-----------------------------------------------------------------*/
743 /* spillSomething - spil some variable & mark registers as free */
744 /*-----------------------------------------------------------------*/
746 spillSomething (iCode * ic, eBBlock * ebp, symbol * forSym)
751 /* get something we can spil */
752 ssym = selectSpil (ic, ebp, forSym);
754 D1(fprintf (stderr, " spillSomething: spilling %s\n", ssym->name));
756 /* mark it as spilt */
757 ssym->isspilt = ssym->spillA = 1;
758 _G.spiltSet = bitVectSetBit (_G.spiltSet, ssym->key);
760 /* mark it as not register assigned &
761 take it away from the set */
762 //bitVectUnSetBit (_G.regAssigned, ssym->key);
763 //bitVectUnSetBit (_G.totRegAssigned, ssym->key);
765 /* mark the registers as free */
766 for (i = 0; i < ssym->nRegs; i++) {
768 freeReg (ssym->regs[i], FALSE);
769 // dont NULL ssym->regs[i], it might be used later
773 /* if this was a block level spil then insert push & pop
774 at the start & end of block respectively */
777 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
778 /* add push to the start of the block */
779 addiCodeToeBBlock (ebp, nic, (ebp->sch->op == LABEL ?
780 ebp->sch->next : ebp->sch));
781 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
782 /* add pop to the end of the block */
783 addiCodeToeBBlock (ebp, nic, NULL);
786 /* if spilt because not used in the remainder of the
787 block then add a push before this instruction and
788 a pop at the end of the block */
789 if (ssym->remainSpil)
792 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
793 /* add push just before this instruction */
794 addiCodeToeBBlock (ebp, nic, ic);
796 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
797 /* add pop to the end of the block */
798 addiCodeToeBBlock (ebp, nic, NULL);
807 /*-----------------------------------------------------------------*/
808 /* getRegPtr - will try for PTR if not a GPR type if not spil */
809 /*-----------------------------------------------------------------*/
810 static bool getRegPtr (iCode * ic, eBBlock * ebp, symbol * sym, short offset) {
812 D0(fprintf (stderr, "getRegPtr: %s ", sym->name));
813 D0(printTypeChain(sym->type, stderr));
814 D0(fprintf (stderr, "\n"));
817 /* this looks like an infinite loop but
818 in really selectSpil will abort */
820 /* try for a ptr type */
821 if (allocReg (getSize(sym->type), REG_PTR, sym, offset, FALSE))
824 /* try for gpr type */
825 if (xa51HasGprRegs && allocReg (getSize(sym->type),
826 REG_GPR, sym, offset, FALSE))
829 /* we have to spil */
830 if (!spillSomething (ic, ebp, sym))
836 /*-----------------------------------------------------------------*/
837 /* getRegGpr - will try for GPR if not spil */
838 /*-----------------------------------------------------------------*/
839 static bool getRegGpr (iCode * ic, eBBlock * ebp, symbol * sym, short offset) {
841 D0(fprintf (stderr, "getRegGpr: %s ", sym->name));
842 D0(printTypeChain(sym->type, stderr));
843 D0(fprintf (stderr, "\n"));
846 /* this looks like an infinite loop but
847 in really selectSpil will abort */
849 /* try for gpr type */
850 if (xa51HasGprRegs && allocReg (getSize(sym->type),
851 REG_GPR, sym, offset, FALSE))
854 if (allocReg (getSize(sym->type), REG_PTR, sym, offset, FALSE))
857 /* we have to spil */
858 if (!spillSomething (ic, ebp, sym))
863 /*-----------------------------------------------------------------*/
864 /* deassignLRs - check the live to and if they have registers & are */
865 /* not spilt then free up the registers */
866 /*-----------------------------------------------------------------*/
868 deassignLRs (iCode * ic, eBBlock * ebp)
873 for (sym = hTabFirstItem (liveRanges, &k); sym;
874 sym = hTabNextItem (liveRanges, &k))
876 /* if it does not end here */
877 if (sym->liveTo > ic->seq)
880 /* if it was spilt on stack then we can
881 mark the stack spil location as free */
886 sym->usl.spillLoc->isFree = 1;
892 if (!bitVectBitValue (_G.regAssigned, sym->key))
898 bitVectUnSetBit (_G.regAssigned, sym->key);
901 for (i=0; i < sym->nRegs; i++) {
902 freeReg (sym->regs[i], FALSE);
908 /*-----------------------------------------------------------------*/
909 /* willCauseSpill - determines if allocating will cause a spill */
910 /*-----------------------------------------------------------------*/
911 static bool willCauseSpill (symbol *sym) {
913 // do it the rude way
914 if (allocReg (getSize(sym->type), sym->regType, sym, 0, TRUE) ||
915 allocReg (getSize(sym->type), sym->regType==REG_PTR?REG_GPR:REG_PTR,
917 // so we can, but we won't
918 for (i=0; i<sym->nRegs; i++) {
919 freeReg (sym->regs[i], TRUE);
924 D1(fprintf (stderr, " %s will cause a spill\n", sym->name));
928 /*-----------------------------------------------------------------*/
929 /* positionRegs - the allocator can allocate same registers to res- */
930 /* ult and operand, if this happens make sure they are in the same */
931 /* position as the operand otherwise chaos results */
932 /*-----------------------------------------------------------------*/
934 positionRegs (symbol * result, symbol * opsym)
936 int count = min (result->nRegs, opsym->nRegs);
937 int i, j = 0, shared = 0;
940 /* if the result has been spilt then cannot share */
945 /* first make sure that they actually share */
946 for (i = 0; i < count; i++)
948 for (j = 0; j < count; j++)
950 if (result->regs[i] == opsym->regs[j] && i != j)
960 regs *tmp = result->regs[i];
961 result->regs[i] = result->regs[j];
962 result->regs[j] = tmp;
964 D2(fprintf (stderr, "positionRegs: rearranged regs for %s and %s\n",
965 result->name, opsym->name));
971 /*-----------------------------------------------------------------*/
972 /* serialRegAssign - serially allocate registers to the variables */
973 /*-----------------------------------------------------------------*/
975 serialRegAssign (eBBlock ** ebbs, int count)
980 for (i = 0; i < count; i++) {
984 if (ebbs[i]->noPath &&
985 (ebbs[i]->entryLabel != entryLabel &&
986 ebbs[i]->entryLabel != returnLabel))
989 /* of all instructions do */
990 for (ic = ebbs[i]->sch; ic; ic = ic->next) {
992 /* if result is present && is a true symbol */
993 if (IC_RESULT (ic) && ic->op != IFX &&
994 IS_TRUE_SYMOP (IC_RESULT (ic))) {
995 OP_SYMBOL (IC_RESULT (ic))->allocreq++;
998 /* take away registers from live
999 ranges that end at this instruction */
1000 deassignLRs (ic, ebbs[i]);
1002 /* some don't need registers */
1003 if (SKIP_IC2 (ic) ||
1004 ic->op == JUMPTABLE ||
1008 (IC_RESULT (ic) && POINTER_SET (ic)))
1011 /* now we need to allocate registers
1012 only for the result */
1013 if (IC_RESULT (ic)) {
1014 symbol *sym = OP_SYMBOL (IC_RESULT (ic));
1018 /* if it does not need or is spilt
1019 or is already assigned to registers
1020 or will not live beyond this instructions */
1023 bitVectBitValue (_G.regAssigned, sym->key) ||
1024 sym->liveTo <= ic->seq)
1027 /* if some liverange has been spilt at the block level
1028 and this one live beyond this block then spil this
1030 if (_G.blockSpil && sym->liveTo > ebbs[i]->lSeq) {
1034 /* if trying to allocate this will cause
1035 a spill and there is nothing to spill
1036 or this one is rematerializable then
1038 willCS = willCauseSpill (sym);
1039 spillable = computeSpillable (ic);
1040 if (sym->remat || (willCS && bitVectIsZero (spillable))) {
1045 /* if it has a spillocation & is used less than
1046 all other live ranges then spill this */
1048 if (sym->usl.spillLoc) {
1049 symbol *leastUsed = leastUsedLR (liveRangesWith (spillable,
1050 allLRs, ebbs[i], ic));
1051 if (leastUsed && leastUsed->used > sym->used) {
1056 /* if none of the liveRanges have a spillLocation then better
1057 to spill this one than anything else already assigned to registers */
1058 if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) {
1059 /* if this is local to this block then we might find a block spil */
1060 if (!(sym->liveFrom >= ebbs[i]->fSeq && sym->liveTo <= ebbs[i]->lSeq)) {
1068 /* else we assign registers to it */
1069 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1070 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1072 if (sym->regType == REG_PTR)
1073 getRegPtr (ic, ebbs[i], sym, 0);
1075 getRegGpr (ic, ebbs[i], sym, 0);
1077 /* if it shares registers with operands make sure
1078 that they are in the same position */
1079 if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic)) &&
1080 OP_SYMBOL (IC_LEFT (ic))->nRegs && ic->op != '=') {
1081 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1082 OP_SYMBOL (IC_LEFT (ic)));
1084 /* do the same for the right operand */
1085 if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)) &&
1086 OP_SYMBOL (IC_RIGHT (ic))->nRegs) {
1087 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1088 OP_SYMBOL (IC_RIGHT (ic)));
1095 /*-----------------------------------------------------------------*/
1096 /* rUmaskForOp :- returns register mask for an operand */
1097 /*-----------------------------------------------------------------*/
1098 bitVect *xa51_rUmaskForOp (operand * op) {
1103 /* only temporaries are assigned registers */
1107 sym = OP_SYMBOL (op);
1109 /* if spilt or no registers assigned to it
1111 if (sym->isspilt || !sym->nRegs || !sym->regs[0])
1114 rumask = newBitVect (xa51_nRegs);
1116 for (j = 0; j < sym->nRegs; j++) {
1117 rumask = bitVectSetBit (rumask,
1118 sym->regs[j]->rIdx);
1123 /*-----------------------------------------------------------------*/
1124 /* regsUsedIniCode :- returns bit vector of registers used in iCode */
1125 /*-----------------------------------------------------------------*/
1127 regsUsedIniCode (iCode * ic)
1129 bitVect *rmask = newBitVect (xa51_nRegs);
1131 /* do the special cases first */
1134 rmask = bitVectUnion (rmask,
1135 xa51_rUmaskForOp (IC_COND (ic)));
1139 /* for the jumptable */
1140 if (ic->op == JUMPTABLE)
1142 rmask = bitVectUnion (rmask,
1143 xa51_rUmaskForOp (IC_JTCOND (ic)));
1148 /* of all other cases */
1150 rmask = bitVectUnion (rmask,
1151 xa51_rUmaskForOp (IC_LEFT (ic)));
1155 rmask = bitVectUnion (rmask,
1156 xa51_rUmaskForOp (IC_RIGHT (ic)));
1159 rmask = bitVectUnion (rmask,
1160 xa51_rUmaskForOp (IC_RESULT (ic)));
1166 /*-----------------------------------------------------------------*/
1167 /* createRegMask - for each instruction will determine the regsUsed */
1168 /*-----------------------------------------------------------------*/
1170 createRegMask (eBBlock ** ebbs, int count)
1174 /* for all blocks */
1175 for (i = 0; i < count; i++)
1179 if (ebbs[i]->noPath &&
1180 (ebbs[i]->entryLabel != entryLabel &&
1181 ebbs[i]->entryLabel != returnLabel))
1184 /* for all instructions */
1185 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1190 if (SKIP_IC2 (ic) || !ic->rlive)
1193 /* first mark the registers used in this
1195 ic->rUsed = regsUsedIniCode (ic);
1196 _G.funcrUsed = bitVectUnion (_G.funcrUsed, ic->rUsed);
1198 /* now create the register mask for those
1199 registers that are in use : this is a
1200 super set of ic->rUsed */
1201 ic->rMask = newBitVect (xa51_nRegs + 1);
1203 /* for all live Ranges alive at this point */
1204 for (j = 1; j < ic->rlive->size; j++)
1209 /* if not alive then continue */
1210 if (!bitVectBitValue (ic->rlive, j))
1213 /* find the live range we are interested in */
1214 if (!(sym = hTabItemWithKey (liveRanges, j)))
1216 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
1217 "createRegMask cannot find live range");
1221 /* if no register assigned to it */
1222 if (!sym->nRegs || sym->isspilt)
1225 /* for all the registers allocated to it */
1226 for (k = 0; k < sym->nRegs; k++)
1229 bitVectSetBit (ic->rMask, sym->regs[k]->rIdx);
1235 /*-----------------------------------------------------------------*/
1236 /* rematStr - returns the rematerialized string for a remat var */
1237 /*-----------------------------------------------------------------*/
1239 rematStr (symbol * sym)
1242 iCode *ic = sym->rematiCode;
1247 /* if plus or minus print the right hand side */
1248 if (ic->op == '+' || ic->op == '-')
1250 sprintf (s, "0x%04x %c ", (int) operandLitValue (IC_RIGHT (ic)),
1253 ic = OP_SYMBOL (IC_LEFT (ic))->rematiCode;
1257 /* cast then continue */
1258 if (IS_CAST_ICODE(ic)) {
1259 ic = OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
1262 /* we reached the end */
1263 sprintf (s, "%s", OP_SYMBOL (IC_LEFT (ic))->rname);
1270 /*-----------------------------------------------------------------*/
1271 /* regTypeNum - computes the type & number of registers required */
1272 /*-----------------------------------------------------------------*/
1274 regTypeNum (eBBlock *ebbs)
1280 /* for each live range do */
1281 for (sym = hTabFirstItem (liveRanges, &k); sym;
1282 sym = hTabNextItem (liveRanges, &k))
1285 /* if used zero times then no registers needed */
1286 if ((sym->liveTo - sym->liveFrom) == 0)
1290 /* if the live range is a temporary */
1294 /* if the type is marked as a conditional */
1295 if (sym->regType == REG_CND)
1298 /* if used in return only then we don't
1301 if (sym->ruonly || sym->accuse)
1303 if (IS_AGGREGATE (sym->type) || sym->isptr)
1304 sym->type = aggrToPtr (sym->type, FALSE);
1309 /* if the symbol has only one definition &
1310 that definition is a get_pointer */
1311 if (bitVectnBitsOn (sym->defs) == 1 &&
1312 (ic = hTabItemWithKey (iCodehTab,
1313 bitVectFirstBit (sym->defs))) &&
1316 !IS_BITVAR (sym->etype))
1318 /* and that pointer is remat in data space */
1319 if (OP_SYMBOL (IC_LEFT (ic))->remat &&
1320 !IS_CAST_ICODE(OP_SYMBOL (IC_LEFT (ic))->rematiCode) &&
1321 DCL_TYPE (aggrToPtr (operandType(IC_LEFT(ic)), FALSE)) == POINTER)
1323 /* create a psuedo symbol & force a spil */
1324 symbol *psym = newSymbol (rematStr (OP_SYMBOL (IC_LEFT (ic))), 1);
1325 psym->type = sym->type;
1326 psym->etype = sym->etype;
1327 strcpy (psym->rname, psym->name);
1329 sym->usl.spillLoc = psym;
1330 #if 0 // an alternative fix for bug #480076
1331 /* now this is a useless assignment to itself */
1332 remiCodeFromeBBlock (ebbs, ic);
1334 /* now this really is an assignment to itself, make it so;
1335 it will be optimized out later */
1337 IC_RIGHT(ic)=IC_RESULT(ic);
1343 /* if in data space or idata space then try to
1344 allocate pointer register */
1348 /* if not then we require registers */
1350 sym->nRegs = ((IS_AGGREGATE (sym->type) || sym->isptr) ?
1351 getSize (sym->type = aggrToPtr (sym->type, FALSE)) :
1352 getSize (sym->type));
1355 int size=((IS_AGGREGATE (sym->type) || sym->isptr) ?
1356 getSize (sym->type = aggrToPtr (sym->type, FALSE)) :
1357 getSize (sym->type));
1361 case 2: // word or pointer
1364 case 3: // generic pointer
1367 case 4: // dword or float
1371 fprintf (stderr, "regTypeNum: unknown size\n");
1379 fprintf (stderr, "allocated more than 4 or 0 registers for type ");
1380 printTypeChain (sym->type, stderr);
1381 fprintf (stderr, "\n");
1385 /* determine the type of register required */
1386 if (IS_PTR (sym->type))
1387 sym->regType = REG_PTR;
1389 sym->regType = REG_GPR;
1393 /* for the first run we don't provide */
1394 /* registers for true symbols we will */
1395 /* see how things go */
1401 /*-----------------------------------------------------------------*/
1402 /* deallocStackSpil - this will set the stack pointer back */
1403 /*-----------------------------------------------------------------*/
1405 DEFSETFUNC (deallocStackSpil)
1413 /*-----------------------------------------------------------------*/
1414 /* packRegsForAssign - register reduction for assignment */
1415 /*-----------------------------------------------------------------*/
1417 packRegsForAssign (iCode * ic, eBBlock * ebp)
1421 if (!IS_ITEMP (IC_RIGHT (ic)) ||
1422 OP_LIVETO (IC_RIGHT (ic)) > ic->seq) {
1426 /* find the definition of iTempNN scanning backwards */
1427 for (dic = ic->prev; dic; dic = dic->prev) {
1429 /* if there is a function call then don't pack it */
1430 if ((dic->op == CALL || dic->op == PCALL)) {
1438 if (IS_SYMOP (IC_RESULT (dic)) &&
1439 IC_RESULT (dic)->key == IC_RIGHT (ic)->key) {
1446 return 0; /* did not find */
1448 /* found the definition */
1449 /* replace the result with the result of */
1450 /* this assignment and remove this assignment */
1451 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1452 IC_RESULT (dic) = IC_RESULT (ic);
1454 if (IS_ITEMP (IC_RESULT (dic)) &&
1455 OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq)
1457 OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq;
1459 /* delete from liverange table also
1460 delete from all the points inbetween and the new
1462 for (sic = dic; sic != ic; sic = sic->next)
1464 bitVectUnSetBit (sic->rlive, IC_RESULT (ic)->key);
1465 if (IS_ITEMP (IC_RESULT (dic)))
1466 bitVectSetBit (sic->rlive, IC_RESULT (dic)->key);
1469 remiCodeFromeBBlock (ebp, ic);
1470 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
1471 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
1472 OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
1477 /*-----------------------------------------------------------------*/
1478 /* findAssignToSym : scanning backwards looks for first assig found */
1479 /*-----------------------------------------------------------------*/
1481 findAssignToSym (operand * op, iCode * ic)
1485 for (dic = ic->prev; dic; dic = dic->prev)
1488 /* if definition by assignment */
1489 if (dic->op == '=' &&
1490 !POINTER_SET (dic) &&
1491 IC_RESULT (dic)->key == op->key
1492 /* && IS_TRUE_SYMOP(IC_RIGHT(dic)) */
1496 /* we are interested only if defined in far space */
1497 /* or in stack space in case of + & - */
1499 /* if assigned to a non-symbol then return
1501 if (!IS_SYMOP (IC_RIGHT (dic)))
1504 /* if the symbol is in far space then
1506 if (isOperandInFarSpace (IC_RIGHT (dic)))
1509 /* for + & - operations make sure that
1510 if it is on the stack it is the same
1511 as one of the three operands */
1512 if ((ic->op == '+' || ic->op == '-') &&
1513 OP_SYMBOL (IC_RIGHT (dic))->onStack)
1516 if (IC_RESULT (ic)->key != IC_RIGHT (dic)->key &&
1517 IC_LEFT (ic)->key != IC_RIGHT (dic)->key &&
1518 IC_RIGHT (ic)->key != IC_RIGHT (dic)->key)
1526 /* if we find an usage then we cannot delete it */
1527 if (IC_LEFT (dic) && IC_LEFT (dic)->key == op->key)
1530 if (IC_RIGHT (dic) && IC_RIGHT (dic)->key == op->key)
1533 if (POINTER_SET (dic) && IC_RESULT (dic)->key == op->key)
1537 /* now make sure that the right side of dic
1538 is not defined between ic & dic */
1541 iCode *sic = dic->next;
1543 for (; sic != ic; sic = sic->next)
1544 if (IC_RESULT (sic) &&
1545 IC_RESULT (sic)->key == IC_RIGHT (dic)->key)
1554 /*-----------------------------------------------------------------*/
1555 /* packRegsForSupport :- reduce some registers for support calls */
1556 /*-----------------------------------------------------------------*/
1558 packRegsForSupport (iCode * ic, eBBlock * ebp)
1563 /* for the left & right operand :- look to see if the
1564 left was assigned a true symbol in far space in that
1565 case replace them */
1567 if (IS_ITEMP (IC_LEFT (ic)) &&
1568 OP_SYMBOL (IC_LEFT (ic))->liveTo <= ic->seq)
1570 dic = findAssignToSym (IC_LEFT (ic), ic);
1575 /* found it we need to remove it from the
1577 for (sic = dic; sic != ic; sic = sic->next)
1578 bitVectUnSetBit (sic->rlive, IC_LEFT (ic)->key);
1580 OP_SYMBOL(IC_LEFT (ic))=OP_SYMBOL(IC_RIGHT (dic));
1581 IC_LEFT (ic)->key = OP_SYMBOL(IC_RIGHT (dic))->key;
1582 remiCodeFromeBBlock (ebp, dic);
1583 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1584 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
1588 /* do the same for the right operand */
1591 IS_ITEMP (IC_RIGHT (ic)) &&
1592 OP_SYMBOL (IC_RIGHT (ic))->liveTo <= ic->seq)
1594 iCode *dic = findAssignToSym (IC_RIGHT (ic), ic);
1600 /* if this is a subtraction & the result
1601 is a true symbol in far space then don't pack */
1602 if (ic->op == '-' && IS_TRUE_SYMOP (IC_RESULT (dic)))
1604 sym_link *etype = getSpec (operandType (IC_RESULT (dic)));
1605 if (IN_FARSPACE (SPEC_OCLS (etype)))
1608 /* found it we need to remove it from the
1610 for (sic = dic; sic != ic; sic = sic->next)
1611 bitVectUnSetBit (sic->rlive, IC_RIGHT (ic)->key);
1613 IC_RIGHT (ic)->operand.symOperand =
1614 IC_RIGHT (dic)->operand.symOperand;
1615 IC_RIGHT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
1617 remiCodeFromeBBlock (ebp, dic);
1618 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1619 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
1626 #define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
1629 /*-----------------------------------------------------------------*/
1630 /* packRegsForOneuse : - will reduce some registers for single Use */
1631 /*-----------------------------------------------------------------*/
1633 packRegsForOneuse (iCode * ic, operand * op, eBBlock * ebp)
1638 /* if returning a literal then do nothing */
1642 if (ic->op != RETURN &&
1644 !POINTER_SET (ic) &&
1648 /* this routine will mark the a symbol as used in one
1649 instruction use only && if the defintion is local
1650 (ie. within the basic block) && has only one definition &&
1651 that definiion is either a return value from a
1652 function or does not contain any variables in
1654 uses = bitVectCopy (OP_USES (op));
1655 bitVectUnSetBit (uses, ic->key); /* take away this iCode */
1656 if (!bitVectIsZero (uses)) /* has other uses */
1659 /* if it has only one defintion */
1660 if (bitVectnBitsOn (OP_DEFS (op)) > 1)
1661 return NULL; /* has more than one definition */
1663 /* get that definition */
1665 hTabItemWithKey (iCodehTab,
1666 bitVectFirstBit (OP_DEFS (op)))))
1670 /* if that only usage is a cast */
1671 if (dic->op == CAST) {
1672 /* to a bigger type */
1673 if (getSize(OP_SYM_TYPE(IC_RESULT(dic))) >
1674 getSize(OP_SYM_TYPE(IC_RIGHT(dic)))) {
1675 /* than we can not, since we cannot predict the usage of b & acc */
1681 /* found the definition now check if it is local */
1682 if (dic->seq < ebp->fSeq ||
1683 dic->seq > ebp->lSeq)
1684 return NULL; /* non-local */
1686 /* now check if it is the return from
1688 if (dic->op == CALL || dic->op == PCALL)
1690 if (ic->op != SEND && ic->op != RETURN &&
1691 !POINTER_SET(ic) && !POINTER_GET(ic))
1693 OP_SYMBOL (op)->ruonly = 1;
1700 /* otherwise check that the definition does
1701 not contain any symbols in far space */
1702 if (isOperandInFarSpace (IC_LEFT (dic)) ||
1703 isOperandInFarSpace (IC_RIGHT (dic)) ||
1704 IS_OP_RUONLY (IC_LEFT (ic)) ||
1705 IS_OP_RUONLY (IC_RIGHT (ic)))
1712 /* if pointer set then make sure the pointer
1714 if (POINTER_SET (dic) &&
1715 !IS_DATA_PTR (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)))
1718 if (POINTER_GET (dic) &&
1719 !IS_DATA_PTR (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)))
1725 /* also make sure the intervenening instructions
1726 don't have any thing in far space */
1727 for (dic = dic->next; dic && dic != ic && sic != ic; dic = dic->next)
1730 /* if there is an intervening function call then no */
1731 if (dic->op == CALL || dic->op == PCALL)
1735 /* if pointer set then make sure the pointer
1737 if (POINTER_SET (dic) &&
1738 !IS_DATA_PTR (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)))
1741 if (POINTER_GET (dic) &&
1742 !IS_DATA_PTR (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)))
1746 /* if address of & the result is remat the okay */
1747 if (dic->op == ADDRESS_OF &&
1748 OP_SYMBOL (IC_RESULT (dic))->remat)
1752 /* if operand has size of three or more & this
1753 operation is a '*','/' or '%' then 'b' may
1755 if ((dic->op == '%' || dic->op == '/' || dic->op == '*') &&
1756 getSize (operandType (op)) >= 3)
1761 /* if left or right or result is in far space */
1762 if (isOperandInFarSpace (IC_LEFT (dic)) ||
1763 isOperandInFarSpace (IC_RIGHT (dic)) ||
1764 isOperandInFarSpace (IC_RESULT (dic)) ||
1765 IS_OP_RUONLY (IC_LEFT (dic)) ||
1766 IS_OP_RUONLY (IC_RIGHT (dic)) ||
1767 IS_OP_RUONLY (IC_RESULT (dic)))
1771 /* if left or right or result is on stack */
1772 if (isOperandOnStack(IC_LEFT(dic)) ||
1773 isOperandOnStack(IC_RIGHT(dic)) ||
1774 isOperandOnStack(IC_RESULT(dic))) {
1780 OP_SYMBOL (op)->ruonly = 1;
1781 fprintf (stderr, "%s is used only once in line %d.\n",
1782 OP_SYMBOL(op)->name, ic->lineno);
1787 /*-----------------------------------------------------------------*/
1788 /* isBitwiseOptimizable - requirements of JEAN LOUIS VERN */
1789 /*-----------------------------------------------------------------*/
1791 isBitwiseOptimizable (iCode * ic)
1793 sym_link *ltype = getSpec (operandType (IC_LEFT (ic)));
1794 sym_link *rtype = getSpec (operandType (IC_RIGHT (ic)));
1796 /* bitwise operations are considered optimizable
1797 under the following conditions (Jean-Louis VERN)
1809 if (IS_LITERAL(rtype) ||
1810 (IS_BITVAR (ltype) && IN_BITSPACE (SPEC_OCLS (ltype))))
1816 /*-----------------------------------------------------------------*/
1817 /* packForPush - hueristics to reduce iCode for pushing */
1818 /*-----------------------------------------------------------------*/
1820 packForPush (iCode * ic, eBBlock * ebp)
1825 if (ic->op != IPUSH || !IS_ITEMP (IC_LEFT (ic)))
1828 /* must have only definition & one usage */
1829 if (bitVectnBitsOn (OP_DEFS (IC_LEFT (ic))) != 1 ||
1830 bitVectnBitsOn (OP_USES (IC_LEFT (ic))) != 1)
1833 /* find the definition */
1834 if (!(dic = hTabItemWithKey (iCodehTab,
1835 bitVectFirstBit (OP_DEFS (IC_LEFT (ic))))))
1838 if (dic->op != '=' || POINTER_SET (dic))
1841 /* make sure the right side does not have any definitions
1843 dbv = OP_DEFS(IC_RIGHT(dic));
1844 for (lic = ic; lic && lic != dic ; lic = lic->prev) {
1845 if (bitVectBitValue(dbv,lic->key))
1848 /* make sure they have the same type */
1850 sym_link *itype=operandType(IC_LEFT(ic));
1851 sym_link *ditype=operandType(IC_RIGHT(dic));
1853 if (SPEC_USIGN(itype)!=SPEC_USIGN(ditype) ||
1854 SPEC_LONG(itype)!=SPEC_LONG(ditype))
1857 /* extend the live range of replaced operand if needed */
1858 if (OP_SYMBOL(IC_RIGHT(dic))->liveTo < ic->seq) {
1859 OP_SYMBOL(IC_RIGHT(dic))->liveTo = ic->seq;
1861 /* we now know that it has one & only one def & use
1862 and the that the definition is an assignment */
1863 IC_LEFT (ic) = IC_RIGHT (dic);
1865 remiCodeFromeBBlock (ebp, dic);
1866 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
1867 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
1870 /*-----------------------------------------------------------------*/
1871 /* packRegisters - does some transformations to reduce register */
1873 /*-----------------------------------------------------------------*/
1874 static void packRegisters (eBBlock * ebp) {
1881 for (ic = ebp->sch; ic; ic = ic->next) {
1883 change += packRegsForAssign (ic, ebp);
1890 for (ic = ebp->sch; ic; ic = ic->next)
1892 /* if the condition of an if instruction
1893 is defined in the previous instruction and
1894 this is the only usage then
1895 mark the itemp as a conditional */
1896 if ((IS_CONDITIONAL (ic) ||
1897 (IS_BITWISE_OP(ic) && isBitwiseOptimizable (ic)))) {
1898 if (ic->next && ic->next->op == IFX &&
1899 bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
1900 isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
1901 OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq) {
1902 OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND;
1908 /* if this is an itemp & result of an address of a true sym
1909 then mark this as rematerialisable */
1910 if (ic->op == ADDRESS_OF &&
1911 IS_ITEMP (IC_RESULT (ic)) &&
1912 IS_TRUE_SYMOP (IC_LEFT (ic)) &&
1913 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
1914 !OP_SYMBOL (IC_LEFT (ic))->onStack)
1916 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
1917 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
1918 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
1921 /* if straight assignment then carry remat flag if
1922 this is the only definition */
1923 if (ic->op == '=' &&
1924 !POINTER_SET (ic) &&
1925 IS_SYMOP (IC_RIGHT (ic)) &&
1926 OP_SYMBOL (IC_RIGHT (ic))->remat &&
1927 !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode) &&
1928 bitVectnBitsOn (OP_SYMBOL (IC_RESULT (ic))->defs) <= 1)
1931 OP_SYMBOL (IC_RESULT (ic))->remat =
1932 OP_SYMBOL (IC_RIGHT (ic))->remat;
1933 OP_SYMBOL (IC_RESULT (ic))->rematiCode =
1934 OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
1937 /* if cast to a generic pointer & the pointer being
1938 cast is remat, then we can remat this cast as well */
1939 if (ic->op == CAST &&
1940 IS_SYMOP(IC_RIGHT(ic)) &&
1941 OP_SYMBOL(IC_RIGHT(ic))->remat ) {
1942 sym_link *to_type = operandType(IC_LEFT(ic));
1943 sym_link *from_type = operandType(IC_RIGHT(ic));
1944 if (IS_GENPTR(to_type) && IS_PTR(from_type)) {
1945 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
1946 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
1947 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
1951 /* if this is a +/- operation with a rematerizable
1952 then mark this as rematerializable as well */
1953 if ((ic->op == '+' || ic->op == '-') &&
1954 (IS_SYMOP (IC_LEFT (ic)) &&
1955 IS_ITEMP (IC_RESULT (ic)) &&
1956 IS_OP_LITERAL (IC_RIGHT (ic))) &&
1957 OP_SYMBOL (IC_LEFT (ic))->remat &&
1958 (!IS_SYMOP (IC_RIGHT (ic)) || !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode)) &&
1959 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1)
1961 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
1962 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
1963 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
1967 /* mark the pointer usages */
1968 if (POINTER_SET (ic))
1969 OP_SYMBOL (IC_RESULT (ic))->uptr = 1;
1971 if (POINTER_GET (ic))
1972 OP_SYMBOL (IC_LEFT (ic))->uptr = 1;
1974 /* reduce for support function calls */
1975 if (ic->supportRtn || ic->op == '+' || ic->op == '-')
1976 packRegsForSupport (ic, ebp);
1978 /* some cases the redundant moves can
1979 can be eliminated for return statements */
1980 if (ic->op == RETURN || ic->op == SEND) {
1981 packRegsForOneuse (ic, IC_LEFT (ic), ebp);
1984 /* if pointer set & left has a size more than
1985 one and right is not in far space */
1986 if (POINTER_SET (ic) &&
1987 !isOperandInFarSpace (IC_RIGHT (ic)) &&
1988 !OP_SYMBOL (IC_RESULT (ic))->remat &&
1989 !IS_OP_RUONLY (IC_RIGHT (ic)) &&
1990 getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1)
1992 packRegsForOneuse (ic, IC_RESULT (ic), ebp);
1994 /* if pointer get */
1995 if (POINTER_GET (ic) &&
1996 !isOperandInFarSpace (IC_RESULT (ic)) &&
1997 !OP_SYMBOL (IC_LEFT (ic))->remat &&
1998 !IS_OP_RUONLY (IC_RESULT (ic)) &&
1999 getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1)
2001 packRegsForOneuse (ic, IC_LEFT (ic), ebp);
2004 /* if this is cast for intergral promotion then
2005 check if only use of the definition of the
2006 operand being casted/ if yes then replace
2007 the result of that arithmetic operation with
2008 this result and get rid of the cast */
2011 sym_link *fromType = operandType (IC_RIGHT (ic));
2012 sym_link *toType = operandType (IC_LEFT (ic));
2014 if (IS_INTEGRAL (fromType) && IS_INTEGRAL (toType) &&
2015 getSize (fromType) != getSize (toType) &&
2016 SPEC_USIGN (fromType) == SPEC_USIGN (toType))
2019 iCode *dic = packRegsForOneuse (ic, IC_RIGHT (ic), ebp);
2022 if (IS_ARITHMETIC_OP (dic))
2024 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2025 IC_RESULT (dic) = IC_RESULT (ic);
2026 remiCodeFromeBBlock (ebp, ic);
2027 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2028 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
2029 OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
2033 OP_SYMBOL (IC_RIGHT (ic))->ruonly = 0;
2039 /* if the type from and type to are the same
2040 then if this is the only use then packit */
2041 if (compareType (operandType (IC_RIGHT (ic)),
2042 operandType (IC_LEFT (ic))) == 1)
2044 iCode *dic = packRegsForOneuse (ic, IC_RIGHT (ic), ebp);
2047 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2048 IC_RESULT (dic) = IC_RESULT (ic);
2049 remiCodeFromeBBlock (ebp, ic);
2050 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2051 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
2052 OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
2060 iTempNN := (some variable in farspace) V1
2065 if (ic->op == IPUSH)
2067 packForPush (ic, ebp);
2072 /*-----------------------------------------------------------------*/
2073 /* assignRegisters - assigns registers to each live range as need */
2074 /*-----------------------------------------------------------------*/
2076 xa51_assignRegisters (eBBlock ** ebbs, int count)
2081 setToNull ((void *) &_G.funcrUsed);
2082 setToNull ((void *) &_G.totRegAssigned);
2085 /* change assignments this will remove some
2086 live ranges reducing some register pressure */
2087 for (i = 0; i < count; i++)
2088 packRegisters (ebbs[i]);
2090 if (options.dump_pack)
2091 dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
2093 /* first determine for each live range the number of
2094 registers & the type of registers required for each */
2097 /* and serially allocate registers */
2098 serialRegAssign (ebbs, count);
2102 /* if stack was extended then tell the user */
2105 werror(I_EXTENDED_STACK_SPILS,
2106 _G.stackExtend,currFunc->name,"");
2110 /* after that create the register mask
2111 for each of the instruction */
2112 createRegMask (ebbs, count);
2114 /* redo that offsets for stacked automatic variables */
2115 redoStackOffsets ();
2117 if (options.dump_rassgn)
2119 dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count);
2120 dumpLiveRanges (DUMP_LRANGE, liveRanges);
2123 /* do the overlaysegment stuff SDCCmem.c */
2124 doOverlays (ebbs, count);
2126 /* now get back the chain */
2127 ic = iCodeLabelOptimize (iCodeFromeBBlock (ebbs, count));
2131 /* free up any _G.stackSpil locations allocated */
2132 applyToSet (_G.stackSpil, deallocStackSpil);
2134 setToNull ((void **) &_G.stackSpil);
2135 setToNull ((void **) &_G.spiltSet);
2136 /* mark all registers as free */