1 /*------------------------------------------------------------------------
3 SDCCralloc.c - source file for register allocation. (DS80C390) specific
5 Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998)
7 This program is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 In other words, you are welcome to use, share and improve this program.
22 You are forbidden to forbid anyone else to use, share and improve
23 what you give them. Help stamp out software-hoarding!
24 -------------------------------------------------------------------------*/
30 /*-----------------------------------------------------------------*/
31 /* At this point we start getting processor specific although */
32 /* some routines are non-processor specific & can be reused when */
33 /* targetting other processors. The decision for this will have */
34 /* to be made on a routine by routine basis */
35 /* routines used to pack registers are most definitely not reusable */
36 /* since the pack the registers depending strictly on the MCU */
37 /*-----------------------------------------------------------------*/
47 bitVect *totRegAssigned; /* final set of LRs that got into registers */
50 bitVect *funcrUsed; /* registers used in a function */
56 /* Shared with gen.c */
57 int ds390_ptrRegReq; /* one byte pointer register required */
63 {REG_GPR, R2_IDX, REG_GPR, "r2", "ar2", "0", 2, 1, 1},
64 {REG_GPR, R3_IDX, REG_GPR, "r3", "ar3", "0", 3, 1, 1},
65 {REG_GPR, R4_IDX, REG_GPR, "r4", "ar4", "0", 4, 1, 1},
66 {REG_GPR, R5_IDX, REG_GPR, "r5", "ar5", "0", 5, 1, 1},
67 {REG_GPR, R6_IDX, REG_GPR, "r6", "ar6", "0", 6, 1, 1},
68 {REG_GPR, R7_IDX, REG_GPR, "r7", "ar7", "0", 7, 1, 1},
69 {REG_PTR, R0_IDX, REG_PTR, "r0", "ar0", "0", 0, 1, 1},
70 {REG_PTR, R1_IDX, REG_PTR, "r1", "ar1", "0", 1, 1, 1},
71 {REG_GPR, DPL_IDX, REG_GPR, "dpl", "dpl", "dpl", 0, 0, 0},
72 {REG_GPR, DPH_IDX, REG_GPR, "dph", "dph", "dph", 0, 0, 0},
73 {REG_GPR, DPX_IDX, REG_GPR, "dpx", "dpx", "dpx", 0, 0, 0},
74 {REG_GPR, B_IDX, REG_GPR, "b", "b", "b", 0, 0, 0},
75 {REG_GPR, X8_IDX, REG_GPR, "x8", "x8", "xreg", 0, 0, 0},
76 {REG_GPR, X9_IDX, REG_GPR, "x9", "x9", "xreg", 1, 0, 0},
77 {REG_GPR, X10_IDX, REG_GPR, "x10", "x10", "xreg", 2, 0, 0},
78 {REG_GPR, X11_IDX, REG_GPR, "x11", "x11", "xreg", 3, 0, 0},
79 {REG_GPR, X12_IDX, REG_GPR, "x12", "x12", "xreg", 4, 0, 0},
80 {REG_CND, CND_IDX, REG_GPR, "C", "psw", "xreg", 0, 0, 0},
81 {0, DPL1_IDX, 0, "dpl1", "dpl1", "dpl1", 0, 0, 0},
82 {0, DPH1_IDX, 0, "dph1", "dph1", "dph1", 0, 0, 0},
83 {0, DPX1_IDX, 0, "dpx1", "dpx1", "dpx1", 0, 0, 0},
84 {0, DPS_IDX, 0, "dps", "dps", "dps", 0, 0, 0},
85 {0, A_IDX, 0, "a", "acc", "acc", 0, 0, 0},
86 {0, AP_IDX, 0, "ap", "ap", "ap", 0, 0, 0},
89 static void spillThis (symbol *);
90 static void freeAllRegs ();
91 static iCode * packRegsDPTRuse (operand *);
92 static int packRegsDPTRnuse (operand *,unsigned);
94 /*-----------------------------------------------------------------*/
95 /* allocReg - allocates register of given type */
96 /*-----------------------------------------------------------------*/
102 for (i = 0; i < ds390_nRegs; i++)
105 /* if type is given as 0 then any
106 free register will do */
110 regs390[i].isFree = 0;
113 bitVectSetBit (currFunc->regsUsed, i);
116 /* other wise look for specific type
118 if (regs390[i].isFree &&
119 regs390[i].type == type)
121 regs390[i].isFree = 0;
124 bitVectSetBit (currFunc->regsUsed, i);
131 /*-----------------------------------------------------------------*/
132 /* ds390_regWithIdx - returns pointer to register with index number*/
133 /*-----------------------------------------------------------------*/
135 ds390_regWithIdx (int idx)
139 for (i = 0; i < sizeof(regs390)/sizeof(regs); i++)
140 if (regs390[i].rIdx == idx)
143 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
144 "regWithIdx not found");
148 /*-----------------------------------------------------------------*/
149 /* freeReg - frees a register */
150 /*-----------------------------------------------------------------*/
156 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
157 "freeReg - Freeing NULL register");
164 /*-----------------------------------------------------------------*/
165 /* useReg - marks a register as used */
166 /*-----------------------------------------------------------------*/
174 /*-----------------------------------------------------------------*/
175 /* nFreeRegs - returns number of free registers */
176 /*-----------------------------------------------------------------*/
183 for (i = 0; i < ds390_nRegs; i++)
184 if (regs390[i].isFree && regs390[i].type == type)
189 /*-----------------------------------------------------------------*/
190 /* nfreeRegsType - free registers with type */
191 /*-----------------------------------------------------------------*/
193 nfreeRegsType (int type)
198 if ((nfr = nFreeRegs (type)) == 0)
199 return nFreeRegs (REG_GPR);
202 return nFreeRegs (type);
207 /*-----------------------------------------------------------------*/
208 /* isOperandInReg - returns true if operand is currently in regs */
209 /*-----------------------------------------------------------------*/
210 static int isOperandInReg(operand *op)
212 if (!IS_SYMOP(op)) return 0;
213 if (OP_SYMBOL(op)->ruonly) return 1;
214 if (OP_SYMBOL(op)->accuse) return 1;
215 if (OP_SYMBOL(op)->dptr) return 1;
216 return bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(op)->key);
219 /*-----------------------------------------------------------------*/
220 /* computeSpillable - given a point find the spillable live ranges */
221 /*-----------------------------------------------------------------*/
223 computeSpillable (iCode * ic)
227 /* spillable live ranges are those that are live at this
228 point . the following categories need to be subtracted
230 a) - those that are already spilt
231 b) - if being used by this one
232 c) - defined by this one */
234 spillable = bitVectCopy (ic->rlive);
236 bitVectCplAnd (spillable, _G.spiltSet); /* those already spilt */
238 bitVectCplAnd (spillable, ic->uses); /* used in this one */
239 bitVectUnSetBit (spillable, ic->defKey);
240 spillable = bitVectIntersect (spillable, _G.regAssigned);
245 /*-----------------------------------------------------------------*/
246 /* noSpilLoc - return true if a variable has no spil location */
247 /*-----------------------------------------------------------------*/
249 noSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
251 return (sym->usl.spillLoc ? 0 : 1);
254 /*-----------------------------------------------------------------*/
255 /* hasSpilLoc - will return 1 if the symbol has spil location */
256 /*-----------------------------------------------------------------*/
258 hasSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
260 return (sym->usl.spillLoc ? 1 : 0);
263 /*-----------------------------------------------------------------*/
264 /* directSpilLoc - will return 1 if the splilocation is in direct */
265 /*-----------------------------------------------------------------*/
267 directSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
269 if (sym->usl.spillLoc &&
270 (IN_DIRSPACE (SPEC_OCLS (sym->usl.spillLoc->etype))))
276 /*-----------------------------------------------------------------*/
277 /* hasSpilLocnoUptr - will return 1 if the symbol has spil location */
278 /* but is not used as a pointer */
279 /*-----------------------------------------------------------------*/
281 hasSpilLocnoUptr (symbol * sym, eBBlock * ebp, iCode * ic)
283 return ((sym->usl.spillLoc && !sym->uptr) ? 1 : 0);
286 /*-----------------------------------------------------------------*/
287 /* rematable - will return 1 if the remat flag is set */
288 /*-----------------------------------------------------------------*/
290 rematable (symbol * sym, eBBlock * ebp, iCode * ic)
295 /*-----------------------------------------------------------------*/
296 /* notUsedInRemaining - not used or defined in remain of the block */
297 /*-----------------------------------------------------------------*/
299 notUsedInRemaining (symbol * sym, eBBlock * ebp, iCode * ic)
301 return ((usedInRemaining (operandFromSymbol (sym), ic) ? 0 : 1) &&
302 allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq));
305 /*-----------------------------------------------------------------*/
306 /* allLRs - return true for all */
307 /*-----------------------------------------------------------------*/
309 allLRs (symbol * sym, eBBlock * ebp, iCode * ic)
314 /*-----------------------------------------------------------------*/
315 /* liveRangesWith - applies function to a given set of live range */
316 /*-----------------------------------------------------------------*/
318 liveRangesWith (bitVect * lrs, int (func) (symbol *, eBBlock *, iCode *),
319 eBBlock * ebp, iCode * ic)
324 if (!lrs || !lrs->size)
327 for (i = 1; i < lrs->size; i++)
330 if (!bitVectBitValue (lrs, i))
333 /* if we don't find it in the live range
334 hash table we are in serious trouble */
335 if (!(sym = hTabItemWithKey (liveRanges, i)))
337 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
338 "liveRangesWith could not find liveRange");
342 if (func (sym, ebp, ic) && bitVectBitValue (_G.regAssigned, sym->key))
343 addSetHead (&rset, sym);
350 /*-----------------------------------------------------------------*/
351 /* leastUsedLR - given a set determines which is the least used */
352 /*-----------------------------------------------------------------*/
354 leastUsedLR (set * sset)
356 symbol *sym = NULL, *lsym = NULL;
358 sym = lsym = setFirstItem (sset);
363 for (; lsym; lsym = setNextItem (sset))
366 /* if usage is the same then prefer
367 the spill the smaller of the two */
368 if (lsym->used == sym->used)
369 if (getSize (lsym->type) < getSize (sym->type))
373 if (lsym->used < sym->used)
378 setToNull ((void *) &sset);
383 /*-----------------------------------------------------------------*/
384 /* noOverLap - will iterate through the list looking for over lap */
385 /*-----------------------------------------------------------------*/
387 noOverLap (set * itmpStack, symbol * fsym)
391 for (sym = setFirstItem (itmpStack); sym;
392 sym = setNextItem (itmpStack))
394 if (bitVectBitValue(sym->clashes,fsym->key)) return 0;
399 /*-----------------------------------------------------------------*/
400 /* isFree - will return 1 if the a free spil location is found */
401 /*-----------------------------------------------------------------*/
406 V_ARG (symbol **, sloc);
407 V_ARG (symbol *, fsym);
409 /* if already found */
413 /* if it is free && and the itmp assigned to
414 this does not have any overlapping live ranges
415 with the one currently being assigned and
416 the size can be accomodated */
418 noOverLap (sym->usl.itmpStack, fsym) &&
419 getSize (sym->type) >= getSize (fsym->type))
428 /*-----------------------------------------------------------------*/
429 /* spillLRWithPtrReg :- will spil those live ranges which use PTR */
430 /*-----------------------------------------------------------------*/
432 spillLRWithPtrReg (symbol * forSym)
438 if (!_G.regAssigned ||
439 bitVectIsZero (_G.regAssigned))
442 r0 = ds390_regWithIdx (R0_IDX);
443 r1 = ds390_regWithIdx (R1_IDX);
445 /* for all live ranges */
446 for (lrsym = hTabFirstItem (liveRanges, &k); lrsym;
447 lrsym = hTabNextItem (liveRanges, &k))
451 /* if no registers assigned to it or spilt */
452 /* if it does not overlap this then
453 no need to spill it */
455 if (lrsym->isspilt || !lrsym->nRegs ||
456 (lrsym->liveTo < forSym->liveFrom))
459 /* go thru the registers : if it is either
460 r0 or r1 then spill it */
461 for (j = 0; j < lrsym->nRegs; j++)
462 if (lrsym->regs[j] == r0 ||
463 lrsym->regs[j] == r1)
472 /*-----------------------------------------------------------------*/
473 /* createStackSpil - create a location on the stack to spil */
474 /*-----------------------------------------------------------------*/
476 createStackSpil (symbol * sym)
479 int useXstack, model, noOverlay;
483 /* first go try and find a free one that is already
484 existing on the stack */
485 if (applyToSet (_G.stackSpil, isFree, &sloc, sym))
487 /* found a free one : just update & return */
488 sym->usl.spillLoc = sloc;
491 addSetHead (&sloc->usl.itmpStack, sym);
495 /* could not then have to create one , this is the hard part
496 we need to allocate this on the stack : this is really a
497 hack!! but cannot think of anything better at this time */
499 if (SNPRINTF (slocBuffer, sizeof(slocBuffer),
500 "sloc%d", _G.slocNum++) >= sizeof (slocBuffer))
502 fprintf (stderr, "***Internal error: slocBuffer overflowed: %s:%d\n",
507 sloc = newiTemp (slocBuffer);
509 /* set the type to the spilling symbol */
510 sloc->type = copyLinkChain (sym->type);
511 sloc->etype = getSpec (sloc->type);
512 if (options.model == MODEL_SMALL) {
513 SPEC_SCLS (sloc->etype) = S_DATA;
515 SPEC_SCLS (sloc->etype) = S_XDATA;
517 SPEC_EXTR (sloc->etype) = 0;
518 SPEC_STAT (sloc->etype) = 0;
519 SPEC_VOLATILE(sloc->etype) = 0;
520 SPEC_ABSA(sloc->etype) = 0;
522 /* we don't allow it to be allocated`
523 onto the external stack since : so we
524 temporarily turn it off ; we also
525 turn off memory model to prevent
526 the spil from going to the external storage
527 and turn off overlaying
530 useXstack = options.useXstack;
531 model = options.model;
532 noOverlay = options.noOverlay;
533 options.noOverlay = 1;
535 /* options.model = options.useXstack = 0; */
539 options.useXstack = useXstack;
540 options.model = model;
541 options.noOverlay = noOverlay;
542 sloc->isref = 1; /* to prevent compiler warning */
544 /* if it is on the stack then update the stack */
545 if (IN_STACK (sloc->etype))
547 currFunc->stack += getSize (sloc->type);
548 _G.stackExtend += getSize (sloc->type);
551 _G.dataExtend += getSize (sloc->type);
553 /* add it to the _G.stackSpil set */
554 addSetHead (&_G.stackSpil, sloc);
555 sym->usl.spillLoc = sloc;
558 /* add it to the set of itempStack set
559 of the spill location */
560 addSetHead (&sloc->usl.itmpStack, sym);
564 /*-----------------------------------------------------------------*/
565 /* isSpiltOnStack - returns true if the spil location is on stack */
566 /*-----------------------------------------------------------------*/
568 isSpiltOnStack (symbol * sym)
578 /* if (sym->_G.stackSpil) */
581 if (!sym->usl.spillLoc)
584 etype = getSpec (sym->usl.spillLoc->type);
585 if (IN_STACK (etype))
591 /*-----------------------------------------------------------------*/
592 /* spillThis - spils a specific operand */
593 /*-----------------------------------------------------------------*/
595 spillThis (symbol * sym)
598 /* if this is rematerializable or has a spillLocation
599 we are okay, else we need to create a spillLocation
601 if (!(sym->remat || sym->usl.spillLoc))
602 createStackSpil (sym);
604 /* mark it has spilt & put it in the spilt set */
605 sym->isspilt = sym->spillA = 1;
606 _G.spiltSet = bitVectSetBit (_G.spiltSet, sym->key);
608 bitVectUnSetBit (_G.regAssigned, sym->key);
609 bitVectUnSetBit (_G.totRegAssigned, sym->key);
611 for (i = 0; i < sym->nRegs; i++)
615 freeReg (sym->regs[i]);
619 /* if spilt on stack then free up r0 & r1
620 if they could have been assigned to some
622 if (!ds390_ptrRegReq && isSpiltOnStack (sym) && !options.stack10bit)
625 spillLRWithPtrReg (sym);
628 if (sym->usl.spillLoc && !sym->remat)
629 sym->usl.spillLoc->allocreq++;
633 /*-----------------------------------------------------------------*/
634 /* selectSpil - select a iTemp to spil : rather a simple procedure */
635 /*-----------------------------------------------------------------*/
637 selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym)
639 bitVect *lrcs = NULL;
643 /* get the spillable live ranges */
644 lrcs = computeSpillable (ic);
646 /* get all live ranges that are rematerizable */
647 if ((selectS = liveRangesWith (lrcs, rematable, ebp, ic)))
650 /* return the least used of these */
651 return leastUsedLR (selectS);
654 /* get live ranges with spillLocations in direct space */
655 if ((selectS = liveRangesWith (lrcs, directSpilLoc, ebp, ic)))
657 sym = leastUsedLR (selectS);
658 strncpyz (sym->rname,
659 sym->usl.spillLoc->rname[0] ?
660 sym->usl.spillLoc->rname : sym->usl.spillLoc->name,
663 /* mark it as allocation required */
664 sym->usl.spillLoc->allocreq++;
668 /* if the symbol is local to the block then */
669 if (forSym->liveTo < ebp->lSeq)
672 /* check if there are any live ranges allocated
673 to registers that are not used in this block */
674 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInBlock, ebp, ic)))
676 sym = leastUsedLR (selectS);
677 /* if this is not rematerializable */
686 /* check if there are any live ranges that not
687 used in the remainder of the block */
688 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic)))
690 sym = leastUsedLR (selectS);
703 /* find live ranges with spillocation && not used as pointers */
704 if ((selectS = liveRangesWith (lrcs, hasSpilLocnoUptr, ebp, ic)))
707 sym = leastUsedLR (selectS);
708 /* mark this as allocation required */
709 sym->usl.spillLoc->allocreq++;
713 /* find live ranges with spillocation */
714 if ((selectS = liveRangesWith (lrcs, hasSpilLoc, ebp, ic)))
717 sym = leastUsedLR (selectS);
718 sym->usl.spillLoc->allocreq++;
722 /* couldn't find then we need to create a spil
723 location on the stack , for which one? the least
725 if ((selectS = liveRangesWith (lrcs, noSpilLoc, ebp, ic)))
728 /* return a created spil location */
729 sym = createStackSpil (leastUsedLR (selectS));
730 sym->usl.spillLoc->allocreq++;
734 /* this is an extreme situation we will spill
735 this one : happens very rarely but it does happen */
741 /*-----------------------------------------------------------------*/
742 /* spilSomething - spil some variable & mark registers as free */
743 /*-----------------------------------------------------------------*/
745 spilSomething (iCode * ic, eBBlock * ebp, symbol * forSym)
750 /* get something we can spil */
751 ssym = selectSpil (ic, ebp, forSym);
753 /* mark it as spilt */
754 ssym->isspilt = ssym->spillA = 1;
755 _G.spiltSet = bitVectSetBit (_G.spiltSet, ssym->key);
757 /* mark it as not register assigned &
758 take it away from the set */
759 bitVectUnSetBit (_G.regAssigned, ssym->key);
760 bitVectUnSetBit (_G.totRegAssigned, ssym->key);
762 /* mark the registers as free */
763 for (i = 0; i < ssym->nRegs; i++)
765 freeReg (ssym->regs[i]);
767 /* if spilt on stack then free up r0 & r1
768 if they could have been assigned to as gprs */
769 if (!ds390_ptrRegReq && isSpiltOnStack (ssym) && !options.stack10bit)
772 spillLRWithPtrReg (ssym);
775 /* if this was a block level spil then insert push & pop
776 at the start & end of block respectively */
779 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
780 /* add push to the start of the block */
781 addiCodeToeBBlock (ebp, nic, (ebp->sch->op == LABEL ?
782 ebp->sch->next : ebp->sch));
783 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
784 /* add pop to the end of the block */
785 addiCodeToeBBlock (ebp, nic, NULL);
788 /* if spilt because not used in the remainder of the
789 block then add a push before this instruction and
790 a pop at the end of the block */
791 if (ssym->remainSpil)
794 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
795 /* add push just before this instruction */
796 addiCodeToeBBlock (ebp, nic, ic);
798 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
799 /* add pop to the end of the block */
800 addiCodeToeBBlock (ebp, nic, NULL);
809 /*-----------------------------------------------------------------*/
810 /* getRegPtr - will try for PTR if not a GPR type if not spil */
811 /*-----------------------------------------------------------------*/
813 getRegPtr (iCode * ic, eBBlock * ebp, symbol * sym)
819 /* try for a ptr type */
820 if ((reg = allocReg (REG_PTR)))
823 /* try for gpr type */
824 if ((reg = allocReg (REG_GPR)))
827 /* we have to spil */
828 if (!spilSomething (ic, ebp, sym))
831 /* make sure partially assigned registers aren't reused */
832 for (j=0; j<=sym->nRegs; j++)
834 sym->regs[j]->isFree = 0;
836 /* this looks like an infinite loop but
837 in really selectSpil will abort */
841 /*-----------------------------------------------------------------*/
842 /* getRegGpr - will try for GPR if not spil */
843 /*-----------------------------------------------------------------*/
845 getRegGpr (iCode * ic, eBBlock * ebp, symbol * sym)
851 /* try for gpr type */
852 if ((reg = allocReg (REG_GPR)))
855 if (!ds390_ptrRegReq)
856 if ((reg = allocReg (REG_PTR)))
859 /* we have to spil */
860 if (!spilSomething (ic, ebp, sym))
863 /* make sure partially assigned registers aren't reused */
864 for (j=0; j<=sym->nRegs; j++)
866 sym->regs[j]->isFree = 0;
868 /* this looks like an infinite loop but
869 in really selectSpil will abort */
873 /*-----------------------------------------------------------------*/
874 /* getRegPtrNoSpil - get it cannot split */
875 /*-----------------------------------------------------------------*/
876 static regs *getRegPtrNoSpil()
880 /* try for a ptr type */
881 if ((reg = allocReg (REG_PTR)))
884 /* try for gpr type */
885 if ((reg = allocReg (REG_GPR)))
890 /* just to make the compiler happy */
894 /*-----------------------------------------------------------------*/
895 /* getRegGprNoSpil - get it cannot split */
896 /*-----------------------------------------------------------------*/
897 static regs *getRegGprNoSpil()
901 if ((reg = allocReg (REG_GPR)))
904 if (!ds390_ptrRegReq)
905 if ((reg = allocReg (REG_PTR)))
910 /* just to make the compiler happy */
914 /*-----------------------------------------------------------------*/
915 /* symHasReg - symbol has a given register */
916 /*-----------------------------------------------------------------*/
918 symHasReg (symbol * sym, regs * reg)
922 for (i = 0; i < sym->nRegs; i++)
923 if (sym->regs[i] == reg)
929 /*-----------------------------------------------------------------*/
930 /* deassignLRs - check the live to and if they have registers & are */
931 /* not spilt then free up the registers */
932 /*-----------------------------------------------------------------*/
934 deassignLRs (iCode * ic, eBBlock * ebp)
940 for (sym = hTabFirstItem (liveRanges, &k); sym;
941 sym = hTabNextItem (liveRanges, &k))
945 /* if it does not end here */
946 if (sym->liveTo > ic->seq)
949 /* if it was spilt on stack then we can
950 mark the stack spil location as free */
955 sym->usl.spillLoc->isFree = 1;
961 if (!bitVectBitValue (_G.regAssigned, sym->key))
964 /* special case check if this is an IFX &
965 the privious one was a pop and the
966 previous one was not spilt then keep track
968 if (ic->op == IFX && ic->prev &&
969 ic->prev->op == IPOP &&
970 !ic->prev->parmPush &&
971 !OP_SYMBOL (IC_LEFT (ic->prev))->isspilt)
972 psym = OP_SYMBOL (IC_LEFT (ic->prev));
978 bitVectUnSetBit (_G.regAssigned, sym->key);
980 /* if the result of this one needs registers
981 and does not have it then assign it right
983 if (IC_RESULT (ic) &&
984 !(SKIP_IC2 (ic) || /* not a special icode */
985 ic->op == JUMPTABLE ||
991 (result = OP_SYMBOL (IC_RESULT (ic))) && /* has a result */
992 result->liveTo > ic->seq && /* and will live beyond this */
993 result->liveTo <= ebp->lSeq && /* does not go beyond this block */
994 result->regType == sym->regType && /* same register types */
995 result->nRegs && /* which needs registers */
996 !result->isspilt && /* and does not already have them */
998 !bitVectBitValue (_G.regAssigned, result->key) &&
999 /* the number of free regs + number of regs in this LR
1000 can accomodate the what result Needs */
1001 ((nfreeRegsType (result->regType) +
1002 sym->nRegs) >= result->nRegs)
1006 for (i = 0; i < result->nRegs; i++)
1008 result->regs[i] = sym->regs[i];
1010 result->regs[i] = getRegGpr (ic, ebp, result);
1012 _G.regAssigned = bitVectSetBit (_G.regAssigned, result->key);
1013 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, result->key);
1017 /* free the remaining */
1018 for (; i < sym->nRegs; i++)
1022 if (!symHasReg (psym, sym->regs[i]))
1023 freeReg (sym->regs[i]);
1026 freeReg (sym->regs[i]);
1033 /*-----------------------------------------------------------------*/
1034 /* reassignLR - reassign this to registers */
1035 /*-----------------------------------------------------------------*/
1037 reassignLR (operand * op)
1039 symbol *sym = OP_SYMBOL (op);
1042 /* not spilt any more */
1043 sym->isspilt = sym->spillA = sym->blockSpil = sym->remainSpil = 0;
1044 bitVectUnSetBit (_G.spiltSet, sym->key);
1046 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1047 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1051 for (i = 0; i < sym->nRegs; i++)
1052 sym->regs[i]->isFree = 0;
1055 /*-----------------------------------------------------------------*/
1056 /* willCauseSpill - determines if allocating will cause a spill */
1057 /*-----------------------------------------------------------------*/
1059 willCauseSpill (int nr, int rt)
1061 /* first check if there are any avlb registers
1062 of te type required */
1065 /* special case for pointer type
1066 if pointer type not avlb then
1067 check for type gpr */
1068 if (nFreeRegs (rt) >= nr)
1070 if (nFreeRegs (REG_GPR) >= nr)
1075 if (ds390_ptrRegReq)
1077 if (nFreeRegs (rt) >= nr)
1082 if (nFreeRegs (REG_PTR) +
1083 nFreeRegs (REG_GPR) >= nr)
1088 /* it will cause a spil */
1092 /*-----------------------------------------------------------------*/
1093 /* positionRegs - the allocator can allocate same registers to res- */
1094 /* ult and operand, if this happens make sure they are in the same */
1095 /* position as the operand otherwise chaos results */
1096 /*-----------------------------------------------------------------*/
1098 positionRegs (symbol * result, symbol * opsym)
1100 int count = min (result->nRegs, opsym->nRegs);
1101 int i, j = 0, shared = 0;
1104 /* if the result has been spilt then cannot share */
1109 /* first make sure that they actually share */
1110 for (i = 0; i < count; i++)
1112 for (j = 0; j < count; j++)
1114 if (result->regs[i] == opsym->regs[j] && i != j)
1124 regs *tmp = result->regs[i];
1125 result->regs[i] = result->regs[j];
1126 result->regs[j] = tmp;
1133 /*-----------------------------------------------------------------*/
1134 /* unusedLRS - returns a bitVector of liveranges not used in 'ebp' */
1135 /*-----------------------------------------------------------------*/
1136 bitVect *unusedLRs (eBBlock *ebp)
1138 bitVect *ret = NULL;
1142 if (!ebp) return NULL;
1143 for (sym = hTabFirstItem(liveRanges,&key); sym ;
1144 sym = hTabNextItem(liveRanges,&key)) {
1146 if (notUsedInBlock(sym,ebp,NULL)) {
1147 ret = bitVectSetBit(ret,sym->key);
1154 /*-----------------------------------------------------------------*/
1155 /* deassignUnsedLRs - if this baisc block ends in a return then */
1156 /* deassign symbols not used in this block */
1157 /*-----------------------------------------------------------------*/
1158 bitVect *deassignUnsedLRs(eBBlock *ebp)
1160 bitVect *unused = NULL;
1163 switch (returnAtEnd(ebp)) {
1164 case 2: /* successor block ends in a return */
1165 unused = unusedLRs((eBBlock *) setFirstItem(ebp->succList));
1167 case 1: /* this block ends in a return */
1168 unused = bitVectIntersect(unused,unusedLRs(ebp));
1173 for (i = 0 ; i < unused->size ; i++ ) {
1176 if (bitVectBitValue(unused,i)) {
1178 /* if assigned to registers */
1179 if (bitVectBitValue(_G.regAssigned,i)) {
1183 sym = hTabItemWithKey(liveRanges,i);
1184 /* remove it from regassigned & mark the
1186 bitVectUnSetBit(_G.regAssigned,i);
1187 for (j = 0 ; j < sym->nRegs; j++)
1188 freeReg(sym->regs[j]);
1190 /* not assigned to registers : remove from set*/
1191 bitVectUnSetBit(unused,i);
1199 /*-----------------------------------------------------------------*/
1200 /* reassignUnusedLRs - put registers to unused Live ranges */
1201 /*-----------------------------------------------------------------*/
1202 void reassignUnusedLRs (bitVect *unused)
1205 if (!unused) return ;
1207 for (i = 0 ; i < unused->size ; i++ ) {
1208 /* if unused : means it was assigned to registers before */
1209 if (bitVectBitValue(unused,i)) {
1213 /* put it back into reg set*/
1214 bitVectSetBit(_G.regAssigned,i) ;
1216 sym = hTabItemWithKey(liveRanges,i);
1217 /* makr registers busy */
1218 for (j = 0 ; j < sym->nRegs; j++)
1219 sym->regs[j]->isFree = 0;
1224 /*------------------------------------------------------------------*/
1225 /* verifyRegsAssigned - make sure an iTemp is properly initialized; */
1226 /* it should either have registers or have beed spilled. Otherwise, */
1227 /* there was an uninitialized variable, so just spill this to get */
1228 /* the operand in a valid state. */
1229 /*------------------------------------------------------------------*/
1231 verifyRegsAssigned (operand *op, iCode * ic)
1236 if (!IS_ITEMP (op)) return;
1238 sym = OP_SYMBOL (op);
1239 if (sym->isspilt) return;
1240 if (!sym->nRegs) return;
1241 if (sym->regs[0]) return;
1243 werrorfl (ic->filename, ic->lineno, W_LOCAL_NOINIT,
1244 sym->prereqv ? sym->prereqv->name : sym->name);
1249 /*-----------------------------------------------------------------*/
1250 /* serialRegAssign - serially allocate registers to the variables */
1251 /*-----------------------------------------------------------------*/
1253 serialRegAssign (eBBlock ** ebbs, int count)
1257 /* for all blocks */
1258 for (i = 0; i < count; i++)
1262 bitVect *unusedLRs = NULL;
1264 if (ebbs[i]->noPath &&
1265 (ebbs[i]->entryLabel != entryLabel &&
1266 ebbs[i]->entryLabel != returnLabel))
1269 unusedLRs = deassignUnsedLRs(ebbs[i]);
1271 /* of all instructions do */
1272 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1275 /* if this is an ipop that means some live
1276 range will have to be assigned again */
1278 reassignLR (IC_LEFT (ic));
1280 /* if result is present && is a true symbol */
1281 if (IC_RESULT (ic) && ic->op != IFX &&
1282 IS_TRUE_SYMOP (IC_RESULT (ic)))
1283 OP_SYMBOL (IC_RESULT (ic))->allocreq++;
1285 /* take away registers from live
1286 ranges that end at this instruction */
1287 deassignLRs (ic, ebbs[i]);
1289 /* some don't need registers */
1290 if (SKIP_IC2 (ic) ||
1291 ic->op == JUMPTABLE ||
1295 (IC_RESULT (ic) && POINTER_SET (ic)))
1298 /* now we need to allocate registers
1299 only for the result */
1302 symbol *sym = OP_SYMBOL (IC_RESULT (ic));
1308 /* if it does not need or is spilt
1309 or is already assigned to registers
1310 or will not live beyond this instructions */
1313 bitVectBitValue (_G.regAssigned, sym->key) ||
1314 sym->liveTo <= ic->seq)
1317 /* if some liverange has been spilt at the block level
1318 and this one live beyond this block then spil this
1320 if (_G.blockSpil && sym->liveTo > ebbs[i]->lSeq)
1325 /* if trying to allocate this will cause
1326 a spill and there is nothing to spill
1327 or this one is rematerializable then
1329 willCS = willCauseSpill (sym->nRegs, sym->regType);
1330 spillable = computeSpillable (ic);
1332 (willCS && bitVectIsZero (spillable)))
1340 /* If the live range preceeds the point of definition
1341 then ideally we must take into account registers that
1342 have been allocated after sym->liveFrom but freed
1343 before ic->seq. This is complicated, so spill this
1344 symbol instead and let fillGaps handle the allocation. */
1345 if (sym->liveFrom < ic->seq)
1351 /* if it has a spillocation & is used less than
1352 all other live ranges then spill this */
1354 if (sym->usl.spillLoc) {
1355 symbol *leastUsed = leastUsedLR (liveRangesWith (spillable,
1356 allLRs, ebbs[i], ic));
1357 if (leastUsed && leastUsed->used > sym->used) {
1362 /* if none of the liveRanges have a spillLocation then better
1363 to spill this one than anything else already assigned to registers */
1364 if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) {
1365 /* if this is local to this block then we might find a block spil */
1366 if (!(sym->liveFrom >= ebbs[i]->fSeq && sym->liveTo <= ebbs[i]->lSeq)) {
1374 /* if we need ptr regs for the right side
1376 if (POINTER_GET (ic) && IS_SYMOP (IC_LEFT (ic))
1377 && getSize (OP_SYMBOL (IC_LEFT (ic))->type)
1378 <= (unsigned) PTRSIZE)
1383 /* else we assign registers to it */
1384 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1385 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1387 for (j = 0; j < sym->nRegs; j++)
1389 if (sym->regType == REG_PTR)
1390 sym->regs[j] = getRegPtr (ic, ebbs[i], sym);
1392 sym->regs[j] = getRegGpr (ic, ebbs[i], sym);
1394 /* if the allocation falied which means
1395 this was spilt then break */
1400 /* if it shares registers with operands make sure
1401 that they are in the same position */
1402 if (!POINTER_SET(ic) && !POINTER_GET(ic))
1404 if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic)) &&
1405 OP_SYMBOL (IC_LEFT (ic))->nRegs)
1407 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1408 OP_SYMBOL (IC_LEFT (ic)));
1410 /* do the same for the right operand */
1411 if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)) &&
1412 OP_SYMBOL (IC_RIGHT (ic))->nRegs)
1414 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1415 OP_SYMBOL (IC_RIGHT (ic)));
1427 reassignUnusedLRs(unusedLRs);
1430 /* Check for and fix any problems with uninitialized operands */
1431 for (i = 0; i < count; i++)
1435 if (ebbs[i]->noPath &&
1436 (ebbs[i]->entryLabel != entryLabel &&
1437 ebbs[i]->entryLabel != returnLabel))
1440 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1447 verifyRegsAssigned (IC_COND (ic), ic);
1451 if (ic->op == JUMPTABLE)
1453 verifyRegsAssigned (IC_JTCOND (ic), ic);
1457 verifyRegsAssigned (IC_RESULT (ic), ic);
1458 verifyRegsAssigned (IC_LEFT (ic), ic);
1459 verifyRegsAssigned (IC_RIGHT (ic), ic);
1464 /*-----------------------------------------------------------------*/
1465 /* fillGaps - Try to fill in the Gaps left by Pass1 */
1466 /*-----------------------------------------------------------------*/
1467 static void fillGaps()
1471 int loop = 0, change;
1474 if (getenv("DISABLE_FILL_GAPS")) return;
1476 /* First try to do DPTRuse once more since now we know what got into
1479 while (loop++ < 10) {
1482 for (sym = hTabFirstItem(liveRanges,&key) ; sym ;
1483 sym = hTabNextItem(liveRanges,&key)) {
1484 int size = getSize(sym->type);
1486 if (sym->liveFrom == sym->liveTo) continue;
1488 if (sym->uptr && sym->dptr==0 && !sym->ruonly &&
1489 size < 4 && size > 1) {
1491 if (packRegsDPTRuse(operandFromSymbol(sym))) {
1493 /* if this was assigned to registers then */
1494 if (bitVectBitValue(_G.totRegAssigned,sym->key)) {
1495 /* take it out of the register assigned set */
1496 bitVectUnSetBit(_G.totRegAssigned,sym->key);
1497 } else if (sym->usl.spillLoc) {
1498 sym->usl.spillLoc->allocreq--;
1499 sym->usl.spillLoc = NULL;
1503 sym->isspilt = sym->spillA = 0;
1507 /* try assigning other dptrs */
1508 if (sym->dptr == 0 && packRegsDPTRnuse(operandFromSymbol(sym),1) && !getenv("DPTRnDISABLE")) {
1509 /* if this was ssigned to registers then */
1510 if (bitVectBitValue(_G.totRegAssigned,sym->key)) {
1511 /* take it out of the register assigned set */
1512 bitVectUnSetBit(_G.totRegAssigned,sym->key);
1513 } else if (sym->usl.spillLoc) {
1514 sym->usl.spillLoc->allocreq--;
1515 sym->usl.spillLoc = NULL;
1518 sym->isspilt = sym->spillA = 0;
1523 /* look for livernages that was spilt by the allocator */
1524 for (sym = hTabFirstItem(liveRanges,&key) ; sym ;
1525 sym = hTabNextItem(liveRanges,&key)) {
1530 if (!sym->spillA || !sym->clashes || sym->remat) continue ;
1531 if (!sym->uses || !sym->defs) continue ;
1532 /* find the liveRanges this one clashes with, that are
1533 still assigned to registers & mark the registers as used*/
1534 for ( i = 0 ; i < sym->clashes->size ; i ++) {
1538 if (bitVectBitValue(sym->clashes,i) == 0 || /* those that clash with this */
1539 bitVectBitValue(_G.totRegAssigned,i) == 0) /* and are still assigned to registers */
1542 clr = hTabItemWithKey(liveRanges,i);
1545 /* mark these registers as used */
1546 for (k = 0 ; k < clr->nRegs ; k++ )
1547 useReg(clr->regs[k]);
1550 if (willCauseSpill(sym->nRegs,sym->regType)) {
1551 /* NOPE :( clear all registers & and continue */
1556 /* THERE IS HOPE !!!! */
1557 for (i=0; i < sym->nRegs ; i++ ) {
1558 if (sym->regType == REG_PTR)
1559 sym->regs[i] = getRegPtrNoSpil ();
1561 sym->regs[i] = getRegGprNoSpil ();
1564 /* For all its definitions check if the registers
1565 allocated needs positioning NOTE: we can position
1566 only ONCE if more than One positioning required
1568 We may need to perform the checks twice; once to
1569 position the registers as needed, the second to
1570 verify any register repositioning is still
1574 for (pass=0; pass<2; pass++) {
1575 for (i = 0 ; i < sym->defs->size ; i++ ) {
1576 if (bitVectBitValue(sym->defs,i)) {
1578 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1579 if (SKIP_IC(ic)) continue;
1580 assert(isSymbolEqual(sym,OP_SYMBOL(IC_RESULT(ic)))); /* just making sure */
1581 /* if left is assigned to registers */
1582 if (IS_SYMOP(IC_LEFT(ic)) &&
1583 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_LEFT(ic))->key)) {
1584 pdone += (positionRegs(sym,OP_SYMBOL(IC_LEFT(ic)))>0);
1586 if (IS_SYMOP(IC_RIGHT(ic)) &&
1587 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RIGHT(ic))->key)) {
1588 pdone += (positionRegs(sym,OP_SYMBOL(IC_RIGHT(ic)))>0);
1590 if (pdone > 1) break;
1593 for (i = 0 ; i < sym->uses->size ; i++ ) {
1594 if (bitVectBitValue(sym->uses,i)) {
1596 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1597 if (SKIP_IC(ic)) continue;
1598 if (POINTER_SET(ic) || POINTER_GET(ic)) continue ;
1600 /* if result is assigned to registers */
1601 if (IS_SYMOP(IC_RESULT(ic)) &&
1602 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) {
1603 pdone += (positionRegs(sym,OP_SYMBOL(IC_RESULT(ic)))>0);
1605 if (pdone > 1) break;
1608 if (pdone == 0) break; /* second pass only if regs repositioned */
1609 if (pdone > 1) break;
1611 /* had to position more than once GIVE UP */
1613 /* UNDO all the changes we made to try this */
1615 for (i=0; i < sym->nRegs ; i++ ) {
1616 sym->regs[i] = NULL;
1619 D (fprintf (stderr, "Fill Gap gave up due to positioning for "
1620 "%s in function %s\n",
1621 sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1624 D (fprintf (stderr, "FILLED GAP for %s in function %s\n",
1625 sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1626 _G.totRegAssigned = bitVectSetBit(_G.totRegAssigned,sym->key);
1627 sym->isspilt = sym->spillA = 0 ;
1628 sym->usl.spillLoc->allocreq--;
1629 sym->usl.spillLoc = NULL;
1637 /*-----------------------------------------------------------------*/
1638 /* rUmaskForOp :- returns register mask for an operand */
1639 /*-----------------------------------------------------------------*/
1641 ds390_rUmaskForOp (operand * op)
1647 /* only temporaries are assigned registers */
1651 sym = OP_SYMBOL (op);
1653 /* if spilt or no registers assigned to it
1655 if (sym->isspilt || !sym->nRegs)
1658 rumask = newBitVect (ds390_nRegs);
1660 for (j = 0; j < sym->nRegs; j++)
1662 rumask = bitVectSetBit (rumask,
1663 sym->regs[j]->rIdx);
1669 /*-----------------------------------------------------------------*/
1670 /* regsUsedIniCode :- returns bit vector of registers used in iCode */
1671 /*-----------------------------------------------------------------*/
1673 regsUsedIniCode (iCode * ic)
1675 bitVect *rmask = newBitVect (ds390_nRegs);
1677 /* do the special cases first */
1680 rmask = bitVectUnion (rmask,
1681 ds390_rUmaskForOp (IC_COND (ic)));
1685 /* for the jumptable */
1686 if (ic->op == JUMPTABLE)
1688 rmask = bitVectUnion (rmask,
1689 ds390_rUmaskForOp (IC_JTCOND (ic)));
1694 /* of all other cases */
1696 rmask = bitVectUnion (rmask,
1697 ds390_rUmaskForOp (IC_LEFT (ic)));
1701 rmask = bitVectUnion (rmask,
1702 ds390_rUmaskForOp (IC_RIGHT (ic)));
1705 rmask = bitVectUnion (rmask,
1706 ds390_rUmaskForOp (IC_RESULT (ic)));
1712 /*-----------------------------------------------------------------*/
1713 /* createRegMask - for each instruction will determine the regsUsed */
1714 /*-----------------------------------------------------------------*/
1716 createRegMask (eBBlock ** ebbs, int count)
1720 /* for all blocks */
1721 for (i = 0; i < count; i++)
1725 if (ebbs[i]->noPath &&
1726 (ebbs[i]->entryLabel != entryLabel &&
1727 ebbs[i]->entryLabel != returnLabel))
1730 /* for all instructions */
1731 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1736 if (SKIP_IC2 (ic) || !ic->rlive)
1739 /* first mark the registers used in this
1741 ic->rUsed = regsUsedIniCode (ic);
1742 _G.funcrUsed = bitVectUnion (_G.funcrUsed, ic->rUsed);
1744 /* now create the register mask for those
1745 registers that are in use : this is a
1746 super set of ic->rUsed */
1747 ic->rMask = newBitVect (ds390_nRegs + 1);
1749 /* for all live Ranges alive at this point */
1750 for (j = 1; j < ic->rlive->size; j++)
1755 /* if not alive then continue */
1756 if (!bitVectBitValue (ic->rlive, j))
1759 /* find the live range we are interested in */
1760 if (!(sym = hTabItemWithKey (liveRanges, j)))
1762 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
1763 "createRegMask cannot find live range");
1764 fprintf(stderr, "\tmissing live range: key=%d\n", j);
1768 /* special case for ruonly */
1769 if (sym->ruonly && sym->liveFrom != sym->liveTo) {
1770 int size = getSize(sym->type);
1772 for (k = 0 ; k < size; k++ )
1773 ic->rMask = bitVectSetBit (ic->rMask, j++);
1777 /* if no register assigned to it */
1778 if (!sym->nRegs || sym->isspilt)
1781 /* for all the registers allocated to it */
1782 for (k = 0; k < sym->nRegs; k++)
1785 bitVectSetBit (ic->rMask, sym->regs[k]->rIdx);
1791 /*-----------------------------------------------------------------*/
1792 /* rematStr - returns the rematerialized string for a remat var */
1793 /*-----------------------------------------------------------------*/
1795 rematStr (symbol * sym)
1798 iCode *ic = sym->rematiCode;
1805 /* if plus or minus print the right hand side */
1806 if (ic->op == '+' || ic->op == '-')
1808 SNPRINTF (s, sizeof(buffer) - strlen(buffer),
1809 "0x%04x %c ", (int) operandLitValue (IC_RIGHT (ic)),
1812 ic = OP_SYMBOL (IC_LEFT (ic))->rematiCode;
1816 /* cast then continue */
1817 if (IS_CAST_ICODE(ic)) {
1818 ic = OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
1821 /* we reached the end */
1822 SNPRINTF (s, sizeof(buffer) - strlen(buffer),
1823 "%s", OP_SYMBOL (IC_LEFT (ic))->rname);
1830 /*-----------------------------------------------------------------*/
1831 /* regTypeNum - computes the type & number of registers required */
1832 /*-----------------------------------------------------------------*/
1840 /* for each live range do */
1841 for (sym = hTabFirstItem (liveRanges, &k); sym;
1842 sym = hTabNextItem (liveRanges, &k))
1845 /* if used zero times then no registers needed */
1846 if ((sym->liveTo - sym->liveFrom) == 0)
1850 /* if the live range is a temporary */
1854 /* if the type is marked as a conditional */
1855 if (sym->regType == REG_CND)
1858 /* if used in return only then we don't
1860 if (sym->ruonly || sym->accuse)
1862 if (IS_AGGREGATE (sym->type) || sym->isptr)
1863 sym->type = aggrToPtr (sym->type, FALSE);
1867 /* if the symbol has only one definition &
1868 that definition is a get_pointer */
1869 if (bitVectnBitsOn (sym->defs) == 1 &&
1870 (ic = hTabItemWithKey (iCodehTab,
1871 bitVectFirstBit (sym->defs))) &&
1873 !IS_BITVAR (sym->etype) &&
1874 (aggrToPtrDclType (operandType (IC_LEFT (ic)), FALSE) == POINTER))
1877 if (ptrPseudoSymSafe (sym, ic))
1879 ptrPseudoSymConvert (sym, ic, rematStr (OP_SYMBOL (IC_LEFT (ic))));
1883 /* if in data space or idata space then try to
1884 allocate pointer register */
1888 /* if not then we require registers */
1889 sym->nRegs = ((IS_AGGREGATE (sym->type) || sym->isptr) ?
1890 getSize (sym->type = aggrToPtr (sym->type, FALSE)) :
1891 getSize (sym->type));
1895 fprintf (stderr, "allocated more than 4 or 0 registers for type ");
1896 printTypeChain (sym->type, stderr);
1897 fprintf (stderr, "\n");
1900 /* determine the type of register required */
1901 if (sym->nRegs == 1 &&
1902 IS_PTR (sym->type) &&
1904 sym->regType = REG_PTR;
1906 sym->regType = REG_GPR;
1910 /* for the first run we don't provide */
1911 /* registers for true symbols we will */
1912 /* see how things go */
1918 /*-----------------------------------------------------------------*/
1919 /* freeAllRegs - mark all registers as free */
1920 /*-----------------------------------------------------------------*/
1926 for (i = 0; i < ds390_nRegs; i++)
1927 regs390[i].isFree = 1;
1930 /*-----------------------------------------------------------------*/
1931 /* deallocStackSpil - this will set the stack pointer back */
1932 /*-----------------------------------------------------------------*/
1934 DEFSETFUNC (deallocStackSpil)
1942 /*-----------------------------------------------------------------*/
1943 /* farSpacePackable - returns the packable icode for far variables */
1944 /*-----------------------------------------------------------------*/
1946 farSpacePackable (iCode * ic)
1950 /* go thru till we find a definition for the
1951 symbol on the right */
1952 for (dic = ic->prev; dic; dic = dic->prev)
1954 /* if the definition is a call then no */
1955 if ((dic->op == CALL || dic->op == PCALL) &&
1956 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1961 /* if shift by unknown amount then not */
1962 if ((dic->op == LEFT_OP || dic->op == RIGHT_OP) &&
1963 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1966 /* if pointer get and size > 1 */
1967 if (POINTER_GET (dic) &&
1968 getSize (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)) > 1)
1971 if (POINTER_SET (dic) &&
1972 getSize (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)) > 1)
1975 /* if any tree is a true symbol in far space */
1976 if (IC_RESULT (dic) &&
1977 IS_TRUE_SYMOP (IC_RESULT (dic)) &&
1978 isOperandInFarSpace (IC_RESULT (dic)))
1981 if (IC_RIGHT (dic) &&
1982 IS_TRUE_SYMOP (IC_RIGHT (dic)) &&
1983 isOperandInFarSpace (IC_RIGHT (dic)) &&
1984 !isOperandEqual (IC_RIGHT (dic), IC_RESULT (ic)))
1987 if (IC_LEFT (dic) &&
1988 IS_TRUE_SYMOP (IC_LEFT (dic)) &&
1989 isOperandInFarSpace (IC_LEFT (dic)) &&
1990 !isOperandEqual (IC_LEFT (dic), IC_RESULT (ic)))
1993 if (isOperandEqual (IC_RIGHT (ic), IC_RESULT (dic)))
1995 if ((dic->op == LEFT_OP ||
1996 dic->op == RIGHT_OP ||
1998 IS_OP_LITERAL (IC_RIGHT (dic)))
2008 /*-----------------------------------------------------------------*/
2009 /* packRegsForAssign - register reduction for assignment */
2010 /*-----------------------------------------------------------------*/
2012 packRegsForAssign (iCode * ic, eBBlock * ebp)
2016 if (!IS_ITEMP (IC_RIGHT (ic)) ||
2017 OP_SYMBOL (IC_RIGHT (ic))->isind ||
2018 OP_LIVETO (IC_RIGHT (ic)) > ic->seq)
2023 /* if the true symbol is defined in far space or on stack
2024 then we should not since this will increase register pressure */
2026 if (isOperandInFarSpace (IC_RESULT (ic)))
2028 if ((dic = farSpacePackable (ic)))
2034 if (isOperandInFarSpace(IC_RESULT(ic)) && !farSpacePackable(ic)) {
2039 /* find the definition of iTempNN scanning backwards if we find a
2040 a use of the true symbol in before we find the definition then
2042 for (dic = ic->prev; dic; dic = dic->prev)
2044 /* if there is a function call then don't pack it */
2045 if ((dic->op == CALL || dic->op == PCALL))
2054 if (IS_TRUE_SYMOP (IC_RESULT (dic)) &&
2055 IS_OP_VOLATILE (IC_RESULT (dic)))
2061 if (IS_SYMOP (IC_RESULT (dic)) &&
2062 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
2064 if (POINTER_SET (dic))
2070 if (IS_SYMOP (IC_RIGHT (dic)) &&
2071 (IC_RIGHT (dic)->key == IC_RESULT (ic)->key ||
2072 IC_RIGHT (dic)->key == IC_RIGHT (ic)->key))
2078 if (IS_SYMOP (IC_LEFT (dic)) &&
2079 (IC_LEFT (dic)->key == IC_RESULT (ic)->key ||
2080 IC_LEFT (dic)->key == IC_RIGHT (ic)->key))
2086 if (POINTER_SET (dic) &&
2087 IC_RESULT (dic)->key == IC_RESULT (ic)->key)
2095 return 0; /* did not find */
2097 /* if the result is on stack or iaccess then it must be
2098 the same atleast one of the operands */
2099 if (OP_SYMBOL (IC_RESULT (ic))->onStack ||
2100 OP_SYMBOL (IC_RESULT (ic))->iaccess)
2103 /* the operation has only one symbol
2104 operator then we can pack */
2105 if ((IC_LEFT (dic) && !IS_SYMOP (IC_LEFT (dic))) ||
2106 (IC_RIGHT (dic) && !IS_SYMOP (IC_RIGHT (dic))))
2109 if (!((IC_LEFT (dic) &&
2110 IC_RESULT (ic)->key == IC_LEFT (dic)->key) ||
2112 IC_RESULT (ic)->key == IC_RIGHT (dic)->key)))
2116 /* found the definition */
2117 /* replace the result with the result of */
2118 /* this assignment and remove this assignment */
2119 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2121 IC_RESULT (dic) = IC_RESULT (ic);
2123 if (IS_ITEMP (IC_RESULT (dic)) && OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq)
2125 OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq;
2127 /* delete from liverange table also
2128 delete from all the points inbetween and the new
2130 for (sic = dic; sic != ic; sic = sic->next)
2132 bitVectUnSetBit (sic->rlive, IC_RESULT (ic)->key);
2133 if (IS_ITEMP (IC_RESULT (dic)))
2134 bitVectSetBit (sic->rlive, IC_RESULT (dic)->key);
2137 remiCodeFromeBBlock (ebp, ic);
2138 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2139 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
2140 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
2144 /*------------------------------------------------------------------*/
2145 /* findAssignToSym : scanning backwards looks for first assig found */
2146 /*------------------------------------------------------------------*/
2148 findAssignToSym (operand * op, iCode * ic)
2152 /* This routine is used to find sequences like
2154 ...; (intervening ops don't use iTempAA or modify FOO)
2155 blah = blah + iTempAA;
2157 and eliminate the use of iTempAA, freeing up its register for
2161 for (dic = ic->prev; dic; dic = dic->prev)
2164 /* if definition by assignment */
2165 if (dic->op == '=' &&
2166 !POINTER_SET (dic) &&
2167 IC_RESULT (dic)->key == op->key
2168 /* && IS_TRUE_SYMOP(IC_RIGHT(dic)) */
2172 /* we are interested only if defined in far space */
2173 /* or in stack space in case of + & - */
2175 /* if assigned to a non-symbol then return
2177 if (!IS_SYMOP (IC_RIGHT (dic)))
2180 /* if the symbol is in far space then
2182 if (isOperandInFarSpace (IC_RIGHT (dic)))
2185 /* for + & - operations make sure that
2186 if it is on the stack it is the same
2187 as one of the three operands */
2188 if ((ic->op == '+' || ic->op == '-') &&
2189 OP_SYMBOL (IC_RIGHT (dic))->onStack)
2192 if (IC_RESULT (ic)->key != IC_RIGHT (dic)->key &&
2193 IC_LEFT (ic)->key != IC_RIGHT (dic)->key &&
2194 IC_RIGHT (ic)->key != IC_RIGHT (dic)->key)
2202 /* if we find an usage then we cannot delete it */
2203 if (IC_LEFT (dic) && IC_LEFT (dic)->key == op->key)
2206 if (IC_RIGHT (dic) && IC_RIGHT (dic)->key == op->key)
2209 if (POINTER_SET (dic) && IC_RESULT (dic)->key == op->key)
2213 /* now make sure that the right side of dic
2214 is not defined between ic & dic */
2217 iCode *sic = dic->next;
2219 for (; sic != ic; sic = sic->next)
2220 if (IC_RESULT (sic) &&
2221 IC_RESULT (sic)->key == IC_RIGHT (dic)->key)
2230 /*-----------------------------------------------------------------*/
2231 /* packRegsForSupport :- reduce some registers for support calls */
2232 /*-----------------------------------------------------------------*/
2234 packRegsForSupport (iCode * ic, eBBlock * ebp)
2238 /* for the left & right operand :- look to see if the
2239 left was assigned a true symbol in far space in that
2240 case replace them */
2241 if (IS_ITEMP (IC_LEFT (ic)) &&
2242 OP_SYMBOL (IC_LEFT (ic))->liveTo <= ic->seq)
2244 iCode *dic = findAssignToSym (IC_LEFT (ic), ic);
2250 /* found it we need to remove it from the
2252 for (sic = dic; sic != ic; sic = sic->next) {
2253 bitVectUnSetBit (sic->rlive, IC_LEFT (ic)->key);
2254 sic->rlive = bitVectSetBit (sic->rlive, IC_RIGHT (dic)->key);
2257 wassert(IS_SYMOP(IC_LEFT (ic)));
2258 wassert(IS_SYMOP(IC_RIGHT (dic)));
2259 IC_LEFT (ic)->operand.symOperand =
2260 IC_RIGHT (dic)->operand.symOperand;
2261 OP_SYMBOL(IC_LEFT(ic))->liveTo = ic->seq;
2262 IC_LEFT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
2263 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2264 remiCodeFromeBBlock (ebp, dic);
2265 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
2269 /* do the same for the right operand */
2272 IS_ITEMP (IC_RIGHT (ic)) &&
2273 OP_SYMBOL (IC_RIGHT (ic))->liveTo <= ic->seq)
2275 iCode *dic = findAssignToSym (IC_RIGHT (ic), ic);
2281 /* if this is a subtraction & the result
2282 is a true symbol in far space then don't pack */
2283 if (ic->op == '-' && IS_TRUE_SYMOP (IC_RESULT (dic)))
2285 sym_link *etype = getSpec (operandType (IC_RESULT (dic)));
2286 if (IN_FARSPACE (SPEC_OCLS (etype)))
2289 /* found it we need to remove it from the
2291 for (sic = dic; sic != ic; sic = sic->next) {
2292 bitVectUnSetBit (sic->rlive, IC_RIGHT (ic)->key);
2293 sic->rlive = bitVectSetBit (sic->rlive, IC_RIGHT (dic)->key);
2296 wassert(IS_SYMOP(IC_RIGHT (ic)));
2297 wassert(IS_SYMOP(IC_RIGHT (dic)));
2298 IC_RIGHT (ic)->operand.symOperand =
2299 IC_RIGHT (dic)->operand.symOperand;
2300 IC_RIGHT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
2301 OP_SYMBOL(IC_RIGHT(ic))->liveTo = ic->seq;
2302 remiCodeFromeBBlock (ebp, dic);
2303 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2304 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
2311 #define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
2314 /*-----------------------------------------------------------------*/
2315 /* packRegsDPTRnuse - color live ranges that can go into extra DPTRS */
2316 /*-----------------------------------------------------------------*/
2317 static int packRegsDPTRnuse( operand *op , unsigned dptr)
2322 if (!IS_SYMOP(op) || !IS_ITEMP(op)) return 0;
2323 if (OP_SYMBOL(op)->remat || OP_SYMBOL(op)->ruonly || OP_SYMBOL(op)->dptr)
2326 /* first check if any overlapping liverange has already been
2327 assigned to this DPTR */
2328 if (OP_SYMBOL(op)->clashes) {
2329 for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ ) {
2331 if (bitVectBitValue(OP_SYMBOL(op)->clashes,i)) {
2332 sym = hTabItemWithKey(liveRanges,i);
2333 if (sym->dptr == dptr) return 0;
2338 /* future for more dptrs */
2340 OP_SYMBOL(op)->dptr = dptr;
2344 /* DPTR1 is special since it is also used as a scratch by the backend .
2345 so we walk thru the entire live range of this operand and make sure
2346 DPTR1 will not be used by the backed . The logic here is to find out if
2347 more than one operand in an icode is in far space then we give up : we
2348 don't keep it live across functions for now
2351 ic = hTabFirstItemWK(iCodeSeqhTab,OP_SYMBOL(op)->liveFrom);
2352 for (; ic && ic->seq <= OP_SYMBOL(op)->liveTo;
2353 ic = hTabNextItem(iCodeSeqhTab,&key)) {
2356 if (ic->op == CALL || ic->op == PCALL) return 0;
2358 /* single operand icode are ok */
2359 if (ic->op == IFX || ic->op == IPUSH)
2362 if (ic->op == SEND ) {
2363 if (ic->argreg != 1 ) return 0;
2366 /* two special cases first */
2367 if (POINTER_GET(ic) && !isOperandEqual(IC_LEFT(ic),op) && /* pointer get */
2368 !OP_SYMBOL(IC_LEFT(ic))->ruonly && /* with result in far space */
2369 (isOperandInFarSpace(IC_RESULT(ic)) &&
2370 !isOperandInReg(IC_RESULT(ic)))) {
2374 if (POINTER_SET(ic) && !isOperandEqual(IC_RESULT(ic),op) && /* pointer set */
2375 !OP_SYMBOL(IC_RESULT(ic))->ruonly && /* with right in far space */
2376 (isOperandInFarSpace(IC_RIGHT(ic)) &&
2377 !isOperandInReg(IC_RIGHT(ic)))) {
2381 if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) && /* if symbol operand */
2382 !isOperandEqual(IC_RESULT(ic),op) && /* not the same as this */
2383 ((isOperandInFarSpace(IC_RESULT(ic)) || /* in farspace or */
2384 OP_SYMBOL(IC_RESULT(ic))->onStack) && /* on the stack */
2385 !isOperandInReg(IC_RESULT(ic)))) { /* and not in register */
2389 if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) && /* if symbol operand */
2390 !isOperandEqual(IC_LEFT(ic),op) && /* not the same as this */
2391 ((isOperandInFarSpace(IC_LEFT(ic)) || /* in farspace or */
2392 OP_SYMBOL(IC_LEFT(ic))->onStack) && /* on the stack */
2393 !isOperandInReg(IC_LEFT(ic)))) { /* and not in register */
2396 /* same for right */
2397 if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) && /* if symbol operand */
2398 !isOperandEqual(IC_RIGHT(ic),op) && /* not the same as this */
2399 ((isOperandInFarSpace(IC_RIGHT(ic)) || /* in farspace or */
2400 OP_SYMBOL(IC_RIGHT(ic))->onStack) && /* on the stack */
2401 !isOperandInReg(IC_RIGHT(ic)))) { /* and not in register */
2405 // Check that no other ops in this range have been assigned to dptr1.
2406 // I don't understand why this is not caught by the first check, above.
2407 // But it isn't always, see bug 769624.
2408 if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) &&
2409 (OP_SYMBOL(IC_RESULT(ic))->dptr == 1))
2411 //fprintf(stderr, "dptr1 already in use in live range #1\n");
2415 if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) &&
2416 (OP_SYMBOL(IC_LEFT(ic))->dptr == 1))
2418 //fprintf(stderr, "dptr1 already in use in live range # 2\n");
2422 if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) &&
2423 (OP_SYMBOL(IC_RIGHT(ic))->dptr == 1))
2425 //fprintf(stderr, "dptr1 already in use in live range # 3\n");
2429 if (nfs && IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) &&
2430 OP_SYMBOL(IC_RESULT(ic))->ruonly) return 0;
2432 if (nfs > 1) return 0;
2434 OP_SYMBOL(op)->dptr = dptr;
2438 /*-----------------------------------------------------------------*/
2439 /* packRegsDPTRuse : - will reduce some registers for single Use */
2440 /*-----------------------------------------------------------------*/
2442 packRegsDPTRuse (operand * op)
2444 /* go thru entire liveRange of this variable & check for
2445 other possible usage of DPTR , if we don't find it the
2446 assign this to DPTR (ruonly)
2451 sym_link *type, *etype;
2453 if (!IS_SYMOP(op) || !IS_ITEMP(op)) return NULL;
2454 if (OP_SYMBOL(op)->remat || OP_SYMBOL(op)->ruonly) return NULL;
2456 /* first check if any overlapping liverange has already been
2458 if (OP_SYMBOL(op)->clashes) {
2459 for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ ) {
2460 if (bitVectBitValue(OP_SYMBOL(op)->clashes,i)) {
2461 sym = hTabItemWithKey(liveRanges,i);
2462 if (sym->ruonly) return NULL ;
2467 /* no then go thru this guys live range */
2468 dic = ic = hTabFirstItemWK(iCodeSeqhTab,OP_SYMBOL(op)->liveFrom);
2469 for (; ic && ic->seq <= OP_SYMBOL(op)->liveTo;
2470 ic = hTabNextItem(iCodeSeqhTab,&key)) {
2472 if (SKIP_IC3(ic)) continue;
2474 /* if PCALL cannot be sure give up */
2475 if (ic->op == PCALL) return NULL;
2477 /* if SEND & not the first parameter then giveup */
2478 if (ic->op == SEND && ic->argreg != 1 &&
2479 ((isOperandInFarSpace(IC_LEFT(ic)) && !isOperandInReg(IC_LEFT(ic))) ||
2480 isOperandEqual(op,IC_LEFT(ic)))) return NULL;
2482 /* if CALL then make sure it is VOID || return value not used
2483 or the return value is assigned to this one */
2484 if (ic->op == CALL) {
2485 if (OP_SYMBOL(IC_RESULT(ic))->liveTo ==
2486 OP_SYMBOL(IC_RESULT(ic))->liveFrom) continue ;
2487 etype = getSpec(type = operandType(IC_RESULT(ic)));
2488 if (getSize(type) == 0 || isOperandEqual(op,IC_RESULT(ic)))
2493 /* special case of add with a [remat] */
2494 if (ic->op == '+' &&
2495 OP_SYMBOL(IC_LEFT(ic))->remat &&
2496 (isOperandInFarSpace(IC_RIGHT(ic)) &&
2497 !isOperandInReg(IC_RIGHT(ic)))) return NULL ;
2501 if (POINTER_GET(ic) && !isOperandEqual(IC_LEFT(ic),op) &&
2502 getSize(operandType(IC_LEFT(ic))) > 1 ) return NULL ;
2505 if (POINTER_SET(ic) && !isOperandEqual(IC_RESULT(ic),op) &&
2506 getSize(operandType(IC_RESULT(ic))) > 1 ) return NULL;
2508 /* conditionals can destroy 'b' - make sure B wont
2509 be used in this one*/
2510 if ((IS_CONDITIONAL(ic) || ic->op == '*' || ic->op == '/' ||
2511 ic->op == LEFT_OP || ic->op == RIGHT_OP ) &&
2512 getSize(operandType(op)) > 3) return NULL;
2514 /* if this is a cast to a bigger type */
2516 if (!IS_PTR(OP_SYM_TYPE(IC_RESULT(ic))) &&
2517 getSize(OP_SYM_TYPE(IC_RESULT(ic))) >
2518 getSize(OP_SYM_TYPE(IC_RIGHT(ic)))) {
2524 if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) &&
2525 !isOperandEqual(IC_RESULT(ic),op) &&
2526 ( ( ( isOperandInFarSpace(IC_RESULT(ic)) || OP_SYMBOL(IC_RESULT(ic))->onStack) &&
2527 !isOperandInReg(IC_RESULT(ic))) ||
2528 OP_SYMBOL(IC_RESULT(ic))->ruonly)) return NULL;
2530 if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) &&
2531 !isOperandEqual(IC_RIGHT(ic),op) &&
2532 (OP_SYMBOL(IC_RIGHT(ic))->liveTo >= ic->seq ||
2533 IS_TRUE_SYMOP(IC_RIGHT(ic)) ||
2534 OP_SYMBOL(IC_RIGHT(ic))->ruonly) &&
2535 ( ( isOperandInFarSpace(IC_RIGHT(ic)) || OP_SYMBOL(IC_RIGHT(ic))->onStack) &&
2536 !isOperandInReg(IC_RIGHT(ic))) ) return NULL;
2538 if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) &&
2539 !isOperandEqual(IC_LEFT(ic),op) &&
2540 (OP_SYMBOL(IC_LEFT(ic))->liveTo >= ic->seq ||
2541 IS_TRUE_SYMOP(IC_LEFT(ic)) ||
2542 OP_SYMBOL(IC_LEFT(ic))->ruonly) &&
2543 ( ( isOperandInFarSpace(IC_LEFT(ic)) || OP_SYMBOL(IC_LEFT(ic))->onStack) &&
2544 !isOperandInReg(IC_LEFT(ic))) ) return NULL;
2546 if (IC_LEFT(ic) && IC_RIGHT(ic) &&
2547 IS_ITEMP(IC_LEFT(ic)) && IS_ITEMP(IC_RIGHT(ic)) &&
2548 (isOperandInFarSpace(IC_LEFT(ic)) && !isOperandInReg(IC_LEFT(ic))) &&
2549 (isOperandInFarSpace(IC_RIGHT(ic)) && !isOperandInReg(IC_RIGHT(ic))))
2552 OP_SYMBOL(op)->ruonly = 1;
2553 if (OP_SYMBOL(op)->usl.spillLoc) {
2554 if (OP_SYMBOL(op)->spillA)
2555 OP_SYMBOL(op)->usl.spillLoc->allocreq--;
2556 OP_SYMBOL(op)->usl.spillLoc = NULL;
2561 /*-----------------------------------------------------------------*/
2562 /* isBitwiseOptimizable - requirements of JEAN LOUIS VERN */
2563 /*-----------------------------------------------------------------*/
2565 isBitwiseOptimizable (iCode * ic)
2567 sym_link *ltype = getSpec (operandType (IC_LEFT (ic)));
2568 sym_link *rtype = getSpec (operandType (IC_RIGHT (ic)));
2570 /* bitwise operations are considered optimizable
2571 under the following conditions (Jean-Louis VERN)
2583 if (IS_LITERAL (rtype) ||
2584 (IS_BITVAR (ltype) && IN_BITSPACE (SPEC_OCLS (ltype))))
2590 /*-----------------------------------------------------------------*/
2591 /* packRegsForAccUse - pack registers for acc use */
2592 /*-----------------------------------------------------------------*/
2594 packRegsForAccUse (iCode * ic)
2598 /* if this is an aggregate, e.g. a one byte char array */
2599 if (IS_AGGREGATE(operandType(IC_RESULT(ic)))) {
2603 /* if we are calling a reentrant function that has stack parameters */
2604 if (ic->op == CALL &&
2605 IFFUNC_ISREENT(operandType(IC_LEFT(ic))) &&
2606 FUNC_HASSTACKPARM(operandType(IC_LEFT(ic))))
2609 if (ic->op == PCALL &&
2610 IFFUNC_ISREENT(operandType(IC_LEFT(ic))->next) &&
2611 FUNC_HASSTACKPARM(operandType(IC_LEFT(ic))->next))
2614 /* if + or - then it has to be one byte result */
2615 if ((ic->op == '+' || ic->op == '-')
2616 && getSize (operandType (IC_RESULT (ic))) > 1)
2619 /* if shift operation make sure right side is not a literal */
2620 if (ic->op == RIGHT_OP &&
2621 (isOperandLiteral (IC_RIGHT (ic)) ||
2622 getSize (operandType (IC_RESULT (ic))) > 1))
2625 if (ic->op == LEFT_OP &&
2626 (isOperandLiteral (IC_RIGHT (ic)) ||
2627 getSize (operandType (IC_RESULT (ic))) > 1))
2630 if (IS_BITWISE_OP (ic) &&
2631 getSize (operandType (IC_RESULT (ic))) > 1)
2635 /* has only one definition */
2636 if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2639 /* has only one use */
2640 if (bitVectnBitsOn (OP_USES (IC_RESULT (ic))) > 1)
2643 /* and the usage immediately follows this iCode */
2644 if (!(uic = hTabItemWithKey (iCodehTab,
2645 bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2648 if (ic->next != uic)
2651 /* if it is a conditional branch then we definitely can */
2655 if (uic->op == JUMPTABLE)
2658 /* if the usage is not is an assignment
2659 or an arithmetic / bitwise / shift operation then not */
2660 if (POINTER_SET (uic) &&
2661 getSize (aggrToPtr (operandType (IC_RESULT (uic)), FALSE)) > 1)
2664 if (uic->op != '=' &&
2665 !IS_ARITHMETIC_OP (uic) &&
2666 !IS_BITWISE_OP (uic) &&
2667 uic->op != LEFT_OP &&
2668 uic->op != RIGHT_OP)
2671 /* if used in ^ operation then make sure right is not a
2673 if (uic->op == '^' && isOperandLiteral (IC_RIGHT (uic)))
2676 /* if shift operation make sure right side is not a literal */
2677 if (uic->op == RIGHT_OP &&
2678 (isOperandLiteral (IC_RIGHT (uic)) ||
2679 getSize (operandType (IC_RESULT (uic))) > 1))
2682 if (uic->op == LEFT_OP &&
2683 (isOperandLiteral (IC_RIGHT (uic)) ||
2684 getSize (operandType (IC_RESULT (uic))) > 1))
2687 /* make sure that the result of this icode is not on the
2688 stack, since acc is used to compute stack offset */
2689 if (isOperandOnStack(IC_RESULT(uic)))
2692 /* if either one of them in far space then we cannot */
2693 if ((IS_TRUE_SYMOP (IC_LEFT (uic)) &&
2694 isOperandInFarSpace (IC_LEFT (uic))) ||
2695 (IS_TRUE_SYMOP (IC_RIGHT (uic)) &&
2696 isOperandInFarSpace (IC_RIGHT (uic))))
2699 /* if the usage has only one operand then we can */
2700 if (IC_LEFT (uic) == NULL ||
2701 IC_RIGHT (uic) == NULL)
2704 /* make sure this is on the left side if not
2705 a '+' since '+' is commutative */
2706 if (ic->op != '+' &&
2707 IC_LEFT (uic)->key != IC_RESULT (ic)->key)
2710 /* if the other one is not on stack then we can */
2711 if (IC_LEFT (uic)->key == IC_RESULT (ic)->key &&
2712 (IS_ITEMP (IC_RIGHT (uic)) ||
2713 (IS_TRUE_SYMOP (IC_RIGHT (uic)) &&
2714 !OP_SYMBOL (IC_RIGHT (uic))->onStack)))
2717 if (IC_RIGHT (uic)->key == IC_RESULT (ic)->key &&
2718 (IS_ITEMP (IC_LEFT (uic)) ||
2719 (IS_TRUE_SYMOP (IC_LEFT (uic)) &&
2720 !OP_SYMBOL (IC_LEFT (uic))->onStack)))
2726 OP_SYMBOL (IC_RESULT (ic))->accuse = 1;
2730 /*-----------------------------------------------------------------*/
2731 /* packForPush - hueristics to reduce iCode for pushing */
2732 /*-----------------------------------------------------------------*/
2734 packForPush (iCode * ic, eBBlock * ebp)
2739 if ((ic->op != IPUSH && ic->op != SEND) || !IS_ITEMP (IC_LEFT (ic)))
2742 /* must have only definition & one usage */
2743 if (bitVectnBitsOn (OP_DEFS (IC_LEFT (ic))) != 1 ||
2744 bitVectnBitsOn (OP_USES (IC_LEFT (ic))) != 1)
2747 /* find the definition */
2748 if (!(dic = hTabItemWithKey (iCodehTab,
2749 bitVectFirstBit (OP_DEFS (IC_LEFT (ic))))))
2752 if (dic->op != '=' || POINTER_SET (dic))
2755 if (dic->eBBlockNum != ic->eBBlockNum) return ;
2757 /* make sure the right side does not have any definitions
2759 dbv = OP_DEFS(IC_RIGHT(dic));
2760 for (lic = ic; lic && lic != dic ; lic = lic->prev) {
2761 if (bitVectBitValue(dbv,lic->key)) return ;
2763 /* make sure they have the same type */
2764 if (IS_SPEC(operandType(IC_LEFT(ic))))
2766 sym_link *itype=operandType(IC_LEFT(ic));
2767 sym_link *ditype=operandType(IC_RIGHT(dic));
2769 if (SPEC_USIGN(itype)!=SPEC_USIGN(ditype) ||
2770 SPEC_LONG(itype)!=SPEC_LONG(ditype))
2773 /* extend the live range of replaced operand if needed */
2774 if (OP_SYMBOL(IC_RIGHT(dic))->liveTo < OP_SYMBOL(IC_LEFT(ic))->liveTo) {
2775 OP_SYMBOL(IC_RIGHT(dic))->liveTo = OP_SYMBOL(IC_LEFT(ic))->liveTo;
2776 OP_SYMBOL(IC_RIGHT(dic))->clashes =
2777 bitVectUnion(OP_SYMBOL(IC_RIGHT(dic))->clashes,
2778 OP_SYMBOL(IC_LEFT(ic))->clashes);
2780 for (lic = ic; lic && lic != dic; lic = lic->prev)
2782 bitVectUnSetBit (lic->rlive, IC_LEFT (ic)->key);
2783 if (IS_ITEMP (IC_RIGHT (dic)))
2784 bitVectSetBit (lic->rlive, IC_RIGHT (dic)->key);
2786 /* we now we know that it has one & only one def & use
2787 and the that the definition is an assignment */
2788 IC_LEFT (ic) = IC_RIGHT (dic);
2790 remiCodeFromeBBlock (ebp, dic);
2791 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2792 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
2795 /*-----------------------------------------------------------------*/
2796 /* packRegisters - does some transformations to reduce register */
2798 /*-----------------------------------------------------------------*/
2800 packRegisters (eBBlock * ebp)
2810 /* look for assignments of the form */
2811 /* iTempNN = TRueSym (someoperation) SomeOperand */
2813 /* TrueSym := iTempNN:1 */
2814 for (ic = ebp->sch; ic; ic = ic->next)
2816 /* find assignment of the form TrueSym := iTempNN:1 */
2817 if (ic->op == '=' && !POINTER_SET (ic))
2818 change += packRegsForAssign (ic, ebp);
2825 for (ic = ebp->sch; ic; ic = ic->next)
2827 /* if this is an itemp & result of an address of a true sym
2828 then mark this as rematerialisable */
2829 if (ic->op == ADDRESS_OF &&
2830 IS_ITEMP (IC_RESULT (ic)) &&
2831 IS_TRUE_SYMOP (IC_LEFT (ic)) &&
2832 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2833 !OP_SYMBOL (IC_LEFT (ic))->onStack)
2836 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2837 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2838 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2842 /* if this is an itemp & used as a pointer
2843 & assigned to a literal then remat */
2844 if (IS_ASSIGN_ICODE(ic) &&
2845 IS_ITEMP(IC_RESULT(ic)) &&
2846 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2847 isOperandLiteral(IC_RIGHT(ic)))
2849 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2850 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2851 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2854 /* if straight assignment then carry remat flag if
2855 this is the only definition */
2856 if (ic->op == '=' &&
2857 !POINTER_SET (ic) &&
2858 IS_SYMOP (IC_RIGHT (ic)) &&
2859 OP_SYMBOL (IC_RIGHT (ic))->remat &&
2860 !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode) &&
2861 bitVectnBitsOn (OP_SYMBOL (IC_RESULT (ic))->defs) <= 1)
2864 OP_SYMBOL (IC_RESULT (ic))->remat =
2865 OP_SYMBOL (IC_RIGHT (ic))->remat;
2866 OP_SYMBOL (IC_RESULT (ic))->rematiCode =
2867 OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
2870 /* if cast to a generic pointer & the pointer being
2871 cast is remat, then we can remat this cast as well */
2872 if (ic->op == CAST &&
2873 IS_SYMOP(IC_RIGHT(ic)) &&
2874 !OP_SYMBOL(IC_RESULT(ic))->isreqv &&
2875 OP_SYMBOL(IC_RIGHT(ic))->remat ) {
2876 sym_link *to_type = operandType(IC_LEFT(ic));
2877 sym_link *from_type = operandType(IC_RIGHT(ic));
2878 if (IS_GENPTR(to_type) && IS_PTR(from_type)) {
2879 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2880 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2881 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2885 /* if this is a +/- operation with a rematerizable
2886 then mark this as rematerializable as well */
2887 if ((ic->op == '+' || ic->op == '-') &&
2888 (IS_SYMOP (IC_LEFT (ic)) &&
2889 IS_ITEMP (IC_RESULT (ic)) &&
2890 OP_SYMBOL (IC_LEFT (ic))->remat &&
2891 (!IS_SYMOP (IC_RIGHT (ic)) || !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode)) &&
2892 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2893 IS_OP_LITERAL (IC_RIGHT (ic))))
2896 //int i = operandLitValue(IC_RIGHT(ic));
2897 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2898 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2899 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2902 /* mark the pointer usages */
2903 if (POINTER_SET (ic) && IS_SYMOP (IC_RESULT (ic)))
2904 OP_SYMBOL (IC_RESULT (ic))->uptr = 1;
2906 if (POINTER_GET (ic) && IS_SYMOP (IC_LEFT (ic)))
2907 OP_SYMBOL (IC_LEFT (ic))->uptr = 1;
2909 if (ic->op == RETURN && IS_SYMOP (IC_LEFT(ic)))
2910 OP_SYMBOL (IC_LEFT (ic))->uptr = 1;
2912 if (ic->op == RECEIVE && ic->argreg == 1 &&
2913 IS_SYMOP (IC_RESULT (ic)) &&
2914 getSize (operandType(IC_RESULT(ic))) <= 3)
2915 OP_SYMBOL (IC_RESULT(ic))->uptr = 1;
2917 if (ic->op == SEND && ic->argreg == 1 &&
2918 IS_SYMOP(IC_LEFT(ic)) &&
2919 getSize (aggrToPtr(operandType(IC_LEFT(ic)),FALSE)) <= 3)
2920 OP_SYMBOL (IC_LEFT(ic))->uptr = 1;
2924 /* if we are using a symbol on the stack
2925 then we should say ds390_ptrRegReq */
2926 if (options.useXstack && ic->parmPush
2927 && (ic->op == IPUSH || ic->op == IPOP))
2929 if (ic->op == IFX && IS_SYMOP (IC_COND (ic)))
2930 ds390_ptrRegReq += ((OP_SYMBOL (IC_COND (ic))->onStack ? !options.stack10bit : 0) +
2931 OP_SYMBOL (IC_COND (ic))->iaccess +
2932 (SPEC_OCLS(OP_SYMBOL (IC_COND (ic))->etype) == idata));
2933 else if (ic->op == JUMPTABLE && IS_SYMOP (IC_JTCOND (ic)))
2934 ds390_ptrRegReq += ((OP_SYMBOL (IC_JTCOND (ic))->onStack ? !options.stack10bit : 0) +
2935 OP_SYMBOL (IC_JTCOND (ic))->iaccess +
2936 (SPEC_OCLS(OP_SYMBOL (IC_JTCOND (ic))->etype) == idata));
2939 if (IS_SYMOP (IC_LEFT (ic)))
2940 ds390_ptrRegReq += ((OP_SYMBOL (IC_LEFT (ic))->onStack ? !options.stack10bit : 0) +
2941 OP_SYMBOL (IC_LEFT (ic))->iaccess +
2942 (SPEC_OCLS(OP_SYMBOL (IC_LEFT (ic))->etype) == idata));
2943 if (IS_SYMOP (IC_RIGHT (ic)))
2944 ds390_ptrRegReq += ((OP_SYMBOL (IC_RIGHT (ic))->onStack ? !options.stack10bit : 0) +
2945 OP_SYMBOL (IC_RIGHT (ic))->iaccess +
2946 (SPEC_OCLS(OP_SYMBOL (IC_RIGHT (ic))->etype) == idata));
2947 if (IS_SYMOP (IC_RESULT (ic)))
2948 ds390_ptrRegReq += ((OP_SYMBOL (IC_RESULT (ic))->onStack ? !options.stack10bit : 0) +
2949 OP_SYMBOL (IC_RESULT (ic))->iaccess +
2950 (SPEC_OCLS(OP_SYMBOL (IC_RESULT (ic))->etype) == idata));
2954 /* if the condition of an if instruction
2955 is defined in the previous instruction and
2956 this is the only usage then
2957 mark the itemp as a conditional */
2958 if ((IS_CONDITIONAL (ic) ||
2959 (IS_BITWISE_OP(ic) && isBitwiseOptimizable (ic))) &&
2960 ic->next && ic->next->op == IFX &&
2961 bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
2962 isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
2963 OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq)
2965 OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND;
2969 /* reduce for support function calls */
2970 if (ic->supportRtn || ic->op == '+' || ic->op == '-')
2971 packRegsForSupport (ic, ebp);
2973 /* some cases the redundant moves can
2974 can be eliminated for return statements . Can be elminated for the first SEND */
2975 if ((ic->op == RETURN ||
2976 ((ic->op == SEND || ic->op == RECEIVE)&& ic->argreg == 1)) &&
2977 !isOperandInFarSpace (IC_LEFT (ic)) &&
2980 packRegsDPTRuse (IC_LEFT (ic));
2983 if (ic->op == CALL) {
2984 sym_link *ftype = operandType(IC_LEFT(ic));
2985 if (getSize(operandType(IC_RESULT(ic))) <= 4 &&
2986 !IFFUNC_ISBUILTIN(ftype)) {
2987 packRegsDPTRuse (IC_RESULT (ic));
2991 /* if pointer set & left has a size more than
2992 one and right is not in far space */
2993 if (POINTER_SET (ic) &&
2994 !isOperandInFarSpace (IC_RIGHT (ic)) &&
2995 IS_SYMOP (IC_RESULT (ic)) &&
2996 !OP_SYMBOL (IC_RESULT (ic))->remat &&
2997 !IS_OP_RUONLY (IC_RIGHT (ic)) &&
2998 getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1) {
3000 packRegsDPTRuse (IC_RESULT (ic));
3003 /* if pointer get */
3004 if (POINTER_GET (ic) &&
3005 !isOperandInFarSpace (IC_RESULT (ic)) &&
3006 IS_SYMOP (IC_LEFT (ic)) &&
3007 !OP_SYMBOL (IC_LEFT (ic))->remat &&
3008 !IS_OP_RUONLY (IC_RESULT (ic)) &&
3009 getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1) {
3011 packRegsDPTRuse (IC_LEFT (ic));
3014 /* if this is cast for intergral promotion then
3015 check if only use of the definition of the
3016 operand being casted/ if yes then replace
3017 the result of that arithmetic operation with
3018 this result and get rid of the cast */
3021 sym_link *fromType = operandType (IC_RIGHT (ic));
3022 sym_link *toType = operandType (IC_LEFT (ic));
3024 if (IS_INTEGRAL (fromType) && IS_INTEGRAL (toType) &&
3025 getSize (fromType) != getSize (toType) &&
3026 SPEC_USIGN (fromType) == SPEC_USIGN (toType))
3029 iCode *dic = packRegsDPTRuse (IC_RIGHT (ic));
3032 if (IS_ARITHMETIC_OP (dic))
3034 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
3035 IC_RESULT (dic) = IC_RESULT (ic);
3036 remiCodeFromeBBlock (ebp, ic);
3037 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
3038 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
3039 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
3043 OP_SYMBOL (IC_RIGHT (ic))->ruonly = 0;
3049 /* if the type from and type to are the same
3050 then if this is the only use then packit */
3051 if (compareType (operandType (IC_RIGHT (ic)),
3052 operandType (IC_LEFT (ic))) == 1)
3054 iCode *dic = packRegsDPTRuse (IC_RIGHT (ic));
3057 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
3058 IC_RESULT (dic) = IC_RESULT (ic);
3059 remiCodeFromeBBlock (ebp, ic);
3060 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
3061 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
3062 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
3070 iTempNN := (some variable in farspace) V1
3075 if (ic->op == IPUSH || ic->op == SEND)
3077 packForPush (ic, ebp);
3081 /* pack registers for accumulator use, when the
3082 result of an arithmetic or bit wise operation
3083 has only one use, that use is immediately following
3084 the defintion and the using iCode has only one
3085 operand or has two operands but one is literal &
3086 the result of that operation is not on stack then
3087 we can leave the result of this operation in acc:b
3089 if ((IS_ARITHMETIC_OP (ic)
3090 || IS_CONDITIONAL(ic)
3091 || IS_BITWISE_OP (ic)
3092 || ic->op == LEFT_OP || ic->op == RIGHT_OP
3093 || (ic->op == ADDRESS_OF && isOperandOnStack (IC_LEFT (ic)))
3095 IS_ITEMP (IC_RESULT (ic)) &&
3096 getSize (operandType (IC_RESULT (ic))) <= 2)
3098 packRegsForAccUse (ic);
3103 /*-----------------------------------------------------------------*/
3104 /* assignRegisters - assigns registers to each live range as need */
3105 /*-----------------------------------------------------------------*/
3107 ds390_assignRegisters (eBBlock ** ebbs, int count)
3112 setToNull ((void *) &_G.funcrUsed);
3113 setToNull ((void *) &_G.regAssigned);
3114 setToNull ((void *) &_G.totRegAssigned);
3115 setToNull ((void *) &_G.funcrUsed);
3116 ds390_ptrRegReq = _G.stackExtend = _G.dataExtend = 0;
3118 if (options.model != MODEL_FLAT24) options.stack10bit = 0;
3119 /* change assignments this will remove some
3120 live ranges reducing some register pressure */
3121 for (i = 0; i < count; i++)
3122 packRegisters (ebbs[i]);
3124 /* liveranges probably changed by register packing
3125 so we compute them again */
3126 recomputeLiveRanges (ebbs, count);
3128 if (options.dump_pack)
3129 dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
3131 /* first determine for each live range the number of
3132 registers & the type of registers required for each */
3135 /* and serially allocate registers */
3136 serialRegAssign (ebbs, count);
3143 /* if stack was extended then tell the user */
3146 /* werror(W_TOOMANY_SPILS,"stack", */
3147 /* _G.stackExtend,currFunc->name,""); */
3153 /* werror(W_TOOMANY_SPILS,"data space", */
3154 /* _G.dataExtend,currFunc->name,""); */
3158 /* after that create the register mask
3159 for each of the instruction */
3160 createRegMask (ebbs, count);
3162 /* redo that offsets for stacked automatic variables */
3164 redoStackOffsets ();
3166 /* make sure r0 & r1 are flagged as used if they might be used */
3168 if (currFunc && ds390_ptrRegReq)
3170 currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, R0_IDX);
3171 currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, R1_IDX);
3174 if (options.dump_rassgn) {
3175 dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count);
3176 dumpLiveRanges (DUMP_LRANGE, liveRanges);
3179 /* do the overlaysegment stuff SDCCmem.c */
3180 doOverlays (ebbs, count);
3182 /* now get back the chain */
3183 ic = iCodeLabelOptimize (iCodeFromeBBlock (ebbs, count));
3187 /* free up any _G.stackSpil locations allocated */
3188 applyToSet (_G.stackSpil, deallocStackSpil);
3190 setToNull ((void *) &_G.stackSpil);
3191 setToNull ((void *) &_G.spiltSet);
3192 /* mark all registers as free */