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 /*-----------------------------------------------------------------*/
39 extern void gen51Code (iCode *);
48 bitVect *totRegAssigned; /* final set of LRs that got into registers */
51 bitVect *funcrUsed; /* registers used in a function */
57 /* Shared with gen.c */
58 int mcs51_ptrRegReq; /* one byte pointer register required */
64 {REG_GPR, R2_IDX, REG_GPR, "r2", "ar2", "0", 2, 1},
65 {REG_GPR, R3_IDX, REG_GPR, "r3", "ar3", "0", 3, 1},
66 {REG_GPR, R4_IDX, REG_GPR, "r4", "ar4", "0", 4, 1},
67 {REG_GPR, R5_IDX, REG_GPR, "r5", "ar5", "0", 5, 1},
68 {REG_GPR, R6_IDX, REG_GPR, "r6", "ar6", "0", 6, 1},
69 {REG_GPR, R7_IDX, REG_GPR, "r7", "ar7", "0", 7, 1},
70 {REG_PTR, R0_IDX, REG_PTR, "r0", "ar0", "0", 0, 1},
71 {REG_PTR, R1_IDX, REG_PTR, "r1", "ar1", "0", 1, 1},
72 {REG_GPR, X8_IDX, REG_GPR, "x8", "x8", "xreg", 0, 1},
73 {REG_GPR, X9_IDX, REG_GPR, "x9", "x9", "xreg", 1, 1},
74 {REG_GPR, X10_IDX, REG_GPR, "x10", "x10", "xreg", 2, 1},
75 {REG_GPR, X11_IDX, REG_GPR, "x11", "x11", "xreg", 3, 1},
76 {REG_GPR, X12_IDX, REG_GPR, "x12", "x12", "xreg", 4, 1},
77 {REG_CND, CND_IDX, REG_CND, "C", "psw", "0xd0", 0, 1},
78 {0, DPL_IDX, 0, "dpl", "dpl", "0x82", 0, 0},
79 {0, DPH_IDX, 0, "dph", "dph", "0x83", 0, 0},
80 {0, B_IDX, 0, "b", "b", "0xf0", 0, 0},
81 {0, A_IDX, 0, "a", "acc", "0xe0", 0, 0},
84 static void spillThis (symbol *);
85 static void freeAllRegs ();
87 /*-----------------------------------------------------------------*/
88 /* allocReg - allocates register of given type */
89 /*-----------------------------------------------------------------*/
95 for (i = 0; i < mcs51_nRegs; i++)
98 /* if type is given as 0 then any
99 free register will do */
103 regs8051[i].isFree = 0;
106 bitVectSetBit (currFunc->regsUsed, i);
109 /* other wise look for specific type
111 if (regs8051[i].isFree &&
112 regs8051[i].type == type)
114 regs8051[i].isFree = 0;
117 bitVectSetBit (currFunc->regsUsed, i);
124 /*-----------------------------------------------------------------*/
125 /* allocThisReg - allocates a particular register (if free) */
126 /*-----------------------------------------------------------------*/
128 allocThisReg (regs * reg)
135 currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, reg->rIdx);
141 /*-----------------------------------------------------------------*/
142 /* mcs51_regWithIdx - returns pointer to register with index number*/
143 /*-----------------------------------------------------------------*/
145 mcs51_regWithIdx (int idx)
149 for (i = 0; i < sizeof(regs8051)/sizeof(regs); i++)
150 if (regs8051[i].rIdx == idx)
153 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
154 "regWithIdx not found");
158 /*-----------------------------------------------------------------*/
159 /* freeReg - frees a register */
160 /*-----------------------------------------------------------------*/
166 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
167 "freeReg - Freeing NULL register");
175 /*-----------------------------------------------------------------*/
176 /* nFreeRegs - returns number of free registers */
177 /*-----------------------------------------------------------------*/
184 for (i = 0; i < mcs51_nRegs; i++)
185 if (regs8051[i].isFree && regs8051[i].type == type)
190 /*-----------------------------------------------------------------*/
191 /* nfreeRegsType - free registers with type */
192 /*-----------------------------------------------------------------*/
194 nfreeRegsType (int type)
199 if ((nfr = nFreeRegs (type)) == 0)
200 return nFreeRegs (REG_GPR);
203 return nFreeRegs (type);
206 /*-----------------------------------------------------------------*/
207 /* useReg - marks a register as used */
208 /*-----------------------------------------------------------------*/
215 /*-----------------------------------------------------------------*/
216 /* computeSpillable - given a point find the spillable live ranges */
217 /*-----------------------------------------------------------------*/
219 computeSpillable (iCode * ic)
223 /* spillable live ranges are those that are live at this
224 point . the following categories need to be subtracted
226 a) - those that are already spilt
227 b) - if being used by this one
228 c) - defined by this one */
230 spillable = bitVectCopy (ic->rlive);
232 bitVectCplAnd (spillable, _G.spiltSet); /* those already spilt */
234 bitVectCplAnd (spillable, ic->uses); /* used in this one */
235 bitVectUnSetBit (spillable, ic->defKey);
236 spillable = bitVectIntersect (spillable, _G.regAssigned);
241 /*-----------------------------------------------------------------*/
242 /* noSpilLoc - return true if a variable has no spil location */
243 /*-----------------------------------------------------------------*/
245 noSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
247 return (sym->usl.spillLoc ? 0 : 1);
250 /*-----------------------------------------------------------------*/
251 /* hasSpilLoc - will return 1 if the symbol has spil location */
252 /*-----------------------------------------------------------------*/
254 hasSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
256 return (sym->usl.spillLoc ? 1 : 0);
259 /*-----------------------------------------------------------------*/
260 /* directSpilLoc - will return 1 if the splilocation is in direct */
261 /*-----------------------------------------------------------------*/
263 directSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic)
265 if (sym->usl.spillLoc &&
266 (IN_DIRSPACE (SPEC_OCLS (sym->usl.spillLoc->etype))))
272 /*-----------------------------------------------------------------*/
273 /* hasSpilLocnoUptr - will return 1 if the symbol has spil location */
274 /* but is not used as a pointer */
275 /*-----------------------------------------------------------------*/
277 hasSpilLocnoUptr (symbol * sym, eBBlock * ebp, iCode * ic)
279 return ((sym->usl.spillLoc && !sym->uptr) ? 1 : 0);
282 /*-----------------------------------------------------------------*/
283 /* rematable - will return 1 if the remat flag is set */
284 /*-----------------------------------------------------------------*/
286 rematable (symbol * sym, eBBlock * ebp, iCode * ic)
291 /*-----------------------------------------------------------------*/
292 /* notUsedInRemaining - not used or defined in remain of the block */
293 /*-----------------------------------------------------------------*/
295 notUsedInRemaining (symbol * sym, eBBlock * ebp, iCode * ic)
297 return ((usedInRemaining (operandFromSymbol (sym), ic) ? 0 : 1) &&
298 allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq));
301 /*-----------------------------------------------------------------*/
302 /* allLRs - return true for all */
303 /*-----------------------------------------------------------------*/
305 allLRs (symbol * sym, eBBlock * ebp, iCode * ic)
310 /*-----------------------------------------------------------------*/
311 /* liveRangesWith - applies function to a given set of live range */
312 /*-----------------------------------------------------------------*/
314 liveRangesWith (bitVect * lrs, int (func) (symbol *, eBBlock *, iCode *),
315 eBBlock * ebp, iCode * ic)
320 if (!lrs || !lrs->size)
323 for (i = 1; i < lrs->size; i++)
326 if (!bitVectBitValue (lrs, i))
329 /* if we don't find it in the live range
330 hash table we are in serious trouble */
331 if (!(sym = hTabItemWithKey (liveRanges, i)))
333 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
334 "liveRangesWith could not find liveRange");
338 if (func (sym, ebp, ic) && bitVectBitValue (_G.regAssigned, sym->key))
339 addSetHead (&rset, sym);
346 /*-----------------------------------------------------------------*/
347 /* leastUsedLR - given a set determines which is the least used */
348 /*-----------------------------------------------------------------*/
350 leastUsedLR (set * sset)
352 symbol *sym = NULL, *lsym = NULL;
354 sym = lsym = setFirstItem (sset);
359 for (; lsym; lsym = setNextItem (sset))
362 /* if usage is the same then prefer
363 the spill the smaller of the two */
364 if (lsym->used == sym->used)
365 if (getSize (lsym->type) < getSize (sym->type))
369 if (lsym->used < sym->used)
374 setToNull ((void *) &sset);
379 /*-----------------------------------------------------------------*/
380 /* noOverLap - will iterate through the list looking for over lap */
381 /*-----------------------------------------------------------------*/
383 noOverLap (set * itmpStack, symbol * fsym)
387 for (sym = setFirstItem (itmpStack); sym;
388 sym = setNextItem (itmpStack))
390 if (bitVectBitValue(sym->clashes,fsym->key)) return 0;
395 /*-----------------------------------------------------------------*/
396 /* isFree - will return 1 if the a free spil location is found */
397 /*-----------------------------------------------------------------*/
402 V_ARG (symbol **, sloc);
403 V_ARG (symbol *, fsym);
405 /* if already found */
409 /* if it is free && and the itmp assigned to
410 this does not have any overlapping live ranges
411 with the one currently being assigned and
412 the size can be accomodated */
414 noOverLap (sym->usl.itmpStack, fsym) &&
415 getSize (sym->type) >= getSize (fsym->type))
424 /*-----------------------------------------------------------------*/
425 /* spillLRWithPtrReg :- will spil those live ranges which use PTR */
426 /*-----------------------------------------------------------------*/
428 spillLRWithPtrReg (symbol * forSym)
434 if (!_G.regAssigned ||
435 bitVectIsZero (_G.regAssigned))
438 r0 = mcs51_regWithIdx (R0_IDX);
439 r1 = mcs51_regWithIdx (R1_IDX);
441 /* for all live ranges */
442 for (lrsym = hTabFirstItem (liveRanges, &k); lrsym;
443 lrsym = hTabNextItem (liveRanges, &k))
447 /* if no registers assigned to it or spilt */
448 /* if it does not overlap this then
449 no need to spill it */
451 if (lrsym->isspilt || !lrsym->nRegs ||
452 (lrsym->liveTo < forSym->liveFrom))
455 /* go thru the registers : if it is either
456 r0 or r1 then spill it */
457 for (j = 0; j < lrsym->nRegs; j++)
458 if (lrsym->regs[j] == r0 ||
459 lrsym->regs[j] == r1)
468 /*-----------------------------------------------------------------*/
469 /* createStackSpil - create a location on the stack to spil */
470 /*-----------------------------------------------------------------*/
472 createStackSpil (symbol * sym)
475 int useXstack, model;
479 /* first go try and find a free one that is already
480 existing on the stack */
481 if (applyToSet (_G.stackSpil, isFree, &sloc, sym))
483 /* found a free one : just update & return */
484 sym->usl.spillLoc = sloc;
487 addSetHead (&sloc->usl.itmpStack, sym);
491 /* could not then have to create one , this is the hard part
492 we need to allocate this on the stack : this is really a
493 hack!! but cannot think of anything better at this time */
495 if (SNPRINTF (slocBuffer, sizeof(slocBuffer),
496 "sloc%d", _G.slocNum++) >= sizeof (slocBuffer))
498 fprintf (stderr, "***Internal error: slocBuffer overflowed: %s:%d\n",
503 sloc = newiTemp (slocBuffer);
505 /* set the type to the spilling symbol */
506 sloc->type = copyLinkChain (sym->type);
507 sloc->etype = getSpec (sloc->type);
508 if (SPEC_SCLS (sloc->etype) != S_BIT)
510 SPEC_SCLS (sloc->etype) = S_DATA;
512 SPEC_EXTR (sloc->etype) = 0;
513 SPEC_STAT (sloc->etype) = 0;
514 SPEC_VOLATILE(sloc->etype) = 0;
515 SPEC_ABSA(sloc->etype) = 0;
517 /* we don't allow it to be allocated`
518 onto the external stack since : so we
519 temporarily turn it off ; we also
520 turn off memory model to prevent
521 the spil from going to the external storage
524 useXstack = options.useXstack;
525 model = options.model;
526 /* noOverlay = options.noOverlay; */
527 /* options.noOverlay = 1; */
528 options.model = options.useXstack = 0;
532 options.useXstack = useXstack;
533 options.model = model;
534 /* options.noOverlay = noOverlay; */
535 sloc->isref = 1; /* to prevent compiler warning */
537 /* if it is on the stack then update the stack */
538 if (IN_STACK (sloc->etype))
540 currFunc->stack += getSize (sloc->type);
541 _G.stackExtend += getSize (sloc->type);
544 _G.dataExtend += getSize (sloc->type);
546 /* add it to the _G.stackSpil set */
547 addSetHead (&_G.stackSpil, sloc);
548 sym->usl.spillLoc = sloc;
551 /* add it to the set of itempStack set
552 of the spill location */
553 addSetHead (&sloc->usl.itmpStack, sym);
557 /*-----------------------------------------------------------------*/
558 /* isSpiltOnStack - returns true if the spil location is on stack */
559 /*-----------------------------------------------------------------*/
561 isSpiltOnStack (symbol * sym)
571 /* if (sym->_G.stackSpil) */
574 if (!sym->usl.spillLoc)
577 etype = getSpec (sym->usl.spillLoc->type);
578 if (IN_STACK (etype))
584 /*-----------------------------------------------------------------*/
585 /* spillThis - spils a specific operand */
586 /*-----------------------------------------------------------------*/
588 spillThis (symbol * sym)
591 /* if this is rematerializable or has a spillLocation
592 we are okay, else we need to create a spillLocation
594 if (!(sym->remat || sym->usl.spillLoc))
595 createStackSpil (sym);
597 /* mark it has spilt & put it in the spilt set */
598 sym->isspilt = sym->spillA = 1;
599 _G.spiltSet = bitVectSetBit (_G.spiltSet, sym->key);
601 bitVectUnSetBit (_G.regAssigned, sym->key);
602 bitVectUnSetBit (_G.totRegAssigned, sym->key);
604 for (i = 0; i < sym->nRegs; i++)
608 freeReg (sym->regs[i]);
612 /* if spilt on stack then free up r0 & r1
613 if they could have been assigned to some
615 if (!mcs51_ptrRegReq && isSpiltOnStack (sym))
618 spillLRWithPtrReg (sym);
621 if (sym->usl.spillLoc && !sym->remat)
622 sym->usl.spillLoc->allocreq++;
626 /*-----------------------------------------------------------------*/
627 /* selectSpil - select a iTemp to spil : rather a simple procedure */
628 /*-----------------------------------------------------------------*/
630 selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym)
632 bitVect *lrcs = NULL;
636 /* get the spillable live ranges */
637 lrcs = computeSpillable (ic);
639 /* get all live ranges that are rematerizable */
640 if ((selectS = liveRangesWith (lrcs, rematable, ebp, ic)))
643 /* return the least used of these */
644 return leastUsedLR (selectS);
647 /* get live ranges with spillLocations in direct space */
648 if ((selectS = liveRangesWith (lrcs, directSpilLoc, ebp, ic)))
650 sym = leastUsedLR (selectS);
651 strncpyz (sym->rname,
652 sym->usl.spillLoc->rname[0] ?
653 sym->usl.spillLoc->rname : sym->usl.spillLoc->name,
656 /* mark it as allocation required */
657 sym->usl.spillLoc->allocreq++;
661 /* if the symbol is local to the block then */
662 if (forSym->liveTo < ebp->lSeq)
665 /* check if there are any live ranges allocated
666 to registers that are not used in this block */
667 if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInBlock, ebp, ic)))
669 sym = leastUsedLR (selectS);
670 /* if this is not rematerializable */
679 /* check if there are any live ranges that not
680 used in the remainder of the block */
682 !isiCodeInFunctionCall (ic) &&
683 (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic)))
685 sym = leastUsedLR (selectS);
698 /* find live ranges with spillocation && not used as pointers */
699 if ((selectS = liveRangesWith (lrcs, hasSpilLocnoUptr, ebp, ic)))
702 sym = leastUsedLR (selectS);
703 /* mark this as allocation required */
704 sym->usl.spillLoc->allocreq++;
708 /* find live ranges with spillocation */
709 if ((selectS = liveRangesWith (lrcs, hasSpilLoc, ebp, ic)))
712 sym = leastUsedLR (selectS);
713 sym->usl.spillLoc->allocreq++;
717 /* couldn't find then we need to create a spil
718 location on the stack , for which one? the least
720 if ((selectS = liveRangesWith (lrcs, noSpilLoc, ebp, ic)))
723 /* return a created spil location */
724 sym = createStackSpil (leastUsedLR (selectS));
725 sym->usl.spillLoc->allocreq++;
729 /* this is an extreme situation we will spill
730 this one : happens very rarely but it does happen */
736 /*-----------------------------------------------------------------*/
737 /* spilSomething - spil some variable & mark registers as free */
738 /*-----------------------------------------------------------------*/
740 spilSomething (iCode * ic, eBBlock * ebp, symbol * forSym)
745 /* get something we can spil */
746 ssym = selectSpil (ic, ebp, forSym);
748 /* mark it as spilt */
749 ssym->isspilt = ssym->spillA = 1;
750 _G.spiltSet = bitVectSetBit (_G.spiltSet, ssym->key);
752 /* mark it as not register assigned &
753 take it away from the set */
754 bitVectUnSetBit (_G.regAssigned, ssym->key);
755 bitVectUnSetBit (_G.totRegAssigned, ssym->key);
757 /* mark the registers as free */
758 for (i = 0; i < ssym->nRegs; i++)
760 freeReg (ssym->regs[i]);
762 /* if spilt on stack then free up r0 & r1
763 if they could have been assigned to as gprs */
764 if (!mcs51_ptrRegReq && isSpiltOnStack (ssym))
767 spillLRWithPtrReg (ssym);
770 /* if this was a block level spil then insert push & pop
771 at the start & end of block respectively */
774 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
775 /* add push to the start of the block */
776 addiCodeToeBBlock (ebp, nic, (ebp->sch->op == LABEL ?
777 ebp->sch->next : ebp->sch));
778 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
779 /* add pop to the end of the block */
780 addiCodeToeBBlock (ebp, nic, NULL);
783 /* if spilt because not used in the remainder of the
784 block then add a push before this instruction and
785 a pop at the end of the block */
786 if (ssym->remainSpil)
789 iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL);
790 /* add push just before this instruction */
791 addiCodeToeBBlock (ebp, nic, ic);
793 nic = newiCode (IPOP, operandFromSymbol (ssym), NULL);
794 /* add pop to the end of the block */
795 addiCodeToeBBlock (ebp, nic, NULL);
804 /*-----------------------------------------------------------------*/
805 /* getRegPtr - will try for PTR if not a GPR type if not spil */
806 /*-----------------------------------------------------------------*/
808 getRegPtr (iCode * ic, eBBlock * ebp, symbol * sym)
814 /* try for a ptr type */
815 if ((reg = allocReg (REG_PTR)))
818 /* try for gpr type */
819 if ((reg = allocReg (REG_GPR)))
822 /* we have to spil */
823 if (!spilSomething (ic, ebp, sym))
826 /* make sure partially assigned registers aren't reused */
827 for (j=0; j<=sym->nRegs; j++)
829 sym->regs[j]->isFree = 0;
831 /* this looks like an infinite loop but
832 in really selectSpil will abort */
836 /*-----------------------------------------------------------------*/
837 /* getRegGpr - will try for GPR if not spil */
838 /*-----------------------------------------------------------------*/
840 getRegGpr (iCode * ic, eBBlock * ebp, symbol * sym)
846 /* try for gpr type */
847 if ((reg = allocReg (REG_GPR)))
850 if (!mcs51_ptrRegReq)
851 if ((reg = allocReg (REG_PTR)))
854 /* we have to spil */
855 if (!spilSomething (ic, ebp, sym))
858 /* make sure partially assigned registers aren't reused */
859 for (j=0; j<=sym->nRegs; j++)
861 sym->regs[j]->isFree = 0;
863 /* this looks like an infinite loop but
864 in really selectSpil will abort */
868 /*-----------------------------------------------------------------*/
869 /* getRegPtrNoSpil - get it cannot split */
870 /*-----------------------------------------------------------------*/
871 static regs *getRegPtrNoSpil()
875 /* try for a ptr type */
876 if ((reg = allocReg (REG_PTR)))
879 /* try for gpr type */
880 if ((reg = allocReg (REG_GPR)))
885 /* just to make the compiler happy */
889 /*-----------------------------------------------------------------*/
890 /* getRegGprNoSpil - get it cannot split */
891 /*-----------------------------------------------------------------*/
892 static regs *getRegGprNoSpil()
896 if ((reg = allocReg (REG_GPR)))
899 if (!mcs51_ptrRegReq)
900 if ((reg = allocReg (REG_PTR)))
905 /* just to make the compiler happy */
909 /*-----------------------------------------------------------------*/
910 /* symHasReg - symbol has a given register */
911 /*-----------------------------------------------------------------*/
913 symHasReg (symbol * sym, regs * reg)
917 for (i = 0; i < sym->nRegs; i++)
918 if (sym->regs[i] == reg)
924 /*-----------------------------------------------------------------*/
925 /* deassignLRs - check the live to and if they have registers & are */
926 /* not spilt then free up the registers */
927 /*-----------------------------------------------------------------*/
929 deassignLRs (iCode * ic, eBBlock * ebp)
935 for (sym = hTabFirstItem (liveRanges, &k); sym;
936 sym = hTabNextItem (liveRanges, &k))
940 /* if it does not end here */
941 if (sym->liveTo > ic->seq)
944 /* if it was spilt on stack then we can
945 mark the stack spil location as free */
950 sym->usl.spillLoc->isFree = 1;
956 if (!bitVectBitValue (_G.regAssigned, sym->key))
959 /* special case check if this is an IFX &
960 the privious one was a pop and the
961 previous one was not spilt then keep track
963 if (ic->op == IFX && ic->prev &&
964 ic->prev->op == IPOP &&
965 !ic->prev->parmPush &&
966 !OP_SYMBOL (IC_LEFT (ic->prev))->isspilt)
967 psym = OP_SYMBOL (IC_LEFT (ic->prev));
973 bitVectUnSetBit (_G.regAssigned, sym->key);
975 /* if the result of this one needs registers
976 and does not have it then assign it right
978 if (IC_RESULT (ic) &&
979 !(SKIP_IC2 (ic) || /* not a special icode */
980 ic->op == JUMPTABLE ||
986 (result = OP_SYMBOL (IC_RESULT (ic))) && /* has a result */
987 result->liveTo > ic->seq && /* and will live beyond this */
988 result->liveTo <= ebp->lSeq && /* does not go beyond this block */
989 result->liveFrom == ic->seq && /* does not start before here */
990 result->regType == sym->regType && /* same register types */
991 result->nRegs && /* which needs registers */
992 !result->isspilt && /* and does not already have them */
994 !bitVectBitValue (_G.regAssigned, result->key) &&
995 /* the number of free regs + number of regs in this LR
996 can accomodate the what result Needs */
997 ((nfreeRegsType (result->regType) +
998 sym->nRegs) >= result->nRegs)
1002 for (i = 0; i < result->nRegs; i++)
1004 result->regs[i] = sym->regs[i];
1006 result->regs[i] = getRegGpr (ic, ebp, result);
1008 _G.regAssigned = bitVectSetBit (_G.regAssigned, result->key);
1009 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, result->key);
1013 /* free the remaining */
1014 for (; i < sym->nRegs; i++)
1018 if (!symHasReg (psym, sym->regs[i]))
1019 freeReg (sym->regs[i]);
1022 freeReg (sym->regs[i]);
1029 /*-----------------------------------------------------------------*/
1030 /* reassignLR - reassign this to registers */
1031 /*-----------------------------------------------------------------*/
1033 reassignLR (operand * op)
1035 symbol *sym = OP_SYMBOL (op);
1038 /* not spilt any more */
1039 sym->isspilt = sym->spillA = sym->blockSpil = sym->remainSpil = 0;
1040 bitVectUnSetBit (_G.spiltSet, sym->key);
1042 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1043 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1047 for (i = 0; i < sym->nRegs; i++)
1048 sym->regs[i]->isFree = 0;
1051 /*-----------------------------------------------------------------*/
1052 /* willCauseSpill - determines if allocating will cause a spill */
1053 /*-----------------------------------------------------------------*/
1055 willCauseSpill (int nr, int rt)
1057 /* first check if there are any avlb registers
1058 of te type required */
1061 /* special case for pointer type
1062 if pointer type not avlb then
1063 check for type gpr */
1064 if (nFreeRegs (rt) >= nr)
1066 if (nFreeRegs (REG_GPR) >= nr)
1071 if (mcs51_ptrRegReq)
1073 if (nFreeRegs (rt) >= nr)
1078 if (nFreeRegs (REG_PTR) +
1079 nFreeRegs (REG_GPR) >= nr)
1084 /* it will cause a spil */
1088 /*-----------------------------------------------------------------*/
1089 /* positionRegs - the allocator can allocate same registers to res- */
1090 /* ult and operand, if this happens make sure they are in the same */
1091 /* position as the operand otherwise chaos results */
1092 /*-----------------------------------------------------------------*/
1094 positionRegs (symbol * result, symbol * opsym)
1096 int count = min (result->nRegs, opsym->nRegs);
1097 int i, j = 0, shared = 0;
1100 /* if the result has been spilt then cannot share */
1105 /* first make sure that they actually share */
1106 for (i = 0; i < count; i++)
1108 for (j = 0; j < count; j++)
1110 if (result->regs[i] == opsym->regs[j] && i != j)
1120 regs *tmp = result->regs[i];
1121 result->regs[i] = result->regs[j];
1122 result->regs[j] = tmp;
1129 /*------------------------------------------------------------------*/
1130 /* verifyRegsAssigned - make sure an iTemp is properly initialized; */
1131 /* it should either have registers or have beed spilled. Otherwise, */
1132 /* there was an uninitialized variable, so just spill this to get */
1133 /* the operand in a valid state. */
1134 /*------------------------------------------------------------------*/
1136 verifyRegsAssigned (operand *op, iCode * ic)
1141 if (!IS_ITEMP (op)) return;
1143 sym = OP_SYMBOL (op);
1144 if (sym->isspilt) return;
1145 if (!sym->nRegs) return;
1146 if (sym->regs[0]) return;
1148 werrorfl (ic->filename, ic->lineno, W_LOCAL_NOINIT,
1149 sym->prereqv ? sym->prereqv->name : sym->name);
1154 /*-----------------------------------------------------------------*/
1155 /* serialRegAssign - serially allocate registers to the variables */
1156 /*-----------------------------------------------------------------*/
1158 serialRegAssign (eBBlock ** ebbs, int count)
1162 /* for all blocks */
1163 for (i = 0; i < count; i++)
1168 if (ebbs[i]->noPath &&
1169 (ebbs[i]->entryLabel != entryLabel &&
1170 ebbs[i]->entryLabel != returnLabel))
1173 /* for all instructions do */
1174 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1179 // update the registers in use at the start of this icode
1180 for (reg=0; reg<mcs51_nRegs; reg++) {
1181 if (regs8051[reg].isFree) {
1182 ic->riu &= ~(1<<regs8051[reg].offset);
1184 ic->riu |= (1<<regs8051[reg].offset);
1188 /* if this is an ipop that means some live
1189 range will have to be assigned again */
1191 reassignLR (IC_LEFT (ic));
1193 /* if result is present && is a true symbol */
1194 if (IC_RESULT (ic) && ic->op != IFX &&
1195 IS_TRUE_SYMOP (IC_RESULT (ic)))
1196 OP_SYMBOL (IC_RESULT (ic))->allocreq++;
1198 /* take away registers from live
1199 ranges that end at this instruction */
1200 deassignLRs (ic, ebbs[i]);
1202 /* some don't need registers */
1203 if (SKIP_IC2 (ic) ||
1204 ic->op == JUMPTABLE ||
1208 (IC_RESULT (ic) && POINTER_SET (ic)))
1211 /* now we need to allocate registers
1212 only for the result */
1213 if (IC_RESULT (ic)) {
1214 symbol *sym = OP_SYMBOL (IC_RESULT (ic));
1220 /* if it does not need or is spilt
1221 or is already assigned to registers
1222 or will not live beyond this instructions */
1225 bitVectBitValue (_G.regAssigned, sym->key) ||
1226 sym->liveTo <= ic->seq)
1229 /* if some liverange has been spilt at the block level
1230 and this one live beyond this block then spil this
1232 if (_G.blockSpil && sym->liveTo > ebbs[i]->lSeq) {
1237 /* if this is a bit variable then don't use precious registers
1238 along with expensive bit-to-char conversions but just spill
1240 if (SPEC_NOUN(sym->etype) == V_BIT) {
1245 /* if trying to allocate this will cause
1246 a spill and there is nothing to spill
1247 or this one is rematerializable then
1249 willCS = willCauseSpill (sym->nRegs, sym->regType);
1250 spillable = computeSpillable (ic);
1251 if (sym->remat || (willCS && bitVectIsZero (spillable))) {
1256 /* If the live range preceeds the point of definition
1257 then ideally we must take into account registers that
1258 have been allocated after sym->liveFrom but freed
1259 before ic->seq. This is complicated, so spill this
1260 symbol instead and let fillGaps handle the allocation. */
1261 if (sym->liveFrom < ic->seq) {
1266 /* if it has a spillocation & is used less than
1267 all other live ranges then spill this */
1269 if (sym->usl.spillLoc) {
1270 symbol *leastUsed = leastUsedLR (liveRangesWith (spillable,
1271 allLRs, ebbs[i], ic));
1272 if (leastUsed && leastUsed->used > sym->used) {
1277 /* if none of the liveRanges have a spillLocation then better
1278 to spill this one than anything else already assigned to registers */
1279 if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) {
1280 /* if this is local to this block then we might find a block spil */
1281 if (!(sym->liveFrom >= ebbs[i]->fSeq && sym->liveTo <= ebbs[i]->lSeq)) {
1288 /* if we need ptr regs for the right side
1290 if (POINTER_GET (ic) && IS_SYMOP (IC_LEFT (ic))
1291 && getSize (OP_SYMBOL (IC_LEFT (ic))->type) <= (unsigned int) PTRSIZE) {
1295 if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic))
1296 && SPEC_OCLS(OP_SYMBOL (IC_LEFT (ic))->etype) == idata) {
1300 if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic))
1301 && SPEC_OCLS(OP_SYMBOL (IC_RIGHT (ic))->etype) == idata) {
1306 /* else we assign registers to it */
1307 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1308 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1310 for (j = 0; j < sym->nRegs; j++) {
1311 sym->regs[j] = NULL;
1312 if (sym->regType == REG_PTR)
1313 sym->regs[j] = getRegPtr (ic, ebbs[i], sym);
1316 if (ic->op == CAST && IS_SYMOP (IC_RIGHT (ic)))
1318 symbol * right = OP_SYMBOL (IC_RIGHT (ic));
1321 sym->regs[j] = allocThisReg (right->regs[j]);
1324 sym->regs[j] = getRegGpr (ic, ebbs[i], sym);
1327 /* if the allocation failed which means
1328 this was spilt then break */
1331 for (i=0; i < sym->nRegs ; i++ )
1332 sym->regs[i] = NULL;
1337 if (!POINTER_SET(ic) && !POINTER_GET(ic)) {
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) {
1342 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1343 OP_SYMBOL (IC_LEFT (ic)));
1345 /* do the same for the right operand */
1346 if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)) &&
1347 OP_SYMBOL (IC_RIGHT (ic))->nRegs) {
1348 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1349 OP_SYMBOL (IC_RIGHT (ic)));
1362 /* Check for and fix any problems with uninitialized operands */
1363 for (i = 0; i < count; i++)
1367 if (ebbs[i]->noPath &&
1368 (ebbs[i]->entryLabel != entryLabel &&
1369 ebbs[i]->entryLabel != returnLabel))
1372 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1379 verifyRegsAssigned (IC_COND (ic), ic);
1383 if (ic->op == JUMPTABLE)
1385 verifyRegsAssigned (IC_JTCOND (ic), ic);
1389 verifyRegsAssigned (IC_RESULT (ic), ic);
1390 verifyRegsAssigned (IC_LEFT (ic), ic);
1391 verifyRegsAssigned (IC_RIGHT (ic), ic);
1396 /*-----------------------------------------------------------------*/
1397 /* fillGaps - Try to fill in the Gaps left by Pass1 */
1398 /*-----------------------------------------------------------------*/
1399 static void fillGaps()
1406 if (getenv("DISABLE_FILL_GAPS")) return;
1408 /* look for liveranges that were spilt by the allocator */
1409 for (sym = hTabFirstItem(liveRanges,&key) ; sym ;
1410 sym = hTabNextItem(liveRanges,&key)) {
1415 if (!sym->spillA || !sym->clashes || sym->remat) continue ;
1417 /* find the liveRanges this one clashes with, that are
1418 still assigned to registers & mark the registers as used*/
1419 for ( i = 0 ; i < sym->clashes->size ; i ++) {
1423 if (bitVectBitValue(sym->clashes,i) == 0 || /* those that clash with this */
1424 bitVectBitValue(_G.totRegAssigned,i) == 0) /* and are still assigned to registers */
1427 clr = hTabItemWithKey(liveRanges,i);
1430 /* mark these registers as used */
1431 for (k = 0 ; k < clr->nRegs ; k++ )
1432 useReg(clr->regs[k]);
1435 if (willCauseSpill(sym->nRegs,sym->regType)) {
1436 /* NOPE :( clear all registers & and continue */
1442 for (i = 0 ; i < sym->defs->size ; i++ )
1444 if (bitVectBitValue(sym->defs,i))
1446 if (!(ic = hTabItemWithKey(iCodehTab,i)))
1453 D(printf("Atemping fillGaps on %s: [",sym->name));
1454 /* THERE IS HOPE !!!! */
1455 for (i=0; i < sym->nRegs ; i++ ) {
1456 if (sym->regType == REG_PTR)
1457 sym->regs[i] = getRegPtrNoSpil ();
1460 sym->regs[i] = NULL;
1461 if (ic && ic->op == CAST && IS_SYMOP (IC_RIGHT (ic)))
1463 symbol * right = OP_SYMBOL (IC_RIGHT (ic));
1466 sym->regs[i] = allocThisReg (right->regs[i]);
1469 sym->regs[i] = getRegGprNoSpil ();
1471 D(printf("%s ", sym->regs[i]->name));
1475 /* For all its definitions check if the registers
1476 allocated needs positioning NOTE: we can position
1477 only ONCE if more than One positioning required
1479 We may need to perform the checks twice; once to
1480 position the registers as needed, the second to
1481 verify any register repositioning is still
1485 for (pass=0; pass<2; pass++) {
1486 D(printf(" checking definitions\n"));
1487 for (i = 0 ; i < sym->defs->size ; i++ ) {
1488 if (bitVectBitValue(sym->defs,i)) {
1489 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1490 D(printf(" ic->seq = %d\n", ic->seq));
1491 if (SKIP_IC(ic)) continue;
1492 assert(isSymbolEqual(sym,OP_SYMBOL(IC_RESULT(ic)))); /* just making sure */
1493 /* if left is assigned to registers */
1494 if (IS_SYMOP(IC_LEFT(ic)))
1496 D(printf(" left = "));
1497 D(printOperand(IC_LEFT(ic),NULL));
1499 if (IS_SYMOP(IC_LEFT(ic)) &&
1500 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_LEFT(ic))->key)) {
1501 pdone += (positionRegs(sym,OP_SYMBOL(IC_LEFT(ic)))>0);
1503 if (IS_SYMOP(IC_RIGHT(ic)))
1505 D(printf(" right = "));
1506 D(printOperand(IC_RIGHT(ic),NULL));
1508 if (IS_SYMOP(IC_RIGHT(ic)) &&
1509 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RIGHT(ic))->key)) {
1510 pdone += (positionRegs(sym,OP_SYMBOL(IC_RIGHT(ic)))>0);
1512 D(printf(" pdone = %d\n", pdone));
1513 if (pdone > 1) break;
1516 D(printf(" checking uses\n"));
1517 for (i = 0 ; i < sym->uses->size ; i++ ) {
1518 if (bitVectBitValue(sym->uses,i)) {
1520 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1521 D(printf(" ic->seq = %d\n", ic->seq));
1522 if (SKIP_IC(ic)) continue;
1523 if (POINTER_SET(ic) || POINTER_GET(ic)) continue ;
1525 /* if result is assigned to registers */
1526 if (IS_SYMOP(IC_RESULT(ic)))
1528 D(printf(" result = "));
1529 D(printOperand(IC_RESULT(ic),NULL));
1531 if (IS_SYMOP(IC_RESULT(ic)) &&
1532 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) {
1533 pdone += (positionRegs(sym,OP_SYMBOL(IC_RESULT(ic)))>0);
1535 D(printf(" pdone = %d\n", pdone));
1536 if (pdone > 1) break;
1539 if (pdone == 0) break; /* second pass only if regs repositioned */
1540 if (pdone > 1) break;
1542 D(printf(" sym->regs = ["));
1543 for (i=0; i < sym->nRegs ; i++ )
1544 D(printf("%s ", sym->regs[i]->name));
1546 /* had to position more than once GIVE UP */
1548 /* UNDO all the changes we made to try this */
1550 for (i=0; i < sym->nRegs ; i++ ) {
1551 sym->regs[i] = NULL;
1554 D(printf ("Fill Gap gave up due to positioning for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1557 D(printf ("FILLED GAP for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1559 _G.totRegAssigned = bitVectSetBit(_G.totRegAssigned,sym->key);
1560 sym->isspilt = sym->spillA = 0 ;
1561 sym->usl.spillLoc->allocreq--;
1566 /*-----------------------------------------------------------------*/
1567 /* rUmaskForOp :- returns register mask for an operand */
1568 /*-----------------------------------------------------------------*/
1570 mcs51_rUmaskForOp (operand * op)
1576 /* only temporaries are assigned registers */
1580 sym = OP_SYMBOL (op);
1582 /* if spilt or no registers assigned to it
1584 if (sym->isspilt || !sym->nRegs)
1587 rumask = newBitVect (mcs51_nRegs);
1589 for (j = 0; j < sym->nRegs; j++)
1591 if (sym->regs[j]) /* EEP - debug */
1592 rumask = bitVectSetBit (rumask, sym->regs[j]->rIdx);
1598 /*-----------------------------------------------------------------*/
1599 /* regsUsedIniCode :- returns bit vector of registers used in iCode */
1600 /*-----------------------------------------------------------------*/
1602 regsUsedIniCode (iCode * ic)
1604 bitVect *rmask = newBitVect (mcs51_nRegs);
1606 /* do the special cases first */
1609 rmask = bitVectUnion (rmask,
1610 mcs51_rUmaskForOp (IC_COND (ic)));
1614 /* for the jumptable */
1615 if (ic->op == JUMPTABLE)
1617 rmask = bitVectUnion (rmask,
1618 mcs51_rUmaskForOp (IC_JTCOND (ic)));
1623 /* of all other cases */
1625 rmask = bitVectUnion (rmask,
1626 mcs51_rUmaskForOp (IC_LEFT (ic)));
1630 rmask = bitVectUnion (rmask,
1631 mcs51_rUmaskForOp (IC_RIGHT (ic)));
1634 rmask = bitVectUnion (rmask,
1635 mcs51_rUmaskForOp (IC_RESULT (ic)));
1641 /*-----------------------------------------------------------------*/
1642 /* createRegMask - for each instruction will determine the regsUsed */
1643 /*-----------------------------------------------------------------*/
1645 createRegMask (eBBlock ** ebbs, int count)
1649 /* for all blocks */
1650 for (i = 0; i < count; i++)
1654 if (ebbs[i]->noPath &&
1655 (ebbs[i]->entryLabel != entryLabel &&
1656 ebbs[i]->entryLabel != returnLabel))
1659 /* for all instructions */
1660 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1665 if (SKIP_IC2 (ic) || !ic->rlive)
1668 /* first mark the registers used in this
1670 ic->rUsed = regsUsedIniCode (ic);
1671 _G.funcrUsed = bitVectUnion (_G.funcrUsed, ic->rUsed);
1673 /* now create the register mask for those
1674 registers that are in use : this is a
1675 super set of ic->rUsed */
1676 ic->rMask = newBitVect (mcs51_nRegs + 1);
1678 /* for all live Ranges alive at this point */
1679 for (j = 1; j < ic->rlive->size; j++)
1684 /* if not alive then continue */
1685 if (!bitVectBitValue (ic->rlive, j))
1688 /* find the live range we are interested in */
1689 if (!(sym = hTabItemWithKey (liveRanges, j)))
1691 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
1692 "createRegMask cannot find live range");
1693 fprintf(stderr, "\tmissing live range: key=%d\n", j);
1697 /* if no register assigned to it */
1698 if (!sym->nRegs || sym->isspilt)
1701 /* for all the registers allocated to it */
1702 for (k = 0; k < sym->nRegs; k++)
1705 bitVectSetBit (ic->rMask, sym->regs[k]->rIdx);
1711 /*-----------------------------------------------------------------*/
1712 /* rematStr - returns the rematerialized string for a remat var */
1713 /*-----------------------------------------------------------------*/
1715 rematStr (symbol * sym)
1718 iCode *ic = sym->rematiCode;
1725 /* if plus or minus print the right hand side */
1726 if (ic->op == '+' || ic->op == '-')
1728 SNPRINTF (s, sizeof(buffer) - strlen(buffer),
1729 "0x%04x %c ", (int) operandLitValue (IC_RIGHT (ic)),
1732 ic = OP_SYMBOL (IC_LEFT (ic))->rematiCode;
1736 /* cast then continue */
1737 if (IS_CAST_ICODE(ic)) {
1738 ic = OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
1741 /* we reached the end */
1742 SNPRINTF (s, sizeof(buffer) - strlen(buffer),
1743 "%s", OP_SYMBOL (IC_LEFT (ic))->rname);
1750 /*-----------------------------------------------------------------*/
1751 /* regTypeNum - computes the type & number of registers required */
1752 /*-----------------------------------------------------------------*/
1754 regTypeNum (eBBlock *ebbs)
1760 /* for each live range do */
1761 for (sym = hTabFirstItem (liveRanges, &k); sym;
1762 sym = hTabNextItem (liveRanges, &k))
1765 /* if used zero times then no registers needed */
1766 if ((sym->liveTo - sym->liveFrom) == 0)
1770 /* if the live range is a temporary */
1774 /* if the type is marked as a conditional */
1775 if (sym->regType == REG_CND)
1778 /* if used in return only then we don't
1780 if (sym->ruonly || sym->accuse)
1782 if (IS_AGGREGATE (sym->type) || sym->isptr)
1783 sym->type = aggrToPtr (sym->type, FALSE);
1787 /* if the symbol has only one definition &
1788 that definition is a get_pointer */
1789 if (bitVectnBitsOn (sym->defs) == 1 &&
1790 (ic = hTabItemWithKey (iCodehTab,
1791 bitVectFirstBit (sym->defs))) &&
1793 !IS_BITVAR (sym->etype) &&
1794 (aggrToPtrDclType (operandType (IC_LEFT (ic)), FALSE) == POINTER))
1797 if (ptrPseudoSymSafe (sym, ic))
1799 ptrPseudoSymConvert (sym, ic, rematStr (OP_SYMBOL (IC_LEFT (ic))));
1803 /* if in data space or idata space then try to
1804 allocate pointer register */
1808 /* if not then we require registers */
1809 sym->nRegs = ((IS_AGGREGATE (sym->type) || sym->isptr) ?
1810 getSize (sym->type = aggrToPtr (sym->type, FALSE)) :
1811 getSize (sym->type));
1815 fprintf (stderr, "allocated more than 4 or 0 registers for type ");
1816 printTypeChain (sym->type, stderr);
1817 fprintf (stderr, "\n");
1820 /* determine the type of register required */
1821 if (sym->nRegs == 1 &&
1822 IS_PTR (sym->type) &&
1824 sym->regType = REG_PTR;
1826 sym->regType = REG_GPR;
1830 /* for the first run we don't provide */
1831 /* registers for true symbols we will */
1832 /* see how things go */
1838 /*-----------------------------------------------------------------*/
1839 /* freeAllRegs - mark all registers as free */
1840 /*-----------------------------------------------------------------*/
1846 for (i = 0; i < mcs51_nRegs; i++)
1847 regs8051[i].isFree = 1;
1850 /*-----------------------------------------------------------------*/
1851 /* deallocStackSpil - this will set the stack pointer back */
1852 /*-----------------------------------------------------------------*/
1854 DEFSETFUNC (deallocStackSpil)
1862 /*-----------------------------------------------------------------*/
1863 /* farSpacePackable - returns the packable icode for far variables */
1864 /*-----------------------------------------------------------------*/
1866 farSpacePackable (iCode * ic)
1870 /* go thru till we find a definition for the
1871 symbol on the right */
1872 for (dic = ic->prev; dic; dic = dic->prev)
1874 /* if the definition is a call then no */
1875 if ((dic->op == CALL || dic->op == PCALL) &&
1876 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1881 /* if shift by unknown amount then not */
1882 if ((dic->op == LEFT_OP || dic->op == RIGHT_OP) &&
1883 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1886 /* if pointer get and size > 1 */
1887 if (POINTER_GET (dic) &&
1888 getSize (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)) > 1)
1891 if (POINTER_SET (dic) &&
1892 getSize (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)) > 1)
1897 if (IC_COND (dic) &&
1898 IS_TRUE_SYMOP (IC_COND (dic)) &&
1899 isOperandInFarSpace (IC_COND (dic)))
1902 else if (dic->op == JUMPTABLE)
1904 if (IC_JTCOND (dic) &&
1905 IS_TRUE_SYMOP (IC_JTCOND (dic)) &&
1906 isOperandInFarSpace (IC_JTCOND (dic)))
1911 /* if any tree is a true symbol in far space */
1912 if (IC_RESULT (dic) &&
1913 IS_TRUE_SYMOP (IC_RESULT (dic)) &&
1914 isOperandInFarSpace (IC_RESULT (dic)))
1917 if (IC_RIGHT (dic) &&
1918 IS_TRUE_SYMOP (IC_RIGHT (dic)) &&
1919 isOperandInFarSpace (IC_RIGHT (dic)) &&
1920 !isOperandEqual (IC_RIGHT (dic), IC_RESULT (ic)))
1923 if (IC_LEFT (dic) &&
1924 IS_TRUE_SYMOP (IC_LEFT (dic)) &&
1925 isOperandInFarSpace (IC_LEFT (dic)) &&
1926 !isOperandEqual (IC_LEFT (dic), IC_RESULT (ic)))
1930 if (isOperandEqual (IC_RIGHT (ic), IC_RESULT (dic)))
1932 if ((dic->op == LEFT_OP ||
1933 dic->op == RIGHT_OP ||
1935 IS_OP_LITERAL (IC_RIGHT (dic)))
1945 /*-----------------------------------------------------------------*/
1946 /* packRegsForAssign - register reduction for assignment */
1947 /*-----------------------------------------------------------------*/
1949 packRegsForAssign (iCode * ic, eBBlock * ebp)
1953 if (!IS_ITEMP (IC_RIGHT (ic)) ||
1954 OP_SYMBOL (IC_RIGHT (ic))->isind ||
1955 OP_LIVETO (IC_RIGHT (ic)) > ic->seq)
1960 /* if the true symbol is defined in far space or on stack
1961 then we should not since this will increase register pressure */
1962 if (isOperandInFarSpace(IC_RESULT(ic)) && !farSpacePackable(ic)) {
1966 /* find the definition of iTempNN scanning backwards if we find a
1967 a use of the true symbol in before we find the definition then
1969 for (dic = ic->prev; dic; dic = dic->prev)
1971 int crossedCall = 0;
1973 /* We can pack across a function call only if it's a local */
1974 /* variable or our parameter. Never pack global variables */
1975 /* or parameters to a function we call. */
1976 if ((dic->op == CALL || dic->op == PCALL))
1978 if (!OP_SYMBOL (IC_RESULT (ic))->ismyparm
1979 && !OP_SYMBOL (IC_RESULT (ic))->islocal)
1990 if (IS_SYMOP (IC_COND (dic)) &&
1991 (IC_COND (dic)->key == IC_RESULT (ic)->key ||
1992 IC_COND (dic)->key == IC_RIGHT (ic)->key))
2000 if (IS_TRUE_SYMOP (IC_RESULT (dic)) &&
2001 IS_OP_VOLATILE (IC_RESULT (dic)))
2007 if (IS_SYMOP (IC_RESULT (dic)) &&
2008 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
2010 if (POINTER_SET (dic))
2016 if (IS_SYMOP (IC_RIGHT (dic)) &&
2017 (IC_RIGHT (dic)->key == IC_RESULT (ic)->key ||
2018 IC_RIGHT (dic)->key == IC_RIGHT (ic)->key))
2024 if (IS_SYMOP (IC_LEFT (dic)) &&
2025 (IC_LEFT (dic)->key == IC_RESULT (ic)->key ||
2026 IC_LEFT (dic)->key == IC_RIGHT (ic)->key))
2032 if (IS_SYMOP (IC_RESULT (dic)) &&
2033 IC_RESULT (dic)->key == IC_RESULT (ic)->key)
2049 return 0; /* did not find */
2051 /* if assignment then check that right is not a bit */
2052 if (ASSIGNMENT (ic) && !POINTER_SET (ic))
2054 sym_link *etype = operandType (IC_RESULT (dic));
2055 if (IS_BITFIELD (etype))
2057 /* if result is a bit too then it's ok */
2058 etype = operandType (IC_RESULT (ic));
2059 if (!IS_BITFIELD (etype))
2066 /* if assignment then check that right is not a bit */
2067 if (ASSIGNMENT (dic) && !POINTER_SET (dic))
2069 sym_link *etype = operandType (IC_RIGHT (dic));
2070 if (IS_BITFIELD (etype))
2072 /* if result is a bit too then it's ok */
2073 etype = operandType (IC_RESULT (dic));
2074 if (!IS_BITFIELD (etype))
2079 /* if the result is on stack or iaccess then it must be
2080 the same atleast one of the operands */
2081 if (OP_SYMBOL (IC_RESULT (ic))->onStack ||
2082 OP_SYMBOL (IC_RESULT (ic))->iaccess)
2085 /* the operation has only one symbol
2086 operator then we can pack */
2087 if ((IC_LEFT (dic) && !IS_SYMOP (IC_LEFT (dic))) ||
2088 (IC_RIGHT (dic) && !IS_SYMOP (IC_RIGHT (dic))))
2091 if (!((IC_LEFT (dic) &&
2092 IC_RESULT (ic)->key == IC_LEFT (dic)->key) ||
2094 IC_RESULT (ic)->key == IC_RIGHT (dic)->key)))
2098 /* found the definition */
2099 /* replace the result with the result of */
2100 /* this assignment and remove this assignment */
2101 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2102 ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
2104 if (IS_ITEMP (IC_RESULT (dic)) && OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq)
2106 OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq;
2108 // TODO: and the otherway around?
2110 /* delete from liverange table also
2111 delete from all the points inbetween and the new
2113 for (sic = dic; sic != ic; sic = sic->next)
2115 bitVectUnSetBit (sic->rlive, IC_RESULT (ic)->key);
2116 if (IS_ITEMP (IC_RESULT (dic)))
2117 bitVectSetBit (sic->rlive, IC_RESULT (dic)->key);
2120 remiCodeFromeBBlock (ebp, ic);
2121 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2122 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
2123 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
2127 /*------------------------------------------------------------------*/
2128 /* findAssignToSym : scanning backwards looks for first assig found */
2129 /*------------------------------------------------------------------*/
2131 findAssignToSym (operand * op, iCode * ic)
2135 /* This routine is used to find sequences like
2137 ...; (intervening ops don't use iTempAA or modify FOO)
2138 blah = blah + iTempAA;
2140 and eliminate the use of iTempAA, freeing up its register for
2144 for (dic = ic->prev; dic; dic = dic->prev)
2147 /* if definition by assignment */
2148 if (dic->op == '=' &&
2149 !POINTER_SET (dic) &&
2150 IC_RESULT (dic)->key == op->key
2151 /* && IS_TRUE_SYMOP(IC_RIGHT(dic)) */
2153 break; /* found where this temp was defined */
2155 /* if we find an usage then we cannot delete it */
2159 if (IC_COND (dic) && IC_COND (dic)->key == op->key)
2162 else if (dic->op == JUMPTABLE)
2164 if (IC_JTCOND (dic) && IC_JTCOND (dic)->key == op->key)
2169 if (IC_LEFT (dic) && IC_LEFT (dic)->key == op->key)
2172 if (IC_RIGHT (dic) && IC_RIGHT (dic)->key == op->key)
2175 if (POINTER_SET (dic) && IC_RESULT (dic)->key == op->key)
2181 return NULL; /* didn't find any assignment to op */
2183 /* we are interested only if defined in far space */
2184 /* or in stack space in case of + & - */
2186 /* if assigned to a non-symbol then don't repack regs */
2187 if (!IS_SYMOP (IC_RIGHT (dic)))
2190 /* if the symbol is volatile then we should not */
2191 if (isOperandVolatile (IC_RIGHT (dic), TRUE))
2193 /* XXX TODO --- should we be passing FALSE to isOperandVolatile()?
2194 What does it mean for an iTemp to be volatile, anyway? Passing
2195 TRUE is more cautious but may prevent possible optimizations */
2197 /* if the symbol is in far space then we should not */
2198 if (isOperandInFarSpace (IC_RIGHT (dic)))
2201 /* for + & - operations make sure that
2202 if it is on the stack it is the same
2203 as one of the three operands */
2204 if ((ic->op == '+' || ic->op == '-') &&
2205 OP_SYMBOL (IC_RIGHT (dic))->onStack)
2208 if (IC_RESULT (ic)->key != IC_RIGHT (dic)->key &&
2209 IC_LEFT (ic)->key != IC_RIGHT (dic)->key &&
2210 IC_RIGHT (ic)->key != IC_RIGHT (dic)->key)
2214 /* now make sure that the right side of dic
2215 is not defined between ic & dic */
2218 iCode *sic = dic->next;
2220 for (; sic != ic; sic = sic->next)
2221 if (IC_RESULT (sic) &&
2222 IC_RESULT (sic)->key == IC_RIGHT (dic)->key)
2229 /*-----------------------------------------------------------------*/
2230 /* reassignAliasedSym - used by packRegsForSupport to replace */
2231 /* redundant iTemp with equivalent symbol */
2232 /*-----------------------------------------------------------------*/
2234 reassignAliasedSym (eBBlock *ebp, iCode *assignment, iCode *use, operand *op)
2237 unsigned oldSymKey, newSymKey;
2239 oldSymKey = op->key;
2240 newSymKey = IC_RIGHT(assignment)->key;
2242 /* only track live ranges of compiler-generated temporaries */
2243 if (!IS_ITEMP(IC_RIGHT(assignment)))
2246 /* update the live-value bitmaps */
2247 for (ic = assignment; ic != use; ic = ic->next) {
2248 bitVectUnSetBit (ic->rlive, oldSymKey);
2250 ic->rlive = bitVectSetBit (ic->rlive, newSymKey);
2253 /* update the sym of the used operand */
2254 OP_SYMBOL(op) = OP_SYMBOL(IC_RIGHT(assignment));
2255 op->key = OP_SYMBOL(op)->key;
2256 OP_SYMBOL(op)->accuse = 0;
2258 /* update the sym's liverange */
2259 if ( OP_LIVETO(op) < ic->seq )
2260 setToRange(op, ic->seq, FALSE);
2262 /* remove the assignment iCode now that its result is unused */
2263 remiCodeFromeBBlock (ebp, assignment);
2264 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(assignment))->defs, assignment->key);
2265 hTabDeleteItem (&iCodehTab, assignment->key, assignment, DELETE_ITEM, NULL);
2269 /*-----------------------------------------------------------------*/
2270 /* packRegsForSupport :- reduce some registers for support calls */
2271 /*-----------------------------------------------------------------*/
2273 packRegsForSupport (iCode * ic, eBBlock * ebp)
2277 /* for the left & right operand :- look to see if the
2278 left was assigned a true symbol in far space in that
2279 case replace them */
2281 if (IS_ITEMP (IC_LEFT (ic)) &&
2282 OP_SYMBOL (IC_LEFT (ic))->liveTo <= ic->seq)
2284 dic = findAssignToSym (IC_LEFT (ic), ic);
2288 /* found it we need to remove it from the block */
2289 reassignAliasedSym (ebp, dic, ic, IC_LEFT(ic));
2294 /* do the same for the right operand */
2295 if (IS_ITEMP (IC_RIGHT (ic)) &&
2296 OP_SYMBOL (IC_RIGHT (ic))->liveTo <= ic->seq)
2298 iCode *dic = findAssignToSym (IC_RIGHT (ic), ic);
2302 /* if this is a subtraction & the result
2303 is a true symbol in far space then don't pack */
2304 if (ic->op == '-' && IS_TRUE_SYMOP (IC_RESULT (dic)))
2306 sym_link *etype = getSpec (operandType (IC_RESULT (dic)));
2307 if (IN_FARSPACE (SPEC_OCLS (etype)))
2310 /* found it we need to remove it from the
2312 reassignAliasedSym (ebp, dic, ic, IC_RIGHT(ic));
2321 #define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
2324 /*-----------------------------------------------------------------*/
2325 /* packRegsForOneuse : - will reduce some registers for single Use */
2326 /*-----------------------------------------------------------------*/
2328 packRegsForOneuse (iCode * ic, operand * op, eBBlock * ebp)
2332 /* if returning a literal then do nothing */
2336 /* if rematerializable or already return use then do nothing */
2337 if (OP_SYMBOL(op)->remat || OP_SYMBOL(op)->ruonly)
2340 /* only upto 2 bytes since we cannot predict
2341 the usage of b, & acc */
2342 if (getSize (operandType (op)) > (fReturnSizeMCS51 - 2))
2345 if (ic->op != RETURN &&
2347 !POINTER_SET (ic) &&
2351 if (ic->op == SEND && ic->argreg != 1) return NULL;
2353 /* this routine will mark the a symbol as used in one
2354 instruction use only && if the defintion is local
2355 (ie. within the basic block) && has only one definition &&
2356 that definiion is either a return value from a
2357 function or does not contain any variables in
2359 if (bitVectnBitsOn (OP_USES (op)) > 1)
2362 /* if it has only one defintion */
2363 if (bitVectnBitsOn (OP_DEFS (op)) > 1)
2364 return NULL; /* has more than one definition */
2366 /* get that definition */
2368 hTabItemWithKey (iCodehTab,
2369 bitVectFirstBit (OP_DEFS (op)))))
2372 /* if that only usage is a cast */
2373 if (dic->op == CAST) {
2374 /* to a bigger type */
2375 if (getSize(OP_SYM_TYPE(IC_RESULT(dic))) >
2376 getSize(OP_SYM_TYPE(IC_RIGHT(dic)))) {
2377 /* than we can not, since we cannot predict the usage of b & acc */
2382 /* found the definition now check if it is local */
2383 if (dic->seq < ebp->fSeq ||
2384 dic->seq > ebp->lSeq)
2385 return NULL; /* non-local */
2387 /* now check if it is the return from
2389 if (dic->op == CALL || dic->op == PCALL)
2391 if (ic->op != SEND && ic->op != RETURN &&
2392 !POINTER_SET(ic) && !POINTER_GET(ic))
2394 OP_SYMBOL (op)->ruonly = 1;
2400 /* otherwise check that the definition does
2401 not contain any symbols in far space */
2402 if (isOperandInFarSpace (IC_LEFT (dic)) ||
2403 isOperandInFarSpace (IC_RIGHT (dic)) ||
2404 IS_OP_RUONLY (IC_LEFT (ic)) ||
2405 IS_OP_RUONLY (IC_RIGHT (ic)))
2410 /* if pointer set then make sure the pointer
2412 if (POINTER_SET (dic) &&
2413 !IS_DATA_PTR (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)))
2416 if (POINTER_GET (dic) &&
2417 !IS_DATA_PTR (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)))
2421 /* Make sure no overlapping liverange is already assigned to DPTR */
2422 if (OP_SYMBOL(op)->clashes)
2427 for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ )
2429 if (bitVectBitValue(OP_SYMBOL(op)->clashes,i))
2431 sym = hTabItemWithKey(liveRanges,i);
2440 /* also make sure the intervenening instructions
2441 don't have any thing in far space */
2442 for (dic = dic->next; dic && dic != ic && sic != ic; dic = dic->next)
2445 /* if there is an intervening function call then no */
2446 if (dic->op == CALL || dic->op == PCALL)
2448 /* if pointer set then make sure the pointer
2450 if (POINTER_SET (dic) &&
2451 !IS_DATA_PTR (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)))
2454 if (POINTER_GET (dic) &&
2455 !IS_DATA_PTR (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)))
2458 /* if address of & the result is remat the okay */
2459 if (dic->op == ADDRESS_OF &&
2460 OP_SYMBOL (IC_RESULT (dic))->remat)
2463 /* if operand has size of three or more & this
2464 operation is a '*','/' or '%' then 'b' may
2466 if ((dic->op == '%' || dic->op == '/' || dic->op == '*') &&
2467 getSize (operandType (op)) >= 3)
2470 /* if left or right or result is in far space */
2471 if (isOperandInFarSpace (IC_LEFT (dic)) ||
2472 isOperandInFarSpace (IC_RIGHT (dic)) ||
2473 isOperandInFarSpace (IC_RESULT (dic)) ||
2474 IS_OP_RUONLY (IC_LEFT (dic)) ||
2475 IS_OP_RUONLY (IC_RIGHT (dic)) ||
2476 IS_OP_RUONLY (IC_RESULT (dic)))
2480 /* if left or right or result is on stack */
2481 if (isOperandOnStack(IC_LEFT(dic)) ||
2482 isOperandOnStack(IC_RIGHT(dic)) ||
2483 isOperandOnStack(IC_RESULT(dic))) {
2488 OP_SYMBOL (op)->ruonly = 1;
2492 /*-----------------------------------------------------------------*/
2493 /* isBitwiseOptimizable - requirements of JEAN LOUIS VERN */
2494 /*-----------------------------------------------------------------*/
2496 isBitwiseOptimizable (iCode * ic)
2498 sym_link *ltype = getSpec (operandType (IC_LEFT (ic)));
2499 sym_link *rtype = getSpec (operandType (IC_RIGHT (ic)));
2501 /* bitwise operations are considered optimizable
2502 under the following conditions (Jean-Louis VERN)
2514 if (IS_LITERAL(rtype) ||
2515 (IS_BITVAR (ltype) && IN_BITSPACE (SPEC_OCLS (ltype))))
2521 /*-----------------------------------------------------------------*/
2522 /* isCommutativeOp - tests whether this op cares what order its */
2523 /* operands are in */
2524 /*-----------------------------------------------------------------*/
2525 bool isCommutativeOp(unsigned int op)
2527 if (op == '+' || op == '*' || op == EQ_OP ||
2528 op == '^' || op == '|' || op == BITWISEAND)
2534 /*-----------------------------------------------------------------*/
2535 /* operandUsesAcc - determines whether the code generated for this */
2536 /* operand will have to use the accumulator */
2537 /*-----------------------------------------------------------------*/
2538 bool operandUsesAcc(operand *op)
2544 symbol *sym = OP_SYMBOL(op);
2548 return TRUE; /* duh! */
2550 if (IN_STACK(sym->etype) || sym->onStack ||
2551 (SPIL_LOC(op) && SPIL_LOC(op)->onStack))
2552 return TRUE; /* acc is used to calc stack offset */
2557 sym = SPIL_LOC(op); /* if spilled, look at spill location */
2559 return FALSE; /* more checks? */
2563 symspace = SPEC_OCLS(sym->etype);
2565 if (sym->iaccess && symspace->paged)
2566 return TRUE; /* must fetch paged indirect sym via accumulator */
2568 if (IN_BITSPACE(symspace))
2569 return TRUE; /* fetching bit vars uses the accumulator */
2571 if (IN_FARSPACE(symspace) || IN_CODESPACE(symspace))
2572 return TRUE; /* fetched via accumulator and dptr */
2578 /*-----------------------------------------------------------------*/
2579 /* packRegsForAccUse - pack registers for acc use */
2580 /*-----------------------------------------------------------------*/
2582 packRegsForAccUse (iCode * ic)
2586 /* if this is an aggregate, e.g. a one byte char array */
2587 if (IS_AGGREGATE(operandType(IC_RESULT(ic)))) {
2591 /* if we are calling a reentrant function that has stack parameters */
2592 if (ic->op == CALL &&
2593 IFFUNC_ISREENT(operandType(IC_LEFT(ic))) &&
2594 FUNC_HASSTACKPARM(operandType(IC_LEFT(ic))))
2597 if (ic->op == PCALL &&
2598 IFFUNC_ISREENT(operandType(IC_LEFT(ic))->next) &&
2599 FUNC_HASSTACKPARM(operandType(IC_LEFT(ic))->next))
2602 /* if + or - then it has to be one byte result */
2603 if ((ic->op == '+' || ic->op == '-')
2604 && getSize (operandType (IC_RESULT (ic))) > 1)
2607 /* if shift operation make sure right side is not a literal */
2608 if (ic->op == RIGHT_OP &&
2609 (isOperandLiteral (IC_RIGHT (ic)) ||
2610 getSize (operandType (IC_RESULT (ic))) > 1))
2613 if (ic->op == LEFT_OP &&
2614 (isOperandLiteral (IC_RIGHT (ic)) ||
2615 getSize (operandType (IC_RESULT (ic))) > 1))
2618 if (IS_BITWISE_OP (ic) &&
2619 getSize (operandType (IC_RESULT (ic))) > 1)
2623 /* has only one definition */
2624 if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2627 /* has only one use */
2628 if (bitVectnBitsOn (OP_USES (IC_RESULT (ic))) > 1)
2631 /* and the usage immediately follows this iCode */
2632 if (!(uic = hTabItemWithKey (iCodehTab,
2633 bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2636 if (ic->next != uic)
2639 /* if it is a conditional branch then we definitely can */
2643 if (uic->op == JUMPTABLE)
2646 if (POINTER_SET (uic) &&
2647 getSize (aggrToPtr (operandType (IC_RESULT (uic)), FALSE)) > 1)
2650 /* if the usage is not is an assignment
2651 or an arithmetic / bitwise / shift operation then not */
2652 if (uic->op != '=' &&
2653 !IS_ARITHMETIC_OP (uic) &&
2654 !IS_BITWISE_OP (uic) &&
2655 uic->op != LEFT_OP &&
2656 uic->op != RIGHT_OP)
2659 /* if used in ^ operation then make sure right is not a
2660 literal (WIML: Why is this?) */
2661 if (uic->op == '^' && isOperandLiteral (IC_RIGHT (uic)))
2664 /* if shift operation make sure right side is not a literal */
2665 /* WIML: Why is this? */
2666 if (uic->op == RIGHT_OP &&
2667 (isOperandLiteral (IC_RIGHT (uic)) ||
2668 getSize (operandType (IC_RESULT (uic))) > 1))
2670 if (uic->op == LEFT_OP &&
2671 (isOperandLiteral (IC_RIGHT (uic)) ||
2672 getSize (operandType (IC_RESULT (uic))) > 1))
2675 /* make sure that the result of this icode is not on the
2676 stack, since acc is used to compute stack offset */
2678 if (IS_TRUE_SYMOP (IC_RESULT (uic)) &&
2679 OP_SYMBOL (IC_RESULT (uic))->onStack)
2682 if (isOperandOnStack(IC_RESULT(uic)))
2686 /* if the usage has only one operand then we can */
2687 if (IC_LEFT (uic) == NULL ||
2688 IC_RIGHT (uic) == NULL)
2691 /* if the other operand uses the accumulator then we cannot */
2692 if ( (IC_LEFT(uic)->key == IC_RESULT(ic)->key &&
2693 operandUsesAcc(IC_RIGHT(uic))) ||
2694 (IC_RIGHT(uic)->key == IC_RESULT(ic)->key &&
2695 operandUsesAcc(IC_LEFT(uic))) )
2698 /* make sure this is on the left side if not commutative */
2699 /* except for '-', which has been written to be able to
2700 handle reversed operands */
2701 if (!(isCommutativeOp(ic->op) || ic->op == '-') &&
2702 IC_LEFT (uic)->key != IC_RESULT (ic)->key)
2706 // this is too dangerous and need further restrictions
2709 /* if one of them is a literal then we can */
2710 if ((IC_LEFT (uic) && IS_OP_LITERAL (IC_LEFT (uic))) ||
2711 (IC_RIGHT (uic) && IS_OP_LITERAL (IC_RIGHT (uic))))
2713 OP_SYMBOL (IC_RESULT (ic))->accuse = 1;
2719 OP_SYMBOL (IC_RESULT (ic))->accuse = 1;
2723 /*-----------------------------------------------------------------*/
2724 /* packForPush - heuristics to reduce iCode for pushing */
2725 /*-----------------------------------------------------------------*/
2727 packForPush (iCode * ic, eBBlock ** ebpp, int blockno)
2731 struct eBBlock * ebp=ebpp[blockno];
2733 if (ic->op != IPUSH || !IS_ITEMP (IC_LEFT (ic)))
2736 /* must have only definition & one usage */
2737 if (bitVectnBitsOn (OP_DEFS (IC_LEFT (ic))) != 1 ||
2738 bitVectnBitsOn (OP_USES (IC_LEFT (ic))) != 1)
2741 /* find the definition */
2742 if (!(dic = hTabItemWithKey (iCodehTab,
2743 bitVectFirstBit (OP_DEFS (IC_LEFT (ic))))))
2746 if (dic->op != '=' || POINTER_SET (dic))
2749 if (dic->seq < ebp->fSeq) { // Evelyn did this
2751 for (i=0; i<blockno; i++) {
2752 if (dic->seq >= ebpp[i]->fSeq && dic->seq <= ebpp[i]->lSeq) {
2757 wassert (i!=blockno); // no way to recover from here
2760 if (IS_SYMOP(IC_RIGHT(dic))) {
2761 /* make sure the right side does not have any definitions
2763 dbv = OP_DEFS(IC_RIGHT(dic));
2764 for (lic = ic; lic && lic != dic ; lic = lic->prev) {
2765 if (bitVectBitValue(dbv,lic->key))
2768 /* make sure they have the same type */
2769 if (IS_SPEC(operandType(IC_LEFT(ic))))
2771 sym_link *itype=operandType(IC_LEFT(ic));
2772 sym_link *ditype=operandType(IC_RIGHT(dic));
2774 if (SPEC_USIGN(itype)!=SPEC_USIGN(ditype) ||
2775 SPEC_LONG(itype)!=SPEC_LONG(ditype))
2778 /* extend the live range of replaced operand if needed */
2779 if (OP_SYMBOL(IC_RIGHT(dic))->liveTo < ic->seq) {
2780 OP_SYMBOL(IC_RIGHT(dic))->liveTo = ic->seq;
2782 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2785 /* we now we know that it has one & only one def & use
2786 and the that the definition is an assignment */
2787 ReplaceOpWithCheaperOp(&IC_LEFT (ic), IC_RIGHT (dic));
2788 remiCodeFromeBBlock (ebp, dic);
2789 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
2792 /*-----------------------------------------------------------------*/
2793 /* packRegisters - does some transformations to reduce register */
2795 /*-----------------------------------------------------------------*/
2797 packRegisters (eBBlock ** ebpp, int blockno)
2801 eBBlock *ebp=ebpp[blockno];
2807 /* look for assignments of the form */
2808 /* iTempNN = TRueSym (someoperation) SomeOperand */
2810 /* TrueSym := iTempNN:1 */
2811 for (ic = ebp->sch; ic; ic = ic->next)
2813 /* find assignment of the form TrueSym := iTempNN:1 */
2814 if (ic->op == '=' && !POINTER_SET (ic))
2815 change += packRegsForAssign (ic, ebp);
2822 for (ic = ebp->sch; ic; ic = ic->next)
2824 /* Fix for bug #979599: */
2827 /* Look for two subsequent iCodes with */
2829 /* _c = iTemp & op; */
2830 /* and replace them by */
2833 if ((ic->op == BITWISEAND || ic->op == '|' || ic->op == '^') &&
2835 ic->prev->op == '=' &&
2836 IS_ITEMP (IC_LEFT (ic)) &&
2837 IC_LEFT (ic) == IC_RESULT (ic->prev) &&
2838 isOperandEqual (IC_RESULT(ic), IC_RIGHT(ic->prev)))
2840 iCode* ic_prev = ic->prev;
2841 symbol* prev_result_sym = OP_SYMBOL (IC_RESULT (ic_prev));
2843 ReplaceOpWithCheaperOp (&IC_LEFT (ic), IC_RESULT (ic));
2844 if (IC_RESULT (ic_prev) != IC_RIGHT (ic))
2846 bitVectUnSetBit (OP_USES (IC_RESULT (ic_prev)), ic->key);
2847 if (/*IS_ITEMP (IC_RESULT (ic_prev)) && */
2848 prev_result_sym->liveTo == ic->seq)
2850 prev_result_sym->liveTo = ic_prev->seq;
2853 bitVectSetBit (OP_USES (IC_RESULT (ic)), ic->key);
2855 bitVectSetBit (ic->rlive, IC_RESULT (ic)->key);
2857 if (bitVectIsZero (OP_USES (IC_RESULT (ic_prev))))
2859 bitVectUnSetBit (ic->rlive, IC_RESULT (ic)->key);
2860 bitVectUnSetBit (OP_DEFS (IC_RESULT (ic_prev)), ic_prev->key);
2861 remiCodeFromeBBlock (ebp, ic_prev);
2862 hTabDeleteItem (&iCodehTab, ic_prev->key, ic_prev, DELETE_ITEM, NULL);
2866 /* if this is an itemp & result of an address of a true sym
2867 then mark this as rematerialisable */
2868 if (ic->op == ADDRESS_OF &&
2869 IS_ITEMP (IC_RESULT (ic)) &&
2870 IS_TRUE_SYMOP (IC_LEFT (ic)) &&
2871 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2872 !OP_SYMBOL (IC_LEFT (ic))->onStack)
2874 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2875 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2876 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2879 /* if straight assignment then carry remat flag if
2880 this is the only definition */
2881 if (ic->op == '=' &&
2882 !POINTER_SET (ic) &&
2883 IS_SYMOP (IC_RIGHT (ic)) &&
2884 OP_SYMBOL (IC_RIGHT (ic))->remat &&
2885 !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode) &&
2886 bitVectnBitsOn (OP_SYMBOL (IC_RESULT (ic))->defs) <= 1)
2888 OP_SYMBOL (IC_RESULT (ic))->remat =
2889 OP_SYMBOL (IC_RIGHT (ic))->remat;
2890 OP_SYMBOL (IC_RESULT (ic))->rematiCode =
2891 OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
2894 /* if cast to a generic pointer & the pointer being
2895 cast is remat, then we can remat this cast as well */
2896 if (ic->op == CAST &&
2897 IS_SYMOP(IC_RIGHT(ic)) &&
2898 OP_SYMBOL(IC_RIGHT(ic))->remat &&
2899 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1)
2901 sym_link *to_type = operandType(IC_LEFT(ic));
2902 sym_link *from_type = operandType(IC_RIGHT(ic));
2903 if (IS_GENPTR(to_type) && IS_PTR(from_type))
2905 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2906 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2907 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2911 /* if this is a +/- operation with a rematerizable
2912 then mark this as rematerializable as well */
2913 if ((ic->op == '+' || ic->op == '-') &&
2914 (IS_SYMOP (IC_LEFT (ic)) &&
2915 IS_ITEMP (IC_RESULT (ic)) &&
2916 IS_OP_LITERAL (IC_RIGHT (ic))) &&
2917 OP_SYMBOL (IC_LEFT (ic))->remat &&
2918 (!IS_SYMOP (IC_RIGHT (ic)) || !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode)) &&
2919 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1)
2921 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2922 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2923 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2926 /* mark the pointer usages */
2927 if (POINTER_SET (ic))
2928 OP_SYMBOL (IC_RESULT (ic))->uptr = 1;
2930 if (POINTER_GET (ic) &&
2931 IS_SYMOP(IC_LEFT (ic)))
2932 OP_SYMBOL (IC_LEFT (ic))->uptr = 1;
2936 /* if we are using a symbol on the stack
2937 then we should say mcs51_ptrRegReq */
2938 if (options.useXstack && ic->parmPush
2939 && (ic->op == IPUSH || ic->op == IPOP))
2941 if (ic->op == IFX && IS_SYMOP (IC_COND (ic)))
2942 mcs51_ptrRegReq += ((OP_SYMBOL (IC_COND (ic))->onStack ||
2943 OP_SYMBOL (IC_COND (ic))->iaccess ||
2944 SPEC_OCLS(OP_SYMBOL (IC_COND (ic))->etype) == idata) ? 1 : 0);
2945 else if (ic->op == JUMPTABLE && IS_SYMOP (IC_JTCOND (ic)))
2946 mcs51_ptrRegReq += ((OP_SYMBOL (IC_JTCOND (ic))->onStack ||
2947 OP_SYMBOL (IC_JTCOND (ic))->iaccess ||
2948 SPEC_OCLS(OP_SYMBOL (IC_JTCOND (ic))->etype) == idata) ? 1 : 0);
2951 if (IS_SYMOP (IC_LEFT (ic)))
2952 mcs51_ptrRegReq += ((OP_SYMBOL (IC_LEFT (ic))->onStack ||
2953 OP_SYMBOL (IC_LEFT (ic))->iaccess ||
2954 SPEC_OCLS(OP_SYMBOL (IC_LEFT (ic))->etype) == idata) ? 1 : 0);
2955 if (IS_SYMOP (IC_RIGHT (ic)))
2956 mcs51_ptrRegReq += ((OP_SYMBOL (IC_RIGHT (ic))->onStack ||
2957 OP_SYMBOL (IC_RIGHT (ic))->iaccess ||
2958 SPEC_OCLS(OP_SYMBOL (IC_RIGHT (ic))->etype) == idata) ? 1 : 0);
2959 if (IS_SYMOP (IC_RESULT (ic)))
2960 mcs51_ptrRegReq += ((OP_SYMBOL (IC_RESULT (ic))->onStack ||
2961 OP_SYMBOL (IC_RESULT (ic))->iaccess ||
2962 SPEC_OCLS(OP_SYMBOL (IC_RESULT (ic))->etype) == idata) ? 1 : 0);
2963 if (POINTER_GET (ic) && IS_SYMOP (IC_LEFT (ic))
2964 && getSize (OP_SYMBOL (IC_LEFT (ic))->type) <= (unsigned int) PTRSIZE)
2966 if (POINTER_SET (ic) && IS_SYMOP (IC_RESULT (ic))
2967 && getSize (OP_SYMBOL (IC_RESULT (ic))->type) <= (unsigned int) PTRSIZE)
2972 /* if the condition of an if instruction
2973 is defined in the previous instruction and
2974 this is the only usage then
2975 mark the itemp as a conditional */
2976 if ((IS_CONDITIONAL (ic) ||
2977 (IS_BITWISE_OP(ic) && isBitwiseOptimizable (ic))) &&
2978 ic->next && ic->next->op == IFX &&
2979 bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
2980 isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
2981 OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq)
2983 OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND;
2987 /* if the condition of an if instruction
2988 is defined in the previous GET_POINTER instruction and
2989 this is the only usage then
2990 mark the itemp as accumulator use */
2991 if ((POINTER_GET (ic) && getSize (operandType (IC_RESULT (ic))) <=1) &&
2992 ic->next && ic->next->op == IFX &&
2993 bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
2994 isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
2995 OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq)
2997 OP_SYMBOL (IC_RESULT (ic))->accuse = 1;
3001 /* reduce for support function calls */
3002 if (ic->supportRtn || ic->op == '+' || ic->op == '-')
3003 packRegsForSupport (ic, ebp);
3005 /* some cases the redundant moves can
3006 can be eliminated for return statements */
3007 if ((ic->op == RETURN || (ic->op == SEND && ic->argreg == 1)) &&
3008 !isOperandInFarSpace (IC_LEFT (ic)) &&
3009 options.model == MODEL_SMALL) {
3010 packRegsForOneuse (ic, IC_LEFT (ic), ebp);
3013 /* if pointer set & left has a size more than
3014 one and right is not in far space */
3015 if (POINTER_SET (ic) &&
3016 !isOperandInFarSpace (IC_RIGHT (ic)) &&
3017 !OP_SYMBOL (IC_RESULT (ic))->remat &&
3018 !IS_OP_RUONLY (IC_RIGHT (ic)) &&
3019 getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1)
3020 packRegsForOneuse (ic, IC_RESULT (ic), ebp);
3022 /* if pointer get */
3023 if (POINTER_GET (ic) &&
3024 IS_SYMOP (IC_LEFT (ic)) &&
3025 !isOperandInFarSpace (IC_RESULT (ic)) &&
3026 !OP_SYMBOL (IC_LEFT (ic))->remat &&
3027 !IS_OP_RUONLY (IC_RESULT (ic)) &&
3028 getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1)
3029 packRegsForOneuse (ic, IC_LEFT (ic), ebp);
3032 /* if this is a cast for intergral promotion then
3033 check if it's the only use of the definition of the
3034 operand being casted/ if yes then replace
3035 the result of that arithmetic operation with
3036 this result and get rid of the cast */
3039 sym_link *fromType = operandType (IC_RIGHT (ic));
3040 sym_link *toType = operandType (IC_LEFT (ic));
3042 if (IS_INTEGRAL (fromType) && IS_INTEGRAL (toType) &&
3043 getSize (fromType) != getSize (toType) &&
3044 SPEC_USIGN (fromType) == SPEC_USIGN (toType))
3047 iCode *dic = packRegsForOneuse (ic, IC_RIGHT (ic), ebp);
3050 if (IS_ARITHMETIC_OP (dic))
3052 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
3053 ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
3054 remiCodeFromeBBlock (ebp, ic);
3055 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
3056 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
3057 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
3061 OP_SYMBOL (IC_RIGHT (ic))->ruonly = 0;
3067 /* if the type from and type to are the same
3068 then if this is the only use then packit */
3069 if (compareType (operandType (IC_RIGHT (ic)),
3070 operandType (IC_LEFT (ic))) == 1)
3072 iCode *dic = packRegsForOneuse (ic, IC_RIGHT (ic), ebp);
3075 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
3076 ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
3077 remiCodeFromeBBlock (ebp, ic);
3078 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
3079 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
3080 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
3088 iTempNN := (some variable in farspace) V1
3093 if (ic->op == IPUSH)
3095 packForPush (ic, ebpp, blockno);
3099 /* pack registers for accumulator use, when the
3100 result of an arithmetic or bit wise operation
3101 has only one use, that use is immediately following
3102 the defintion and the using iCode has only one
3103 operand or has two operands but one is literal &
3104 the result of that operation is not on stack then
3105 we can leave the result of this operation in acc:b
3107 if ((IS_ARITHMETIC_OP (ic)
3108 || IS_CONDITIONAL(ic)
3109 || IS_BITWISE_OP (ic)
3110 || ic->op == LEFT_OP || ic->op == RIGHT_OP || ic->op == CALL
3111 || (ic->op == ADDRESS_OF && isOperandOnStack (IC_LEFT (ic)))
3113 IS_ITEMP (IC_RESULT (ic)) &&
3114 getSize (operandType (IC_RESULT (ic))) <= 2)
3116 packRegsForAccUse (ic);
3120 /*-----------------------------------------------------------------*/
3121 /* assignRegisters - assigns registers to each live range as need */
3122 /*-----------------------------------------------------------------*/
3124 mcs51_assignRegisters (eBBlock ** ebbs, int count)
3129 setToNull ((void *) &_G.funcrUsed);
3130 setToNull ((void *) &_G.regAssigned);
3131 setToNull ((void *) &_G.totRegAssigned);
3132 mcs51_ptrRegReq = _G.stackExtend = _G.dataExtend = 0;
3135 /* change assignments this will remove some
3136 live ranges reducing some register pressure */
3138 for (i = 0; i < count; i++)
3139 packRegisters (ebbs, i);
3141 /* liveranges probably changed by register packing
3142 so we compute them again */
3143 recomputeLiveRanges (ebbs, count);
3145 if (options.dump_pack)
3146 dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
3148 /* first determine for each live range the number of
3149 registers & the type of registers required for each */
3152 /* and serially allocate registers */
3153 serialRegAssign (ebbs, count);
3156 //setToNull ((void *) &_G.regAssigned);
3157 //setToNull ((void *) &_G.totRegAssigned);
3160 /* if stack was extended then tell the user */
3163 /* werror(W_TOOMANY_SPILS,"stack", */
3164 /* _G.stackExtend,currFunc->name,""); */
3170 /* werror(W_TOOMANY_SPILS,"data space", */
3171 /* _G.dataExtend,currFunc->name,""); */
3175 /* after that create the register mask
3176 for each of the instruction */
3177 createRegMask (ebbs, count);
3179 /* redo that offsets for stacked automatic variables */
3181 redoStackOffsets ();
3184 /* make sure r0 & r1 are flagged as used if they might be used */
3186 if (currFunc && mcs51_ptrRegReq)
3188 currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, R0_IDX);
3189 currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, R1_IDX);
3192 if (options.dump_rassgn)
3194 dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count);
3195 dumpLiveRanges (DUMP_LRANGE, liveRanges);
3198 /* do the overlaysegment stuff SDCCmem.c */
3199 doOverlays (ebbs, count);
3201 /* now get back the chain */
3202 ic = iCodeLabelOptimize (iCodeFromeBBlock (ebbs, count));
3206 /* free up any _G.stackSpil locations allocated */
3207 applyToSet (_G.stackSpil, deallocStackSpil);
3209 setToNull ((void *) &_G.stackSpil);
3210 setToNull ((void *) &_G.spiltSet);
3211 /* mark all registers as free */