1 /*------------------------------------------------------------------------
3 SDCCralloc.c - source file for register allocation. (8051) 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", "C", "xreg", 0, 0, 0},
83 static void spillThis (symbol *);
84 static void freeAllRegs ();
85 static iCode * packRegsDPTRuse (operand *);
86 static int packRegsDPTRnuse (operand *,int);
88 /*-----------------------------------------------------------------*/
89 /* allocReg - allocates register of given type */
90 /*-----------------------------------------------------------------*/
96 for (i = 0; i < ds390_nRegs; i++)
99 /* if type is given as 0 then any
100 free register will do */
104 regs390[i].isFree = 0;
107 bitVectSetBit (currFunc->regsUsed, i);
110 /* other wise look for specific type
112 if (regs390[i].isFree &&
113 regs390[i].type == type)
115 regs390[i].isFree = 0;
118 bitVectSetBit (currFunc->regsUsed, i);
125 /*-----------------------------------------------------------------*/
126 /* ds390_regWithIdx - returns pointer to register wit index number */
127 /*-----------------------------------------------------------------*/
129 ds390_regWithIdx (int idx)
133 for (i = 0; i < ds390_nRegs; i++)
134 if (regs390[i].rIdx == idx)
137 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
138 "regWithIdx not found");
142 /*-----------------------------------------------------------------*/
143 /* freeReg - frees a register */
144 /*-----------------------------------------------------------------*/
151 /*-----------------------------------------------------------------*/
152 /* useReg - marks a register as used */
153 /*-----------------------------------------------------------------*/
161 /*-----------------------------------------------------------------*/
162 /* nFreeRegs - returns number of free registers */
163 /*-----------------------------------------------------------------*/
170 for (i = 0; i < ds390_nRegs; i++)
171 if (regs390[i].isFree && regs390[i].type == type)
176 /*-----------------------------------------------------------------*/
177 /* nfreeRegsType - free registers with type */
178 /*-----------------------------------------------------------------*/
180 nfreeRegsType (int type)
185 if ((nfr = nFreeRegs (type)) == 0)
186 return nFreeRegs (REG_GPR);
189 return nFreeRegs (type);
194 /*-----------------------------------------------------------------*/
195 /* isOperandInReg - returns true if operand is currently in regs */
196 /*-----------------------------------------------------------------*/
197 static int isOperandInReg(operand *op)
199 if (!IS_SYMOP(op)) return 0;
200 if (OP_SYMBOL(op)->ruonly) return 1;
201 if (OP_SYMBOL(op)->accuse) return 1;
202 if (OP_SYMBOL(op)->dptr) return 1;
203 return bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(op)->key);
206 /*-----------------------------------------------------------------*/
207 /* computeSpillable - given a point find the spillable live ranges */
208 /*-----------------------------------------------------------------*/
210 computeSpillable (iCode * ic)
214 /* spillable live ranges are those that are live at this
215 point . the following categories need to be subtracted
217 a) - those that are already spilt
218 b) - if being used by this one
219 c) - defined by this one */
221 spillable = bitVectCopy (ic->rlive);
223 bitVectCplAnd (spillable, _G.spiltSet); /* those already spilt */
225 bitVectCplAnd (spillable, ic->uses); /* used in this one */
226 bitVectUnSetBit (spillable, ic->defKey);
227 spillable = bitVectIntersect (spillable, _G.regAssigned);
232 /*-----------------------------------------------------------------*/
233 /* noSpilLoc - return true if a variable has no spil location */
234 /*-----------------------------------------------------------------*/
236 noSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
238 return (sym->usl.spillLoc ? 0 : 1);
241 /*-----------------------------------------------------------------*/
242 /* hasSpilLoc - will return 1 if the symbol has spil location */
243 /*-----------------------------------------------------------------*/
245 hasSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
247 return (sym->usl.spillLoc ? 1 : 0);
250 /*-----------------------------------------------------------------*/
251 /* directSpilLoc - will return 1 if the splilocation is in direct */
252 /*-----------------------------------------------------------------*/
254 directSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
256 if (sym->usl.spillLoc &&
257 (IN_DIRSPACE (SPEC_OCLS (sym->usl.spillLoc->etype))))
263 /*-----------------------------------------------------------------*/
264 /* hasSpilLocnoUptr - will return 1 if the symbol has spil location */
265 /* but is not used as a pointer */
266 /*-----------------------------------------------------------------*/
268 hasSpilLocnoUptr (symbol * sym, eBBlock * ebp, iCode * ic)
270 return ((sym->usl.spillLoc && !sym->uptr) ? 1 : 0);
273 /*-----------------------------------------------------------------*/
274 /* rematable - will return 1 if the remat flag is set */
275 /*-----------------------------------------------------------------*/
277 rematable (symbol * sym, eBBlock * ebp, iCode * ic)
282 /*-----------------------------------------------------------------*/
283 /* notUsedInRemaining - not used or defined in remain of the block */
284 /*-----------------------------------------------------------------*/
286 notUsedInRemaining (symbol * sym, eBBlock * ebp, iCode * ic)
288 return ((usedInRemaining (operandFromSymbol (sym), ic) ? 0 : 1) &&
289 allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq));
292 /*-----------------------------------------------------------------*/
293 /* allLRs - return true for all */
294 /*-----------------------------------------------------------------*/
296 allLRs (symbol * sym, eBBlock * ebp, iCode * ic)
301 /*-----------------------------------------------------------------*/
302 /* liveRangesWith - applies function to a given set of live range */
303 /*-----------------------------------------------------------------*/
305 liveRangesWith (bitVect * lrs, int (func) (symbol *, eBBlock *, iCode *),
306 eBBlock * ebp, iCode * ic)
311 if (!lrs || !lrs->size)
314 for (i = 1; i < lrs->size; i++)
317 if (!bitVectBitValue (lrs, i))
320 /* if we don't find it in the live range
321 hash table we are in serious trouble */
322 if (!(sym = hTabItemWithKey (liveRanges, i)))
324 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
325 "liveRangesWith could not find liveRange");
329 if (func (sym, ebp, ic) && bitVectBitValue (_G.regAssigned, sym->key))
330 addSetHead (&rset, sym);
337 /*-----------------------------------------------------------------*/
338 /* leastUsedLR - given a set determines which is the least used */
339 /*-----------------------------------------------------------------*/
341 leastUsedLR (set * sset)
343 symbol *sym = NULL, *lsym = NULL;
345 sym = lsym = setFirstItem (sset);
350 for (; lsym; lsym = setNextItem (sset))
353 /* if usage is the same then prefer
354 the spill the smaller of the two */
355 if (lsym->used == sym->used)
356 if (getSize (lsym->type) < getSize (sym->type))
360 if (lsym->used < sym->used)
365 setToNull ((void **) &sset);
370 /*-----------------------------------------------------------------*/
371 /* noOverLap - will iterate through the list looking for over lap */
372 /*-----------------------------------------------------------------*/
374 noOverLap (set * itmpStack, symbol * fsym)
378 for (sym = setFirstItem (itmpStack); sym;
379 sym = setNextItem (itmpStack))
381 if (bitVectBitValue(sym->clashes,fsym->key)) return 0;
386 /*-----------------------------------------------------------------*/
387 /* isFree - will return 1 if the a free spil location is found */
388 /*-----------------------------------------------------------------*/
393 V_ARG (symbol **, sloc);
394 V_ARG (symbol *, fsym);
396 /* if already found */
400 /* if it is free && and the itmp assigned to
401 this does not have any overlapping live ranges
402 with the one currently being assigned and
403 the size can be accomodated */
405 noOverLap (sym->usl.itmpStack, fsym) &&
406 getSize (sym->type) >= getSize (fsym->type))
415 /*-----------------------------------------------------------------*/
416 /* spillLRWithPtrReg :- will spil those live ranges which use PTR */
417 /*-----------------------------------------------------------------*/
419 spillLRWithPtrReg (symbol * forSym)
425 if (!_G.regAssigned ||
426 bitVectIsZero (_G.regAssigned))
429 r0 = ds390_regWithIdx (R0_IDX);
430 r1 = ds390_regWithIdx (R1_IDX);
432 /* for all live ranges */
433 for (lrsym = hTabFirstItem (liveRanges, &k); lrsym;
434 lrsym = hTabNextItem (liveRanges, &k))
438 /* if no registers assigned to it or
440 /* if it does not overlap with this then
441 not need to spill it */
443 if (lrsym->isspilt || !lrsym->nRegs ||
444 (lrsym->liveTo < forSym->liveFrom))
447 /* go thru the registers : if it is either
448 r0 or r1 then spil it */
449 for (j = 0; j < lrsym->nRegs; j++)
450 if (lrsym->regs[j] == r0 ||
451 lrsym->regs[j] == r1)
460 /*-----------------------------------------------------------------*/
461 /* createStackSpil - create a location on the stack to spil */
462 /*-----------------------------------------------------------------*/
464 createStackSpil (symbol * sym)
467 int useXstack, model, noOverlay;
471 /* first go try and find a free one that is already
472 existing on the stack */
473 if (applyToSet (_G.stackSpil, isFree, &sloc, sym))
475 /* found a free one : just update & return */
476 sym->usl.spillLoc = sloc;
479 addSetHead (&sloc->usl.itmpStack, sym);
483 /* could not then have to create one , this is the hard part
484 we need to allocate this on the stack : this is really a
485 hack!! but cannot think of anything better at this time */
487 if (sprintf (slocBuffer, "sloc%d", _G.slocNum++) >= sizeof (slocBuffer))
489 fprintf (stderr, "***Internal error: slocBuffer overflowed: %s:%d\n",
494 sloc = newiTemp (slocBuffer);
496 /* set the type to the spilling symbol */
497 sloc->type = copyLinkChain (sym->type);
498 sloc->etype = getSpec (sloc->type);
499 if (options.model == MODEL_SMALL) {
500 SPEC_SCLS (sloc->etype) = S_DATA;
502 SPEC_SCLS (sloc->etype) = S_XDATA;
504 SPEC_EXTR (sloc->etype) = 0;
505 SPEC_STAT (sloc->etype) = 0;
506 SPEC_VOLATILE(sloc->etype) = 0;
507 SPEC_ABSA(sloc->etype) = 0;
509 /* we don't allow it to be allocated`
510 onto the external stack since : so we
511 temporarily turn it off ; we also
512 turn off memory model to prevent
513 the spil from going to the external storage
514 and turn off overlaying
517 useXstack = options.useXstack;
518 model = options.model;
519 noOverlay = options.noOverlay;
520 options.noOverlay = 1;
522 /* options.model = options.useXstack = 0; */
526 options.useXstack = useXstack;
527 options.model = model;
528 options.noOverlay = noOverlay;
529 sloc->isref = 1; /* to prevent compiler warning */
531 /* if it is on the stack then update the stack */
532 if (IN_STACK (sloc->etype))
534 currFunc->stack += getSize (sloc->type);
535 _G.stackExtend += getSize (sloc->type);
538 _G.dataExtend += getSize (sloc->type);
540 /* add it to the _G.stackSpil set */
541 addSetHead (&_G.stackSpil, sloc);
542 sym->usl.spillLoc = sloc;
545 /* add it to the set of itempStack set
546 of the spill location */
547 addSetHead (&sloc->usl.itmpStack, sym);
551 /*-----------------------------------------------------------------*/
552 /* isSpiltOnStack - returns true if the spil location is on stack */
553 /*-----------------------------------------------------------------*/
555 isSpiltOnStack (symbol * sym)
565 /* if (sym->_G.stackSpil) */
568 if (!sym->usl.spillLoc)
571 etype = getSpec (sym->usl.spillLoc->type);
572 if (IN_STACK (etype))
578 /*-----------------------------------------------------------------*/
579 /* spillThis - spils a specific operand */
580 /*-----------------------------------------------------------------*/
582 spillThis (symbol * sym)
585 /* if this is rematerializable or has a spillLocation
586 we are okay, else we need to create a spillLocation
588 if (!(sym->remat || sym->usl.spillLoc))
589 createStackSpil (sym);
592 /* mark it has spilt & put it in the spilt set */
593 sym->isspilt = sym->spillA = 1;
594 _G.spiltSet = bitVectSetBit (_G.spiltSet, sym->key);
596 bitVectUnSetBit (_G.regAssigned, sym->key);
597 bitVectUnSetBit (_G.totRegAssigned, sym->key);
599 for (i = 0; i < sym->nRegs; i++)
603 freeReg (sym->regs[i]);
607 /* if spilt on stack then free up r0 & r1
608 if they could have been assigned to some
610 if (!ds390_ptrRegReq && isSpiltOnStack (sym))
612 ds390_ptrRegReq += !options.stack10bit;
613 spillLRWithPtrReg (sym);
616 if (sym->usl.spillLoc && !sym->remat)
617 sym->usl.spillLoc->allocreq++;
621 /*-----------------------------------------------------------------*/
622 /* selectSpil - select a iTemp to spil : rather a simple procedure */
623 /*-----------------------------------------------------------------*/
625 selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym)
627 bitVect *lrcs = NULL;
631 /* get the spillable live ranges */
632 lrcs = computeSpillable (ic);
634 /* get all live ranges that are rematerizable */
635 if ((selectS = liveRangesWith (lrcs, rematable, ebp, ic)))
638 /* return the least used of these */
639 return leastUsedLR (selectS);
642 /* get live ranges with spillLocations in direct space */
643 if ((selectS = liveRangesWith (lrcs, directSpilLoc, ebp, ic)))
645 sym = leastUsedLR (selectS);
646 strcpy (sym->rname, (sym->usl.spillLoc->rname[0] ?
647 sym->usl.spillLoc->rname :
648 sym->usl.spillLoc->name));
650 /* mark it as allocation required */
651 sym->usl.spillLoc->allocreq++;
655 /* if the symbol is local to the block then */
656 if (forSym->liveTo < ebp->lSeq)
659 /* check if there are any live ranges allocated
660 to registers that are not used in this block */
661 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInBlock, ebp, ic)))
663 sym = leastUsedLR (selectS);
664 /* if this is not rematerializable */
673 /* check if there are any live ranges that not
674 used in the remainder of the block */
675 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic)))
677 sym = leastUsedLR (selectS);
690 /* find live ranges with spillocation && not used as pointers */
691 if ((selectS = liveRangesWith (lrcs, hasSpilLocnoUptr, ebp, ic)))
694 sym = leastUsedLR (selectS);
695 /* mark this as allocation required */
696 sym->usl.spillLoc->allocreq++;
700 /* find live ranges with spillocation */
701 if ((selectS = liveRangesWith (lrcs, hasSpilLoc, ebp, ic)))
704 sym = leastUsedLR (selectS);
705 sym->usl.spillLoc->allocreq++;
709 /* couldn't find then we need to create a spil
710 location on the stack , for which one? the least
712 if ((selectS = liveRangesWith (lrcs, noSpilLoc, ebp, ic)))
715 /* return a created spil location */
716 sym = createStackSpil (leastUsedLR (selectS));
717 sym->usl.spillLoc->allocreq++;
721 /* this is an extreme situation we will spill
722 this one : happens very rarely but it does happen */
728 /*-----------------------------------------------------------------*/
729 /* spilSomething - spil some variable & mark registers as free */
730 /*-----------------------------------------------------------------*/
732 spilSomething (iCode * ic, eBBlock * ebp, symbol * forSym)
737 /* get something we can spil */
738 ssym = selectSpil (ic, ebp, forSym);
740 /* mark it as spilt */
741 ssym->isspilt = ssym->spillA = 1;
742 _G.spiltSet = bitVectSetBit (_G.spiltSet, ssym->key);
744 /* mark it as not register assigned &
745 take it away from the set */
746 bitVectUnSetBit (_G.regAssigned, ssym->key);
747 bitVectUnSetBit (_G.totRegAssigned, ssym->key);
749 /* mark the registers as free */
750 for (i = 0; i < ssym->nRegs; i++)
752 freeReg (ssym->regs[i]);
754 /* if spilt on stack then free up r0 & r1
755 if they could have been assigned to as gprs */
756 if (!ds390_ptrRegReq && isSpiltOnStack (ssym) && !options.stack10bit)
759 spillLRWithPtrReg (ssym);
762 /* if this was a block level spil then insert push & pop
763 at the start & end of block respectively */
766 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
767 /* add push to the start of the block */
768 addiCodeToeBBlock (ebp, nic, (ebp->sch->op == LABEL ?
769 ebp->sch->next : ebp->sch));
770 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
771 /* add pop to the end of the block */
772 addiCodeToeBBlock (ebp, nic, NULL);
775 /* if spilt because not used in the remainder of the
776 block then add a push before this instruction and
777 a pop at the end of the block */
778 if (ssym->remainSpil)
781 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
782 /* add push just before this instruction */
783 addiCodeToeBBlock (ebp, nic, ic);
785 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
786 /* add pop to the end of the block */
787 addiCodeToeBBlock (ebp, nic, NULL);
796 /*-----------------------------------------------------------------*/
797 /* getRegPtr - will try for PTR if not a GPR type if not spil */
798 /*-----------------------------------------------------------------*/
800 getRegPtr (iCode * ic, eBBlock * ebp, symbol * sym)
805 /* try for a ptr type */
806 if ((reg = allocReg (REG_PTR)))
809 /* try for gpr type */
810 if ((reg = allocReg (REG_GPR)))
813 /* we have to spil */
814 if (!spilSomething (ic, ebp, sym))
817 /* this looks like an infinite loop but
818 in really selectSpil will abort */
822 /*-----------------------------------------------------------------*/
823 /* getRegGpr - will try for GPR if not spil */
824 /*-----------------------------------------------------------------*/
826 getRegGpr (iCode * ic, eBBlock * ebp, symbol * sym)
831 /* try for gpr type */
832 if ((reg = allocReg (REG_GPR)))
835 if (!ds390_ptrRegReq)
836 if ((reg = allocReg (REG_PTR)))
839 /* we have to spil */
840 if (!spilSomething (ic, ebp, sym))
843 /* this looks like an infinite loop but
844 in really selectSpil will abort */
848 /*-----------------------------------------------------------------*/
849 /* getRegPtrNoSpil - get it cannot split */
850 /*-----------------------------------------------------------------*/
851 static regs *getRegPtrNoSpil()
855 /* try for a ptr type */
856 if ((reg = allocReg (REG_PTR)))
859 /* try for gpr type */
860 if ((reg = allocReg (REG_GPR)))
865 /* just to make the compiler happy */
869 /*-----------------------------------------------------------------*/
870 /* getRegGprNoSpil - get it cannot split */
871 /*-----------------------------------------------------------------*/
872 static regs *getRegGprNoSpil()
876 if ((reg = allocReg (REG_GPR)))
879 if (!ds390_ptrRegReq)
880 if ((reg = allocReg (REG_PTR)))
885 /* just to make the compiler happy */
889 /*-----------------------------------------------------------------*/
890 /* symHasReg - symbol has a given register */
891 /*-----------------------------------------------------------------*/
893 symHasReg (symbol * sym, regs * reg)
897 for (i = 0; i < sym->nRegs; i++)
898 if (sym->regs[i] == reg)
904 /*-----------------------------------------------------------------*/
905 /* deassignLRs - check the live to and if they have registers & are */
906 /* not spilt then free up the registers */
907 /*-----------------------------------------------------------------*/
909 deassignLRs (iCode * ic, eBBlock * ebp)
915 for (sym = hTabFirstItem (liveRanges, &k); sym;
916 sym = hTabNextItem (liveRanges, &k))
920 /* if it does not end here */
921 if (sym->liveTo > ic->seq)
924 /* if it was spilt on stack then we can
925 mark the stack spil location as free */
930 sym->usl.spillLoc->isFree = 1;
936 if (!bitVectBitValue (_G.regAssigned, sym->key))
939 /* special case check if this is an IFX &
940 the privious one was a pop and the
941 previous one was not spilt then keep track
943 if (ic->op == IFX && ic->prev &&
944 ic->prev->op == IPOP &&
945 !ic->prev->parmPush &&
946 !OP_SYMBOL (IC_LEFT (ic->prev))->isspilt)
947 psym = OP_SYMBOL (IC_LEFT (ic->prev));
953 bitVectUnSetBit (_G.regAssigned, sym->key);
955 /* if the result of this one needs registers
956 and does not have it then assign it right
958 if (IC_RESULT (ic) &&
959 !(SKIP_IC2 (ic) || /* not a special icode */
960 ic->op == JUMPTABLE ||
966 (result = OP_SYMBOL (IC_RESULT (ic))) && /* has a result */
967 result->liveTo > ic->seq && /* and will live beyond this */
968 result->liveTo <= ebp->lSeq && /* does not go beyond this block */
969 result->regType == sym->regType && /* same register types */
970 result->nRegs && /* which needs registers */
971 !result->isspilt && /* and does not already have them */
973 !bitVectBitValue (_G.regAssigned, result->key) &&
974 /* the number of free regs + number of regs in this LR
975 can accomodate the what result Needs */
976 ((nfreeRegsType (result->regType) +
977 sym->nRegs) >= result->nRegs)
981 for (i = 0; i < result->nRegs; i++)
983 result->regs[i] = sym->regs[i];
985 result->regs[i] = getRegGpr (ic, ebp, result);
987 _G.regAssigned = bitVectSetBit (_G.regAssigned, result->key);
988 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, result->key);
992 /* free the remaining */
993 for (; i < sym->nRegs; i++)
997 if (!symHasReg (psym, sym->regs[i]))
998 freeReg (sym->regs[i]);
1001 freeReg (sym->regs[i]);
1008 /*-----------------------------------------------------------------*/
1009 /* reassignLR - reassign this to registers */
1010 /*-----------------------------------------------------------------*/
1012 reassignLR (operand * op)
1014 symbol *sym = OP_SYMBOL (op);
1017 /* not spilt any more */
1018 sym->isspilt = sym->spillA = sym->blockSpil = sym->remainSpil = 0;
1019 bitVectUnSetBit (_G.spiltSet, sym->key);
1021 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1022 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1026 for (i = 0; i < sym->nRegs; i++)
1027 sym->regs[i]->isFree = 0;
1030 /*-----------------------------------------------------------------*/
1031 /* willCauseSpill - determines if allocating will cause a spill */
1032 /*-----------------------------------------------------------------*/
1034 willCauseSpill (int nr, int rt)
1036 /* first check if there are any avlb registers
1037 of te type required */
1040 /* special case for pointer type
1041 if pointer type not avlb then
1042 check for type gpr */
1043 if (nFreeRegs (rt) >= nr)
1045 if (nFreeRegs (REG_GPR) >= nr)
1050 if (ds390_ptrRegReq)
1052 if (nFreeRegs (rt) >= nr)
1057 if (nFreeRegs (REG_PTR) +
1058 nFreeRegs (REG_GPR) >= nr)
1063 /* it will cause a spil */
1067 /*-----------------------------------------------------------------*/
1068 /* positionRegs - the allocator can allocate same registers to res- */
1069 /* ult and operand, if this happens make sure they are in the same */
1070 /* position as the operand otherwise chaos results */
1071 /*-----------------------------------------------------------------*/
1073 positionRegs (symbol * result, symbol * opsym)
1075 int count = min (result->nRegs, opsym->nRegs);
1076 int i, j = 0, shared = 0;
1079 /* if the result has been spilt then cannot share */
1084 /* first make sure that they actually share */
1085 for (i = 0; i < count; i++)
1087 for (j = 0; j < count; j++)
1089 if (result->regs[i] == opsym->regs[j] && i != j)
1099 regs *tmp = result->regs[i];
1100 result->regs[i] = result->regs[j];
1101 result->regs[j] = tmp;
1108 /*-----------------------------------------------------------------*/
1109 /* unusedLRS - returns a bitVector of liveranges not used in 'ebp' */
1110 /*-----------------------------------------------------------------*/
1111 bitVect *unusedLRs (eBBlock *ebp)
1113 bitVect *ret = NULL;
1117 if (!ebp) return NULL;
1118 for (sym = hTabFirstItem(liveRanges,&key); sym ;
1119 sym = hTabNextItem(liveRanges,&key)) {
1121 if (notUsedInBlock(sym,ebp,NULL)) {
1122 ret = bitVectSetBit(ret,sym->key);
1129 /*-----------------------------------------------------------------*/
1130 /* deassignUnsedLRs - if this baisc block ends in a return then */
1131 /* deassign symbols not used in this block */
1132 /*-----------------------------------------------------------------*/
1133 bitVect *deassignUnsedLRs(eBBlock *ebp)
1135 bitVect *unused = NULL;
1138 switch (returnAtEnd(ebp)) {
1139 case 2: /* successor block ends in a return */
1140 unused = unusedLRs((eBBlock *) setFirstItem(ebp->succList));
1142 case 1: /* this block ends in a return */
1143 unused = bitVectIntersect(unused,unusedLRs(ebp));
1148 for (i = 0 ; i < unused->size ; i++ ) {
1151 if (bitVectBitValue(unused,i)) {
1153 /* if assigned to registers */
1154 if (bitVectBitValue(_G.regAssigned,i)) {
1158 sym = hTabItemWithKey(liveRanges,i);
1159 /* remove it from regassigned & mark the
1161 bitVectUnSetBit(_G.regAssigned,i);
1162 for (j = 0 ; j < sym->nRegs; j++)
1163 freeReg(sym->regs[j]);
1165 /* not assigned to registers : remove from set*/
1166 bitVectUnSetBit(unused,i);
1174 /*-----------------------------------------------------------------*/
1175 /* reassignUnusedLRs - put registers to unused Live ranges */
1176 /*-----------------------------------------------------------------*/
1177 void reassignUnusedLRs (bitVect *unused)
1180 if (!unused) return ;
1182 for (i = 0 ; i < unused->size ; i++ ) {
1183 /* if unused : means it was assigned to registers before */
1184 if (bitVectBitValue(unused,i)) {
1188 /* put it back into reg set*/
1189 bitVectSetBit(_G.regAssigned,i) ;
1191 sym = hTabItemWithKey(liveRanges,i);
1192 /* makr registers busy */
1193 for (j = 0 ; j < sym->nRegs; j++)
1194 sym->regs[j]->isFree = 0;
1199 /*-----------------------------------------------------------------*/
1200 /* serialRegAssign - serially allocate registers to the variables */
1201 /*-----------------------------------------------------------------*/
1203 serialRegAssign (eBBlock ** ebbs, int count)
1207 /* for all blocks */
1208 for (i = 0; i < count; i++)
1212 bitVect *unusedLRs = NULL;
1214 if (ebbs[i]->noPath &&
1215 (ebbs[i]->entryLabel != entryLabel &&
1216 ebbs[i]->entryLabel != returnLabel))
1219 unusedLRs = deassignUnsedLRs(ebbs[i]);
1221 /* of all instructions do */
1222 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1225 /* if this is an ipop that means some live
1226 range will have to be assigned again */
1228 reassignLR (IC_LEFT (ic));
1230 /* if result is present && is a true symbol */
1231 if (IC_RESULT (ic) && ic->op != IFX &&
1232 IS_TRUE_SYMOP (IC_RESULT (ic)))
1233 OP_SYMBOL (IC_RESULT (ic))->allocreq++;
1235 /* take away registers from live
1236 ranges that end at this instruction */
1237 deassignLRs (ic, ebbs[i]);
1239 /* some don't need registers */
1240 if (SKIP_IC2 (ic) ||
1241 ic->op == JUMPTABLE ||
1245 (IC_RESULT (ic) && POINTER_SET (ic)))
1248 /* now we need to allocate registers
1249 only for the result */
1252 symbol *sym = OP_SYMBOL (IC_RESULT (ic));
1258 /* if it does not need or is spilt
1259 or is already assigned to registers
1260 or will not live beyond this instructions */
1263 bitVectBitValue (_G.regAssigned, sym->key) ||
1264 sym->liveTo <= ic->seq)
1267 /* if some liverange has been spilt at the block level
1268 and this one live beyond this block then spil this
1270 if (_G.blockSpil && sym->liveTo > ebbs[i]->lSeq)
1275 /* if trying to allocate this will cause
1276 a spill and there is nothing to spill
1277 or this one is rematerializable then
1279 willCS = willCauseSpill (sym->nRegs, sym->regType);
1280 spillable = computeSpillable (ic);
1282 (willCS && bitVectIsZero (spillable)))
1290 /* if it has a spillocation & is used less than
1291 all other live ranges then spill this */
1293 if (sym->usl.spillLoc) {
1294 symbol *leastUsed = leastUsedLR (liveRangesWith (spillable,
1295 allLRs, ebbs[i], ic));
1296 if (leastUsed && leastUsed->used > sym->used) {
1301 /* if none of the liveRanges have a spillLocation then better
1302 to spill this one than anything else already assigned to registers */
1303 if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) {
1304 /* if this is local to this block then we might find a block spil */
1305 if (!(sym->liveFrom >= ebbs[i]->fSeq && sym->liveTo <= ebbs[i]->lSeq)) {
1313 /* if we need ptr regs for the right side
1315 if (POINTER_GET (ic) && IS_SYMOP (IC_LEFT (ic))
1316 && getSize (OP_SYMBOL (IC_LEFT (ic))->type)
1317 <= (unsigned) PTRSIZE)
1322 /* else we assign registers to it */
1323 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1324 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1326 for (j = 0; j < sym->nRegs; j++)
1328 if (sym->regType == REG_PTR)
1329 sym->regs[j] = getRegPtr (ic, ebbs[i], sym);
1331 sym->regs[j] = getRegGpr (ic, ebbs[i], sym);
1333 /* if the allocation falied which means
1334 this was spilt then break */
1338 /* if it shares registers with operands make sure
1339 that they are in the same position */
1340 if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic)) &&
1341 OP_SYMBOL (IC_LEFT (ic))->nRegs && ic->op != '=')
1342 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1343 OP_SYMBOL (IC_LEFT (ic)));
1344 /* do the same for the right operand */
1345 if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)) &&
1346 OP_SYMBOL (IC_RIGHT (ic))->nRegs)
1347 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1348 OP_SYMBOL (IC_RIGHT (ic)));
1358 reassignUnusedLRs(unusedLRs);
1362 /*-----------------------------------------------------------------*/
1363 /* fillGaps - Try to fill in the Gaps left by Pass1 */
1364 /*-----------------------------------------------------------------*/
1365 static void fillGaps()
1369 int loop = 0, change;
1371 if (getenv("DISABLE_FILL_GAPS")) return;
1373 /* First try to do DPTRuse once more since now we know what got into
1376 while (loop++ < 10) {
1379 for (sym = hTabFirstItem(liveRanges,&key) ; sym ;
1380 sym = hTabNextItem(liveRanges,&key)) {
1381 int size = getSize(sym->type);
1383 if (sym->liveFrom == sym->liveTo) continue;
1385 if (sym->uptr && sym->dptr==0 && !sym->ruonly &&
1386 size < 4 && size > 1) {
1388 if (packRegsDPTRuse(operandFromSymbol(sym))) {
1390 /* if this was ssigned to registers then */
1391 if (bitVectBitValue(_G.totRegAssigned,sym->key)) {
1392 /* take it out of the register assigned set */
1393 bitVectUnSetBit(_G.totRegAssigned,sym->key);
1394 } else if (sym->usl.spillLoc) {
1395 sym->usl.spillLoc->allocreq--;
1396 sym->usl.spillLoc = NULL;
1400 sym->isspilt = sym->spillA = 0;
1404 /* try assigning other dptrs */
1405 if (sym->dptr == 0 && packRegsDPTRnuse(operandFromSymbol(sym),1) && !getenv("DPTRnDISABLE")) {
1406 /* if this was ssigned to registers then */
1407 if (bitVectBitValue(_G.totRegAssigned,sym->key)) {
1408 /* take it out of the register assigned set */
1409 bitVectUnSetBit(_G.totRegAssigned,sym->key);
1410 } else if (sym->usl.spillLoc) {
1411 sym->usl.spillLoc->allocreq--;
1412 sym->usl.spillLoc = NULL;
1415 sym->isspilt = sym->spillA = 0;
1420 /* look for livernages that was spilt by the allocator */
1421 for (sym = hTabFirstItem(liveRanges,&key) ; sym ;
1422 sym = hTabNextItem(liveRanges,&key)) {
1427 if (!sym->spillA || !sym->clashes || sym->remat) continue ;
1428 if (!sym->uses || !sym->defs) continue ;
1429 /* find the liveRanges this one clashes with, that are
1430 still assigned to registers & mark the registers as used*/
1431 for ( i = 0 ; i < sym->clashes->size ; i ++) {
1435 if (bitVectBitValue(sym->clashes,i) == 0 || /* those that clash with this */
1436 bitVectBitValue(_G.totRegAssigned,i) == 0) /* and are still assigned to registers */
1439 assert (clr = hTabItemWithKey(liveRanges,i));
1441 /* mark these registers as used */
1442 for (k = 0 ; k < clr->nRegs ; k++ )
1443 useReg(clr->regs[k]);
1446 if (willCauseSpill(sym->nRegs,sym->regType)) {
1447 /* NOPE :( clear all registers & and continue */
1452 /* THERE IS HOPE !!!! */
1453 for (i=0; i < sym->nRegs ; i++ ) {
1454 if (sym->regType == REG_PTR)
1455 sym->regs[i] = getRegPtrNoSpil ();
1457 sym->regs[i] = getRegGprNoSpil ();
1460 /* for all its definitions & uses check if the registers
1461 allocated needs positioning NOTE: we can position
1462 only ONCE if more than One positioning required
1465 for (i = 0 ; i < sym->defs->size ; i++ ) {
1466 if (bitVectBitValue(sym->defs,i)) {
1468 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1469 if (SKIP_IC(ic)) continue;
1470 assert(isSymbolEqual(sym,OP_SYMBOL(IC_RESULT(ic)))); /* just making sure */
1471 /* if left is assigned to registers */
1472 if (IS_SYMOP(IC_LEFT(ic)) &&
1473 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_LEFT(ic))->key)) {
1474 pdone += positionRegs(sym,OP_SYMBOL(IC_LEFT(ic)));
1476 if (IS_SYMOP(IC_RIGHT(ic)) &&
1477 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RIGHT(ic))->key)) {
1478 pdone += positionRegs(sym,OP_SYMBOL(IC_RIGHT(ic)));
1480 if (pdone > 1) break;
1483 for (i = 0 ; i < sym->uses->size ; i++ ) {
1484 if (bitVectBitValue(sym->uses,i)) {
1486 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1487 if (SKIP_IC(ic)) continue;
1488 if (!IS_ASSIGN_ICODE(ic)) continue ;
1490 /* if result is assigned to registers */
1491 if (IS_SYMOP(IC_RESULT(ic)) &&
1492 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) {
1493 pdone += positionRegs(sym,OP_SYMBOL(IC_RESULT(ic)));
1495 if (pdone > 1) break;
1498 /* had to position more than once GIVE UP */
1500 /* UNDO all the changes we made to try this */
1502 for (i=0; i < sym->nRegs ; i++ ) {
1503 sym->regs[i] = NULL;
1506 D (fprintf (stderr, "Fill Gap gave up due to positioning for "
1507 "%s in function %s\n",
1508 sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1511 D (fprintf (stderr, "FILLED GAP for %s in function %s\n",
1512 sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1513 _G.totRegAssigned = bitVectSetBit(_G.totRegAssigned,sym->key);
1514 sym->isspilt = sym->spillA = 0 ;
1515 sym->usl.spillLoc->allocreq--;
1516 sym->usl.spillLoc = NULL;
1524 /*-----------------------------------------------------------------*/
1525 /* rUmaskForOp :- returns register mask for an operand */
1526 /*-----------------------------------------------------------------*/
1528 ds390_rUmaskForOp (operand * op)
1534 /* only temporaries are assigned registers */
1538 sym = OP_SYMBOL (op);
1540 /* if spilt or no registers assigned to it
1542 if (sym->isspilt || !sym->nRegs)
1545 rumask = newBitVect (ds390_nRegs);
1547 for (j = 0; j < sym->nRegs; j++)
1549 rumask = bitVectSetBit (rumask,
1550 sym->regs[j]->rIdx);
1556 /*-----------------------------------------------------------------*/
1557 /* regsUsedIniCode :- returns bit vector of registers used in iCode */
1558 /*-----------------------------------------------------------------*/
1560 regsUsedIniCode (iCode * ic)
1562 bitVect *rmask = newBitVect (ds390_nRegs);
1564 /* do the special cases first */
1567 rmask = bitVectUnion (rmask,
1568 ds390_rUmaskForOp (IC_COND (ic)));
1572 /* for the jumptable */
1573 if (ic->op == JUMPTABLE)
1575 rmask = bitVectUnion (rmask,
1576 ds390_rUmaskForOp (IC_JTCOND (ic)));
1581 /* of all other cases */
1583 rmask = bitVectUnion (rmask,
1584 ds390_rUmaskForOp (IC_LEFT (ic)));
1588 rmask = bitVectUnion (rmask,
1589 ds390_rUmaskForOp (IC_RIGHT (ic)));
1592 rmask = bitVectUnion (rmask,
1593 ds390_rUmaskForOp (IC_RESULT (ic)));
1599 /*-----------------------------------------------------------------*/
1600 /* createRegMask - for each instruction will determine the regsUsed */
1601 /*-----------------------------------------------------------------*/
1603 createRegMask (eBBlock ** ebbs, int count)
1607 /* for all blocks */
1608 for (i = 0; i < count; i++)
1612 if (ebbs[i]->noPath &&
1613 (ebbs[i]->entryLabel != entryLabel &&
1614 ebbs[i]->entryLabel != returnLabel))
1617 /* for all instructions */
1618 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1623 if (SKIP_IC2 (ic) || !ic->rlive)
1626 /* first mark the registers used in this
1628 ic->rUsed = regsUsedIniCode (ic);
1629 _G.funcrUsed = bitVectUnion (_G.funcrUsed, ic->rUsed);
1631 /* now create the register mask for those
1632 registers that are in use : this is a
1633 super set of ic->rUsed */
1634 ic->rMask = newBitVect (ds390_nRegs + 1);
1636 /* for all live Ranges alive at this point */
1637 for (j = 1; j < ic->rlive->size; j++)
1642 /* if not alive then continue */
1643 if (!bitVectBitValue (ic->rlive, j))
1646 /* find the live range we are interested in */
1647 if (!(sym = hTabItemWithKey (liveRanges, j)))
1649 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
1650 "createRegMask cannot find live range");
1654 /* special case for ruonly */
1655 if (sym->ruonly && sym->liveFrom != sym->liveTo) {
1656 int size = getSize(sym->type);
1658 for (k = 0 ; k < size; k++ )
1659 ic->rMask = bitVectSetBit (ic->rMask, j++);
1662 /* if no register assigned to it */
1663 if (!sym->nRegs || sym->isspilt)
1666 /* for all the registers allocated to it */
1667 for (k = 0; k < sym->nRegs; k++)
1670 bitVectSetBit (ic->rMask, sym->regs[k]->rIdx);
1676 /*-----------------------------------------------------------------*/
1677 /* rematStr - returns the rematerialized string for a remat var */
1678 /*-----------------------------------------------------------------*/
1680 rematStr (symbol * sym)
1683 iCode *ic = sym->rematiCode;
1688 /* if plus or minus print the right hand side */
1689 if (ic->op == '+' || ic->op == '-')
1691 sprintf (s, "0x%04x %c ", (int) operandLitValue (IC_RIGHT (ic)),
1694 ic = OP_SYMBOL (IC_LEFT (ic))->rematiCode;
1697 /* cast then continue */
1698 if (IS_CAST_ICODE(ic)) {
1699 ic = OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
1702 /* we reached the end */
1703 sprintf (s, "%s", OP_SYMBOL (IC_LEFT (ic))->rname);
1710 /*-----------------------------------------------------------------*/
1711 /* regTypeNum - computes the type & number of registers required */
1712 /*-----------------------------------------------------------------*/
1720 /* for each live range do */
1721 for (sym = hTabFirstItem (liveRanges, &k); sym;
1722 sym = hTabNextItem (liveRanges, &k))
1725 /* if used zero times then no registers needed */
1726 if ((sym->liveTo - sym->liveFrom) == 0)
1730 /* if the live range is a temporary */
1734 /* if the type is marked as a conditional */
1735 if (sym->regType == REG_CND)
1738 /* if used in return only then we don't
1740 if (sym->ruonly || sym->accuse)
1742 if (IS_AGGREGATE (sym->type) || sym->isptr)
1743 sym->type = aggrToPtr (sym->type, FALSE);
1747 /* if the symbol has only one definition &
1748 that definition is a get_pointer */
1749 if (bitVectnBitsOn (sym->defs) == 1 &&
1750 (ic = hTabItemWithKey (iCodehTab,
1751 bitVectFirstBit (sym->defs))) &&
1754 !IS_BITVAR (sym->etype))
1756 /* and that pointer is remat in data space */
1757 if (OP_SYMBOL (IC_LEFT (ic))->remat &&
1758 !IS_CAST_ICODE(OP_SYMBOL (IC_LEFT (ic))->rematiCode) &&
1759 DCL_TYPE (aggrToPtr (operandType(IC_LEFT(ic)), FALSE)) == POINTER)
1762 /* create a psuedo symbol & force a spil */
1763 symbol *psym = newSymbol (rematStr (OP_SYMBOL (IC_LEFT (ic))), 1);
1764 psym->type = sym->type;
1765 psym->etype = sym->etype;
1766 strcpy (psym->rname, psym->name);
1768 sym->usl.spillLoc = psym;
1772 /* if in data space or idata space then try to
1773 allocate pointer register */
1777 /* if not then we require registers */
1778 sym->nRegs = ((IS_AGGREGATE (sym->type) || sym->isptr) ?
1779 getSize (sym->type = aggrToPtr (sym->type, FALSE)) :
1780 getSize (sym->type));
1784 fprintf (stderr, "allocated more than 4 or 0 registers for type ");
1785 printTypeChain (sym->type, stderr);
1786 fprintf (stderr, "\n");
1789 /* determine the type of register required */
1790 if (sym->nRegs == 1 &&
1791 IS_PTR (sym->type) &&
1793 sym->regType = REG_PTR;
1795 sym->regType = REG_GPR;
1799 /* for the first run we don't provide */
1800 /* registers for true symbols we will */
1801 /* see how things go */
1807 /*-----------------------------------------------------------------*/
1808 /* freeAllRegs - mark all registers as free */
1809 /*-----------------------------------------------------------------*/
1815 for (i = 0; i < ds390_nRegs; i++)
1816 regs390[i].isFree = 1;
1819 /*-----------------------------------------------------------------*/
1820 /* deallocStackSpil - this will set the stack pointer back */
1821 /*-----------------------------------------------------------------*/
1823 DEFSETFUNC (deallocStackSpil)
1831 /*-----------------------------------------------------------------*/
1832 /* farSpacePackable - returns the packable icode for far variables */
1833 /*-----------------------------------------------------------------*/
1835 farSpacePackable (iCode * ic)
1839 /* go thru till we find a definition for the
1840 symbol on the right */
1841 for (dic = ic->prev; dic; dic = dic->prev)
1844 /* if the definition is a call then no */
1845 if ((dic->op == CALL || dic->op == PCALL) &&
1846 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1851 /* if shift by unknown amount then not */
1852 if ((dic->op == LEFT_OP || dic->op == RIGHT_OP) &&
1853 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1856 /* if pointer get and size > 1 */
1857 if (POINTER_GET (dic) &&
1858 getSize (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)) > 1)
1861 if (POINTER_SET (dic) &&
1862 getSize (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)) > 1)
1865 /* if any three is a true symbol in far space */
1866 if (IC_RESULT (dic) &&
1867 IS_TRUE_SYMOP (IC_RESULT (dic)) &&
1868 isOperandInFarSpace (IC_RESULT (dic)))
1871 if (IC_RIGHT (dic) &&
1872 IS_TRUE_SYMOP (IC_RIGHT (dic)) &&
1873 isOperandInFarSpace (IC_RIGHT (dic)) &&
1874 !isOperandEqual (IC_RIGHT (dic), IC_RESULT (ic)))
1877 if (IC_LEFT (dic) &&
1878 IS_TRUE_SYMOP (IC_LEFT (dic)) &&
1879 isOperandInFarSpace (IC_LEFT (dic)) &&
1880 !isOperandEqual (IC_LEFT (dic), IC_RESULT (ic)))
1883 if (isOperandEqual (IC_RIGHT (ic), IC_RESULT (dic)))
1885 if ((dic->op == LEFT_OP ||
1886 dic->op == RIGHT_OP ||
1888 IS_OP_LITERAL (IC_RIGHT (dic)))
1898 /*-----------------------------------------------------------------*/
1899 /* packRegsForAssign - register reduction for assignment */
1900 /*-----------------------------------------------------------------*/
1902 packRegsForAssign (iCode * ic, eBBlock * ebp)
1906 if (!IS_ITEMP (IC_RIGHT (ic)) ||
1907 OP_SYMBOL (IC_RIGHT (ic))->isind ||
1908 OP_LIVETO (IC_RIGHT (ic)) > ic->seq)
1913 /* if the true symbol is defined in far space or on stack
1914 then we should not since this will increase register pressure */
1916 if (isOperandInFarSpace (IC_RESULT (ic)))
1918 if ((dic = farSpacePackable (ic)))
1924 if (isOperandInFarSpace(IC_RESULT(ic)) && !farSpacePackable(ic)) {
1929 /* find the definition of iTempNN scanning backwards if we find a
1930 a use of the true symbol in before we find the definition then
1932 for (dic = ic->prev; dic; dic = dic->prev)
1934 /* if there is a function call then don't pack it */
1935 if ((dic->op == CALL || dic->op == PCALL))
1944 if (IS_TRUE_SYMOP (IC_RESULT (dic)) &&
1945 IS_OP_VOLATILE (IC_RESULT (dic)))
1951 if (IS_SYMOP (IC_RESULT (dic)) &&
1952 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1954 if (POINTER_SET (dic))
1960 if (IS_SYMOP (IC_RIGHT (dic)) &&
1961 (IC_RIGHT (dic)->key == IC_RESULT (ic)->key ||
1962 IC_RIGHT (dic)->key == IC_RIGHT (ic)->key))
1968 if (IS_SYMOP (IC_LEFT (dic)) &&
1969 (IC_LEFT (dic)->key == IC_RESULT (ic)->key ||
1970 IC_LEFT (dic)->key == IC_RIGHT (ic)->key))
1976 if (POINTER_SET (dic) &&
1977 IC_RESULT (dic)->key == IC_RESULT (ic)->key)
1985 return 0; /* did not find */
1987 /* if the result is on stack or iaccess then it must be
1988 the same atleast one of the operands */
1989 if (OP_SYMBOL (IC_RESULT (ic))->onStack ||
1990 OP_SYMBOL (IC_RESULT (ic))->iaccess)
1993 /* the operation has only one symbol
1994 operator then we can pack */
1995 if ((IC_LEFT (dic) && !IS_SYMOP (IC_LEFT (dic))) ||
1996 (IC_RIGHT (dic) && !IS_SYMOP (IC_RIGHT (dic))))
1999 if (!((IC_LEFT (dic) &&
2000 IC_RESULT (ic)->key == IC_LEFT (dic)->key) ||
2002 IC_RESULT (ic)->key == IC_RIGHT (dic)->key)))
2006 /* found the definition */
2007 /* replace the result with the result of */
2008 /* this assignment and remove this assignment */
2009 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2011 IC_RESULT (dic) = IC_RESULT (ic);
2013 if (IS_ITEMP (IC_RESULT (dic)) && OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq)
2015 OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq;
2017 /* delete from liverange table also
2018 delete from all the points inbetween and the new
2020 for (sic = dic; sic != ic; sic = sic->next)
2022 bitVectUnSetBit (sic->rlive, IC_RESULT (ic)->key);
2023 if (IS_ITEMP (IC_RESULT (dic)))
2024 bitVectSetBit (sic->rlive, IC_RESULT (dic)->key);
2027 remiCodeFromeBBlock (ebp, ic);
2028 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2029 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
2030 OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
2035 /*-----------------------------------------------------------------*/
2036 /* findAssignToSym : scanning backwards looks for first assig found */
2037 /*-----------------------------------------------------------------*/
2039 findAssignToSym (operand * op, iCode * ic)
2043 for (dic = ic->prev; dic; dic = dic->prev)
2046 /* if definition by assignment */
2047 if (dic->op == '=' &&
2048 !POINTER_SET (dic) &&
2049 IC_RESULT (dic)->key == op->key
2050 /* && IS_TRUE_SYMOP(IC_RIGHT(dic)) */
2054 /* we are interested only if defined in far space */
2055 /* or in stack space in case of + & - */
2057 /* if assigned to a non-symbol then return
2059 if (!IS_SYMOP (IC_RIGHT (dic)))
2062 /* if the symbol is in far space then
2064 if (isOperandInFarSpace (IC_RIGHT (dic)))
2067 /* for + & - operations make sure that
2068 if it is on the stack it is the same
2069 as one of the three operands */
2070 if ((ic->op == '+' || ic->op == '-') &&
2071 OP_SYMBOL (IC_RIGHT (dic))->onStack)
2074 if (IC_RESULT (ic)->key != IC_RIGHT (dic)->key &&
2075 IC_LEFT (ic)->key != IC_RIGHT (dic)->key &&
2076 IC_RIGHT (ic)->key != IC_RIGHT (dic)->key)
2084 /* if we find an usage then we cannot delete it */
2085 if (IC_LEFT (dic) && IC_LEFT (dic)->key == op->key)
2088 if (IC_RIGHT (dic) && IC_RIGHT (dic)->key == op->key)
2091 if (POINTER_SET (dic) && IC_RESULT (dic)->key == op->key)
2095 /* now make sure that the right side of dic
2096 is not defined between ic & dic */
2099 iCode *sic = dic->next;
2101 for (; sic != ic; sic = sic->next)
2102 if (IC_RESULT (sic) &&
2103 IC_RESULT (sic)->key == IC_RIGHT (dic)->key)
2112 /*-----------------------------------------------------------------*/
2113 /* packRegsForSupport :- reduce some registers for support calls */
2114 /*-----------------------------------------------------------------*/
2116 packRegsForSupport (iCode * ic, eBBlock * ebp)
2120 /* for the left & right operand :- look to see if the
2121 left was assigned a true symbol in far space in that
2122 case replace them */
2123 if (IS_ITEMP (IC_LEFT (ic)) &&
2124 OP_SYMBOL (IC_LEFT (ic))->liveTo <= ic->seq)
2126 iCode *dic = findAssignToSym (IC_LEFT (ic), ic);
2132 /* found it we need to remove it from the
2134 for (sic = dic; sic != ic; sic = sic->next) {
2135 bitVectUnSetBit (sic->rlive, IC_LEFT (ic)->key);
2136 sic->rlive = bitVectSetBit (sic->rlive, IC_RIGHT (dic)->key);
2139 IC_LEFT (ic)->operand.symOperand =
2140 IC_RIGHT (dic)->operand.symOperand;
2141 OP_SYMBOL(IC_LEFT(ic))->liveTo = ic->seq;
2142 IC_LEFT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
2143 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2144 remiCodeFromeBBlock (ebp, dic);
2145 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
2149 /* do the same for the right operand */
2152 IS_ITEMP (IC_RIGHT (ic)) &&
2153 OP_SYMBOL (IC_RIGHT (ic))->liveTo <= ic->seq)
2155 iCode *dic = findAssignToSym (IC_RIGHT (ic), ic);
2161 /* if this is a subtraction & the result
2162 is a true symbol in far space then don't pack */
2163 if (ic->op == '-' && IS_TRUE_SYMOP (IC_RESULT (dic)))
2165 sym_link *etype = getSpec (operandType (IC_RESULT (dic)));
2166 if (IN_FARSPACE (SPEC_OCLS (etype)))
2169 /* found it we need to remove it from the
2171 for (sic = dic; sic != ic; sic = sic->next) {
2172 bitVectUnSetBit (sic->rlive, IC_RIGHT (ic)->key);
2173 sic->rlive = bitVectSetBit (sic->rlive, IC_RIGHT (dic)->key);
2176 IC_RIGHT (ic)->operand.symOperand =
2177 IC_RIGHT (dic)->operand.symOperand;
2178 IC_RIGHT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key;
2179 OP_SYMBOL(IC_RIGHT(ic))->liveTo = ic->seq;
2180 remiCodeFromeBBlock (ebp, dic);
2181 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2182 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
2189 #define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
2192 /*-----------------------------------------------------------------*/
2193 /* packRegsDPTRnuse - color live ranges that can go into extra DPTRS */
2194 /*-----------------------------------------------------------------*/
2195 static int packRegsDPTRnuse( operand *op , int dptr)
2200 if (!IS_SYMOP(op) || !IS_ITEMP(op)) return 0;
2201 if (OP_SYMBOL(op)->remat || OP_SYMBOL(op)->ruonly || OP_SYMBOL(op)->dptr)
2204 /* first check if any overlapping liverange has already been
2205 assigned to this DPTR */
2206 if (OP_SYMBOL(op)->clashes) {
2207 for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ ) {
2209 if (bitVectBitValue(OP_SYMBOL(op)->clashes,i)) {
2210 sym = hTabItemWithKey(liveRanges,i);
2211 if (sym->dptr == dptr) return 0;
2216 /* future for more dptrs */
2218 OP_SYMBOL(op)->dptr = dptr;
2222 /* DPTR1 is special since it is also used as a scratch by the backend .
2223 so we walk thru the entire live range of this operand and make sure
2224 DPTR1 will not be used by the backed . The logic here is to find out if
2225 more than one operand in an icode is in far space then we give up : we
2226 don't keep it live across functions for now
2229 ic = hTabFirstItemWK(iCodeSeqhTab,OP_SYMBOL(op)->liveFrom);
2230 for (; ic && ic->seq <= OP_SYMBOL(op)->liveTo;
2231 ic = hTabNextItem(iCodeSeqhTab,&key)) {
2234 if (ic->op == CALL || ic->op == PCALL) return 0;
2236 /* single operand icode are ok */
2237 if (ic->op == IFX || ic->op == IPUSH)
2240 if (ic->op == SEND ) {
2241 if (ic->argreg != 1 ) return 0;
2244 /* two special cases first */
2245 if (POINTER_GET(ic) && !isOperandEqual(IC_LEFT(ic),op) && /* pointer get */
2246 !OP_SYMBOL(IC_LEFT(ic))->ruonly && /* with result in far space */
2247 (isOperandInFarSpace(IC_RESULT(ic)) &&
2248 !isOperandInReg(IC_RESULT(ic)))) {
2252 if (POINTER_SET(ic) && !isOperandEqual(IC_RESULT(ic),op) && /* pointer set */
2253 !OP_SYMBOL(IC_RESULT(ic))->ruonly && /* with right in far space */
2254 (isOperandInFarSpace(IC_RIGHT(ic)) &&
2255 !isOperandInReg(IC_RIGHT(ic)))) {
2259 if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) && /* if symbol operand */
2260 !isOperandEqual(IC_RESULT(ic),op) && /* not the same as this */
2261 ((isOperandInFarSpace(IC_RESULT(ic)) || /* in farspace or */
2262 OP_SYMBOL(IC_RESULT(ic))->onStack) && /* on the stack */
2263 !isOperandInReg(IC_RESULT(ic)))) { /* and not in register */
2267 if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) && /* if symbol operand */
2268 !isOperandEqual(IC_LEFT(ic),op) && /* not the same as this */
2269 ((isOperandInFarSpace(IC_LEFT(ic)) || /* in farspace or */
2270 OP_SYMBOL(IC_LEFT(ic))->onStack) && /* on the stack */
2271 !isOperandInReg(IC_LEFT(ic)))) { /* and not in register */
2274 /* same for right */
2275 if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) && /* if symbol operand */
2276 !isOperandEqual(IC_RIGHT(ic),op) && /* not the same as this */
2277 ((isOperandInFarSpace(IC_RIGHT(ic)) || /* in farspace or */
2278 OP_SYMBOL(IC_RIGHT(ic))->onStack) && /* on the stack */
2279 !isOperandInReg(IC_RIGHT(ic)))) { /* and not in register */
2283 if (nfs && IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) &&
2284 OP_SYMBOL(IC_RESULT(ic))->ruonly) return 0;
2286 if (nfs > 1) return 0;
2288 OP_SYMBOL(op)->dptr = dptr;
2292 /*-----------------------------------------------------------------*/
2293 /* packRegsDPTRuse : - will reduce some registers for single Use */
2294 /*-----------------------------------------------------------------*/
2296 packRegsDPTRuse (operand * op)
2298 /* go thru entire liveRange of this variable & check for
2299 other possible usage of DPTR , if we don't find it the
2300 assign this to DPTR (ruonly)
2305 sym_link *type, *etype;
2307 if (!IS_SYMOP(op) || !IS_ITEMP(op)) return NULL;
2308 if (OP_SYMBOL(op)->remat || OP_SYMBOL(op)->ruonly) return NULL;
2310 /* first check if any overlapping liverange has already been
2312 if (OP_SYMBOL(op)->clashes) {
2313 for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ ) {
2314 if (bitVectBitValue(OP_SYMBOL(op)->clashes,i)) {
2315 sym = hTabItemWithKey(liveRanges,i);
2316 if (sym->ruonly) return NULL ;
2321 /* no then go thru this guys live range */
2322 dic = ic = hTabFirstItemWK(iCodeSeqhTab,OP_SYMBOL(op)->liveFrom);
2323 for (; ic && ic->seq <= OP_SYMBOL(op)->liveTo;
2324 ic = hTabNextItem(iCodeSeqhTab,&key)) {
2326 if (SKIP_IC3(ic)) continue;
2328 /* if PCALL cannot be sure give up */
2329 if (ic->op == PCALL) return NULL;
2331 /* if SEND & not the first parameter then giveup */
2332 if (ic->op == SEND && ic->argreg != 1 &&
2333 ((isOperandInFarSpace(IC_LEFT(ic)) && !isOperandInReg(IC_LEFT(ic))) ||
2334 isOperandEqual(op,IC_LEFT(ic)))) return NULL;
2336 /* if CALL then make sure it is VOID || return value not used
2337 or the return value is assigned to this one */
2338 if (ic->op == CALL) {
2339 if (OP_SYMBOL(IC_RESULT(ic))->liveTo ==
2340 OP_SYMBOL(IC_RESULT(ic))->liveFrom) continue ;
2341 etype = getSpec(type = operandType(IC_RESULT(ic)));
2342 if (getSize(type) == 0 || isOperandEqual(op,IC_RESULT(ic)))
2347 /* special case of add with a [remat] */
2348 if (ic->op == '+' &&
2349 OP_SYMBOL(IC_LEFT(ic))->remat &&
2350 (isOperandInFarSpace(IC_RIGHT(ic)) &&
2351 !isOperandInReg(IC_RIGHT(ic)))) return NULL ;
2355 if (POINTER_GET(ic) && !isOperandEqual(IC_LEFT(ic),op) &&
2356 getSize(operandType(IC_LEFT(ic))) > 1 ) return NULL ;
2359 if (POINTER_SET(ic) && !isOperandEqual(IC_RESULT(ic),op) &&
2360 getSize(operandType(IC_RESULT(ic))) > 1 ) return NULL;
2362 /* conditionals can destroy 'b' - make sure B wont
2363 be used in this one*/
2364 if ((IS_CONDITIONAL(ic) || ic->op == '*' || ic->op == '/' ||
2365 ic->op == LEFT_OP || ic->op == RIGHT_OP ) &&
2366 getSize(operandType(op)) > 3) return NULL;
2368 /* if this is a cast to a bigger type */
2370 if (!IS_PTR(OP_SYM_TYPE(IC_RESULT(ic))) &&
2371 getSize(OP_SYM_TYPE(IC_RESULT(ic))) >
2372 getSize(OP_SYM_TYPE(IC_RIGHT(ic)))) {
2378 if (IC_RESULT(ic) && IS_SYMOP(IC_RESULT(ic)) &&
2379 !isOperandEqual(IC_RESULT(ic),op) &&
2380 ( ( ( isOperandInFarSpace(IC_RESULT(ic)) || OP_SYMBOL(IC_RESULT(ic))->onStack) &&
2381 !isOperandInReg(IC_RESULT(ic))) ||
2382 OP_SYMBOL(IC_RESULT(ic))->ruonly)) return NULL;
2384 if (IC_RIGHT(ic) && IS_SYMOP(IC_RIGHT(ic)) &&
2385 !isOperandEqual(IC_RIGHT(ic),op) &&
2386 (OP_SYMBOL(IC_RIGHT(ic))->liveTo >= ic->seq ||
2387 IS_TRUE_SYMOP(IC_RIGHT(ic)) ||
2388 OP_SYMBOL(IC_RIGHT(ic))->ruonly) &&
2389 ( ( isOperandInFarSpace(IC_RIGHT(ic)) || OP_SYMBOL(IC_RIGHT(ic))->onStack) &&
2390 !isOperandInReg(IC_RIGHT(ic))) ) return NULL;
2392 if (IC_LEFT(ic) && IS_SYMOP(IC_LEFT(ic)) &&
2393 !isOperandEqual(IC_LEFT(ic),op) &&
2394 (OP_SYMBOL(IC_LEFT(ic))->liveTo >= ic->seq ||
2395 IS_TRUE_SYMOP(IC_LEFT(ic)) ||
2396 OP_SYMBOL(IC_LEFT(ic))->ruonly) &&
2397 ( ( isOperandInFarSpace(IC_LEFT(ic)) || OP_SYMBOL(IC_LEFT(ic))->onStack) &&
2398 !isOperandInReg(IC_LEFT(ic))) ) return NULL;
2400 if (IC_LEFT(ic) && IC_RIGHT(ic) &&
2401 IS_ITEMP(IC_LEFT(ic)) && IS_ITEMP(IC_RIGHT(ic)) &&
2402 (isOperandInFarSpace(IC_LEFT(ic)) && !isOperandInReg(IC_LEFT(ic))) &&
2403 (isOperandInFarSpace(IC_RIGHT(ic)) && !isOperandInReg(IC_RIGHT(ic))))
2406 OP_SYMBOL(op)->ruonly = 1;
2407 if (OP_SYMBOL(op)->usl.spillLoc) {
2408 if (OP_SYMBOL(op)->spillA)
2409 OP_SYMBOL(op)->usl.spillLoc->allocreq--;
2410 OP_SYMBOL(op)->usl.spillLoc = NULL;
2415 /*-----------------------------------------------------------------*/
2416 /* isBitwiseOptimizable - requirements of JEAN LOUIS VERN */
2417 /*-----------------------------------------------------------------*/
2419 isBitwiseOptimizable (iCode * ic)
2421 sym_link *ltype = getSpec (operandType (IC_LEFT (ic)));
2422 sym_link *rtype = getSpec (operandType (IC_RIGHT (ic)));
2424 /* bitwise operations are considered optimizable
2425 under the following conditions (Jean-Louis VERN)
2437 if ( IS_LITERAL (rtype) ||
2438 (IS_BITVAR (ltype) && IN_BITSPACE (SPEC_OCLS (ltype))))
2444 /*-----------------------------------------------------------------*/
2445 /* packRegsForAccUse - pack registers for acc use */
2446 /*-----------------------------------------------------------------*/
2448 packRegsForAccUse (iCode * ic)
2452 /* if this is an aggregate, e.g. a one byte char array */
2453 if (IS_AGGREGATE(operandType(IC_RESULT(ic)))) {
2457 /* if we are calling a reentrant function that has stack parameters */
2458 if (ic->op == CALL &&
2459 IFFUNC_ISREENT(operandType(IC_LEFT(ic))) &&
2460 FUNC_HASSTACKPARM(operandType(IC_LEFT(ic))))
2463 if (ic->op == PCALL &&
2464 IFFUNC_ISREENT(operandType(IC_LEFT(ic))->next) &&
2465 FUNC_HASSTACKPARM(operandType(IC_LEFT(ic))->next))
2468 /* if + or - then it has to be one byte result */
2469 if ((ic->op == '+' || ic->op == '-')
2470 && getSize (operandType (IC_RESULT (ic))) > 1)
2473 /* if shift operation make sure right side is not a literal */
2474 if (ic->op == RIGHT_OP &&
2475 (isOperandLiteral (IC_RIGHT (ic)) ||
2476 getSize (operandType (IC_RESULT (ic))) > 1))
2479 if (ic->op == LEFT_OP &&
2480 (isOperandLiteral (IC_RIGHT (ic)) ||
2481 getSize (operandType (IC_RESULT (ic))) > 1))
2484 if (IS_BITWISE_OP (ic) &&
2485 getSize (operandType (IC_RESULT (ic))) > 1)
2489 /* has only one definition */
2490 if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2493 /* has only one use */
2494 if (bitVectnBitsOn (OP_USES (IC_RESULT (ic))) > 1)
2497 /* and the usage immediately follows this iCode */
2498 if (!(uic = hTabItemWithKey (iCodehTab,
2499 bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2502 if (ic->next != uic)
2505 /* if it is a conditional branch then we definitely can */
2509 if (uic->op == JUMPTABLE)
2512 /* if the usage is not is an assignment
2513 or an arithmetic / bitwise / shift operation then not */
2514 if (POINTER_SET (uic) &&
2515 getSize (aggrToPtr (operandType (IC_RESULT (uic)), FALSE)) > 1)
2518 if (uic->op != '=' &&
2519 !IS_ARITHMETIC_OP (uic) &&
2520 !IS_BITWISE_OP (uic) &&
2521 uic->op != LEFT_OP &&
2522 uic->op != RIGHT_OP)
2525 /* if used in ^ operation then make sure right is not a
2527 if (uic->op == '^' && isOperandLiteral (IC_RIGHT (uic)))
2530 /* if shift operation make sure right side is not a literal */
2531 if (uic->op == RIGHT_OP &&
2532 (isOperandLiteral (IC_RIGHT (uic)) ||
2533 getSize (operandType (IC_RESULT (uic))) > 1))
2536 if (uic->op == LEFT_OP &&
2537 (isOperandLiteral (IC_RIGHT (uic)) ||
2538 getSize (operandType (IC_RESULT (uic))) > 1))
2541 /* make sure that the result of this icode is not on the
2542 stack, since acc is used to compute stack offset */
2543 if (isOperandOnStack(IC_RESULT(uic)))
2546 /* if either one of them in far space then we cannot */
2547 if ((IS_TRUE_SYMOP (IC_LEFT (uic)) &&
2548 isOperandInFarSpace (IC_LEFT (uic))) ||
2549 (IS_TRUE_SYMOP (IC_RIGHT (uic)) &&
2550 isOperandInFarSpace (IC_RIGHT (uic))))
2553 /* if the usage has only one operand then we can */
2554 if (IC_LEFT (uic) == NULL ||
2555 IC_RIGHT (uic) == NULL)
2558 /* make sure this is on the left side if not
2559 a '+' since '+' is commutative */
2560 if (ic->op != '+' &&
2561 IC_LEFT (uic)->key != IC_RESULT (ic)->key)
2564 /* if the other one is not on stack then we can */
2565 if (IC_LEFT (uic)->key == IC_RESULT (ic)->key &&
2566 (IS_ITEMP (IC_RIGHT (uic)) ||
2567 (IS_TRUE_SYMOP (IC_RIGHT (uic)) &&
2568 !OP_SYMBOL (IC_RIGHT (uic))->onStack)))
2571 if (IC_RIGHT (uic)->key == IC_RESULT (ic)->key &&
2572 (IS_ITEMP (IC_LEFT (uic)) ||
2573 (IS_TRUE_SYMOP (IC_LEFT (uic)) &&
2574 !OP_SYMBOL (IC_LEFT (uic))->onStack)))
2580 OP_SYMBOL (IC_RESULT (ic))->accuse = 1;
2585 /*-----------------------------------------------------------------*/
2586 /* packForPush - hueristics to reduce iCode for pushing */
2587 /*-----------------------------------------------------------------*/
2589 packForPush (iCode * ic, eBBlock * ebp)
2594 if ((ic->op != IPUSH && ic->op != SEND) || !IS_ITEMP (IC_LEFT (ic)))
2597 /* must have only definition & one usage */
2598 if (bitVectnBitsOn (OP_DEFS (IC_LEFT (ic))) != 1 ||
2599 bitVectnBitsOn (OP_USES (IC_LEFT (ic))) != 1)
2602 /* find the definition */
2603 if (!(dic = hTabItemWithKey (iCodehTab,
2604 bitVectFirstBit (OP_DEFS (IC_LEFT (ic))))))
2607 if (dic->op != '=' || POINTER_SET (dic))
2610 if (dic->eBBlockNum != ic->eBBlockNum) return ;
2612 /* make sure the right side does not have any definitions
2614 dbv = OP_DEFS(IC_RIGHT(dic));
2615 for (lic = ic; lic && lic != dic ; lic = lic->prev) {
2616 if (bitVectBitValue(dbv,lic->key)) return ;
2618 /* make sure they have the same type */
2620 sym_link *itype=operandType(IC_LEFT(ic));
2621 sym_link *ditype=operandType(IC_RIGHT(dic));
2623 if (SPEC_USIGN(itype)!=SPEC_USIGN(ditype) ||
2624 SPEC_LONG(itype)!=SPEC_LONG(ditype))
2627 /* extend the live range of replaced operand if needed */
2628 if (OP_SYMBOL(IC_RIGHT(dic))->liveTo < OP_SYMBOL(IC_LEFT(ic))->liveTo) {
2629 OP_SYMBOL(IC_RIGHT(dic))->liveTo = OP_SYMBOL(IC_LEFT(ic))->liveTo;
2630 OP_SYMBOL(IC_RIGHT(dic))->clashes =
2631 bitVectUnion(OP_SYMBOL(IC_RIGHT(dic))->clashes,
2632 OP_SYMBOL(IC_LEFT(ic))->clashes);
2634 for (lic = ic; lic && lic != dic; lic = lic->prev)
2636 bitVectUnSetBit (lic->rlive, IC_LEFT (ic)->key);
2637 if (IS_ITEMP (IC_RIGHT (dic)))
2638 bitVectSetBit (lic->rlive, IC_RIGHT (dic)->key);
2640 /* we now we know that it has one & only one def & use
2641 and the that the definition is an assignment */
2642 IC_LEFT (ic) = IC_RIGHT (dic);
2644 remiCodeFromeBBlock (ebp, dic);
2645 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2646 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
2649 /*-----------------------------------------------------------------*/
2650 /* packRegisters - does some transformations to reduce register */
2652 /*-----------------------------------------------------------------*/
2654 packRegisters (eBBlock * ebp)
2664 /* look for assignments of the form */
2665 /* iTempNN = TRueSym (someoperation) SomeOperand */
2667 /* TrueSym := iTempNN:1 */
2668 for (ic = ebp->sch; ic; ic = ic->next)
2672 /* find assignment of the form TrueSym := iTempNN:1 */
2673 if (ic->op == '=' && !POINTER_SET (ic))
2674 change += packRegsForAssign (ic, ebp);
2681 for (ic = ebp->sch; ic; ic = ic->next)
2684 /* if this is an itemp & result of a address of a true sym
2685 then mark this as rematerialisable */
2686 if (ic->op == ADDRESS_OF &&
2687 IS_ITEMP (IC_RESULT (ic)) &&
2688 IS_TRUE_SYMOP (IC_LEFT (ic)) &&
2689 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2690 !OP_SYMBOL (IC_LEFT (ic))->onStack)
2693 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2694 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2695 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2699 /* if this is an itemp & used as a pointer
2700 & assigned to a literal then remat */
2701 if (IS_ASSIGN_ICODE(ic) &&
2702 IS_ITEMP(IC_RESULT(ic)) &&
2703 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2704 isOperandLiteral(IC_RIGHT(ic)))
2706 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2707 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2708 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2711 /* if straight assignment then carry remat flag if
2712 this is the only definition */
2713 if (ic->op == '=' &&
2714 !POINTER_SET (ic) &&
2715 IS_SYMOP (IC_RIGHT (ic)) &&
2716 OP_SYMBOL (IC_RIGHT (ic))->remat &&
2717 !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode) &&
2718 bitVectnBitsOn (OP_SYMBOL (IC_RESULT (ic))->defs) <= 1)
2721 OP_SYMBOL (IC_RESULT (ic))->remat =
2722 OP_SYMBOL (IC_RIGHT (ic))->remat;
2723 OP_SYMBOL (IC_RESULT (ic))->rematiCode =
2724 OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
2727 /* if cast to a generic pointer & the pointer being
2728 cast is remat, then we can remat this cast as well */
2729 if (ic->op == CAST &&
2730 IS_SYMOP(IC_RIGHT(ic)) &&
2731 !OP_SYMBOL(IC_RESULT(ic))->isreqv &&
2732 OP_SYMBOL(IC_RIGHT(ic))->remat ) {
2733 sym_link *to_type = operandType(IC_LEFT(ic));
2734 sym_link *from_type = operandType(IC_RIGHT(ic));
2735 if (IS_GENPTR(to_type) && IS_PTR(from_type)) {
2736 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2737 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2738 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2742 /* if this is a +/- operation with a rematerizable
2743 then mark this as rematerializable as well */
2744 if ((ic->op == '+' || ic->op == '-') &&
2745 (IS_SYMOP (IC_LEFT (ic)) &&
2746 IS_ITEMP (IC_RESULT (ic)) &&
2747 OP_SYMBOL (IC_LEFT (ic))->remat &&
2748 (!IS_SYMOP (IC_RIGHT (ic)) || !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode)) &&
2749 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2750 IS_OP_LITERAL (IC_RIGHT (ic))))
2753 //int i = operandLitValue(IC_RIGHT(ic));
2754 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2755 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2756 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2759 /* mark the pointer usages */
2760 if (POINTER_SET (ic))
2761 OP_SYMBOL (IC_RESULT (ic))->uptr = 1;
2763 if (POINTER_GET (ic))
2764 OP_SYMBOL (IC_LEFT (ic))->uptr = 1;
2766 if (ic->op == RETURN && IS_SYMOP (IC_LEFT(ic)))
2767 OP_SYMBOL (IC_LEFT (ic))->uptr = 1;
2769 if (ic->op == RECEIVE && ic->argreg == 1 &&
2770 getSize (operandType(IC_RESULT(ic))) <= 3)
2771 OP_SYMBOL (IC_RESULT(ic))->uptr = 1;
2773 if (ic->op == SEND && ic->argreg == 1 &&
2774 getSize (aggrToPtr(operandType(IC_LEFT(ic)),FALSE)) <= 3)
2775 OP_SYMBOL (IC_LEFT(ic))->uptr = 1;
2779 /* if we are using a symbol on the stack
2780 then we should say ds390_ptrRegReq */
2781 if (ic->op == IFX && IS_SYMOP (IC_COND (ic)))
2782 ds390_ptrRegReq += ((OP_SYMBOL (IC_COND (ic))->onStack ? !options.stack10bit : 0) +
2783 OP_SYMBOL (IC_COND (ic))->iaccess);
2784 else if (ic->op == JUMPTABLE && IS_SYMOP (IC_JTCOND (ic)))
2785 ds390_ptrRegReq += ((OP_SYMBOL (IC_JTCOND (ic))->onStack ? !options.stack10bit : 0) +
2786 OP_SYMBOL (IC_JTCOND (ic))->iaccess);
2789 if (IS_SYMOP (IC_LEFT (ic)))
2790 ds390_ptrRegReq += ((OP_SYMBOL (IC_LEFT (ic))->onStack ? !options.stack10bit : 0) +
2791 OP_SYMBOL (IC_LEFT (ic))->iaccess);
2792 if (IS_SYMOP (IC_RIGHT (ic)))
2793 ds390_ptrRegReq += ((OP_SYMBOL (IC_RIGHT (ic))->onStack ? !options.stack10bit : 0) +
2794 OP_SYMBOL (IC_RIGHT (ic))->iaccess);
2795 if (IS_SYMOP (IC_RESULT (ic)))
2796 ds390_ptrRegReq += ((OP_SYMBOL (IC_RESULT (ic))->onStack ? !options.stack10bit : 0) +
2797 OP_SYMBOL (IC_RESULT (ic))->iaccess);
2801 /* if the condition of an if instruction
2802 is defined in the previous instruction and
2803 this is the only usage then
2804 mark the itemp as a conditional */
2805 if ((IS_CONDITIONAL (ic) ||
2806 (IS_BITWISE_OP(ic) && isBitwiseOptimizable (ic))) &&
2807 ic->next && ic->next->op == IFX &&
2808 bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
2809 isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
2810 OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq)
2812 OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND;
2816 /* reduce for support function calls */
2817 if (ic->supportRtn || ic->op == '+' || ic->op == '-')
2818 packRegsForSupport (ic, ebp);
2820 /* some cases the redundant moves can
2821 can be eliminated for return statements . Can be elminated for the first SEND */
2822 if ((ic->op == RETURN ||
2823 ((ic->op == SEND || ic->op == RECEIVE)&& ic->argreg == 1)) &&
2824 !isOperandInFarSpace (IC_LEFT (ic)) &&
2827 packRegsDPTRuse (IC_LEFT (ic));
2830 if (ic->op == CALL) {
2831 sym_link *ftype = operandType(IC_LEFT(ic));
2832 if (getSize(operandType(IC_RESULT(ic))) <= 4 &&
2833 !IFFUNC_ISBUILTIN(ftype)) {
2834 packRegsDPTRuse (IC_RESULT (ic));
2838 /* if pointer set & left has a size more than
2839 one and right is not in far space */
2840 if (POINTER_SET (ic) &&
2841 !isOperandInFarSpace (IC_RIGHT (ic)) &&
2842 !OP_SYMBOL (IC_RESULT (ic))->remat &&
2843 !IS_OP_RUONLY (IC_RIGHT (ic)) &&
2844 getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1) {
2846 packRegsDPTRuse (IC_RESULT (ic));
2849 /* if pointer get */
2850 if (POINTER_GET (ic) &&
2851 !isOperandInFarSpace (IC_RESULT (ic)) &&
2852 !OP_SYMBOL (IC_LEFT (ic))->remat &&
2853 !IS_OP_RUONLY (IC_RESULT (ic)) &&
2854 getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1) {
2856 packRegsDPTRuse (IC_LEFT (ic));
2859 /* if this is cast for intergral promotion then
2860 check if only use of the definition of the
2861 operand being casted/ if yes then replace
2862 the result of that arithmetic operation with
2863 this result and get rid of the cast */
2866 sym_link *fromType = operandType (IC_RIGHT (ic));
2867 sym_link *toType = operandType (IC_LEFT (ic));
2869 if (IS_INTEGRAL (fromType) && IS_INTEGRAL (toType) &&
2870 getSize (fromType) != getSize (toType) &&
2871 SPEC_USIGN (fromType) == SPEC_USIGN (toType))
2874 iCode *dic = packRegsDPTRuse (IC_RIGHT (ic));
2877 if (IS_ARITHMETIC_OP (dic))
2879 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2880 IC_RESULT (dic) = IC_RESULT (ic);
2881 remiCodeFromeBBlock (ebp, ic);
2882 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2883 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
2884 OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
2888 OP_SYMBOL (IC_RIGHT (ic))->ruonly = 0;
2894 /* if the type from and type to are the same
2895 then if this is the only use then packit */
2896 if (compareType (operandType (IC_RIGHT (ic)),
2897 operandType (IC_LEFT (ic))) == 1)
2899 iCode *dic = packRegsDPTRuse (IC_RIGHT (ic));
2902 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2903 IC_RESULT (dic) = IC_RESULT (ic);
2904 remiCodeFromeBBlock (ebp, ic);
2905 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2906 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
2907 OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
2915 iTempNN := (some variable in farspace) V1
2920 if (ic->op == IPUSH || ic->op == SEND)
2922 packForPush (ic, ebp);
2926 /* pack registers for accumulator use, when the
2927 result of an arithmetic or bit wise operation
2928 has only one use, that use is immediately following
2929 the defintion and the using iCode has only one
2930 operand or has two operands but one is literal &
2931 the result of that operation is not on stack then
2932 we can leave the result of this operation in acc:b
2934 if ((IS_ARITHMETIC_OP (ic)
2935 || IS_CONDITIONAL(ic)
2936 || IS_BITWISE_OP (ic)
2937 || ic->op == LEFT_OP || ic->op == RIGHT_OP
2938 || (ic->op == ADDRESS_OF && isOperandOnStack (IC_LEFT (ic)))
2940 IS_ITEMP (IC_RESULT (ic)) &&
2941 getSize (operandType (IC_RESULT (ic))) <= 2)
2943 packRegsForAccUse (ic);
2948 /*-----------------------------------------------------------------*/
2949 /* assignRegisters - assigns registers to each live range as need */
2950 /*-----------------------------------------------------------------*/
2952 ds390_assignRegisters (eBBlock ** ebbs, int count)
2957 setToNull ((void *) &_G.funcrUsed);
2958 setToNull ((void *) &_G.regAssigned);
2959 setToNull ((void *) &_G.totRegAssigned);
2960 setToNull ((void *) &_G.funcrUsed);
2961 ds390_ptrRegReq = _G.stackExtend = _G.dataExtend = 0;
2963 if (options.model != MODEL_FLAT24) options.stack10bit = 0;
2964 /* change assignments this will remove some
2965 live ranges reducing some register pressure */
2966 for (i = 0; i < count; i++)
2967 packRegisters (ebbs[i]);
2969 if (options.dump_pack)
2970 dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
2972 /* first determine for each live range the number of
2973 registers & the type of registers required for each */
2976 /* and serially allocate registers */
2977 serialRegAssign (ebbs, count);
2984 /* if stack was extended then tell the user */
2987 /* werror(W_TOOMANY_SPILS,"stack", */
2988 /* _G.stackExtend,currFunc->name,""); */
2994 /* werror(W_TOOMANY_SPILS,"data space", */
2995 /* _G.dataExtend,currFunc->name,""); */
2999 /* after that create the register mask
3000 for each of the instruction */
3001 createRegMask (ebbs, count);
3003 /* redo that offsets for stacked automatic variables */
3004 redoStackOffsets ();
3006 if (options.dump_rassgn) {
3007 dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count);
3008 dumpLiveRanges (DUMP_LRANGE, liveRanges);
3011 /* do the overlaysegment stuff SDCCmem.c */
3012 doOverlays (ebbs, count);
3014 /* now get back the chain */
3015 ic = iCodeLabelOptimize (iCodeFromeBBlock (ebbs, count));
3020 /* free up any _G.stackSpil locations allocated */
3021 applyToSet (_G.stackSpil, deallocStackSpil);
3023 setToNull ((void **) &_G.stackSpil);
3024 setToNull ((void **) &_G.spiltSet);
3025 /* mark all registers as free */