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 /* Make sure any spill location is definately allocated */
1221 if (sym->isspilt && !sym->remat && sym->usl.spillLoc &&
1222 !sym->usl.spillLoc->allocreq)
1224 sym->usl.spillLoc->allocreq++;
1227 /* if it does not need or is spilt
1228 or is already assigned to registers
1229 or will not live beyond this instructions */
1232 bitVectBitValue (_G.regAssigned, sym->key) ||
1233 sym->liveTo <= ic->seq)
1236 /* if some liverange has been spilt at the block level
1237 and this one live beyond this block then spil this
1239 if (_G.blockSpil && sym->liveTo > ebbs[i]->lSeq) {
1244 /* if this is a bit variable then don't use precious registers
1245 along with expensive bit-to-char conversions but just spill
1247 if (SPEC_NOUN(sym->etype) == V_BIT) {
1252 /* if trying to allocate this will cause
1253 a spill and there is nothing to spill
1254 or this one is rematerializable then
1256 willCS = willCauseSpill (sym->nRegs, sym->regType);
1257 spillable = computeSpillable (ic);
1258 if (sym->remat || (willCS && bitVectIsZero (spillable))) {
1263 /* If the live range preceeds the point of definition
1264 then ideally we must take into account registers that
1265 have been allocated after sym->liveFrom but freed
1266 before ic->seq. This is complicated, so spill this
1267 symbol instead and let fillGaps handle the allocation. */
1268 if (sym->liveFrom < ic->seq) {
1273 /* if it has a spillocation & is used less than
1274 all other live ranges then spill this */
1276 if (sym->usl.spillLoc) {
1277 symbol *leastUsed = leastUsedLR (liveRangesWith (spillable,
1278 allLRs, ebbs[i], ic));
1279 if (leastUsed && leastUsed->used > sym->used) {
1284 /* if none of the liveRanges have a spillLocation then better
1285 to spill this one than anything else already assigned to registers */
1286 if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) {
1287 /* if this is local to this block then we might find a block spil */
1288 if (!(sym->liveFrom >= ebbs[i]->fSeq && sym->liveTo <= ebbs[i]->lSeq)) {
1295 /* if we need ptr regs for the right side
1297 if (POINTER_GET (ic) && IS_SYMOP (IC_LEFT (ic))
1298 && getSize (OP_SYMBOL (IC_LEFT (ic))->type) <= (unsigned int) PTRSIZE) {
1302 if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic))
1303 && SPEC_OCLS(OP_SYMBOL (IC_LEFT (ic))->etype) == idata) {
1307 if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic))
1308 && SPEC_OCLS(OP_SYMBOL (IC_RIGHT (ic))->etype) == idata) {
1313 /* else we assign registers to it */
1314 _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key);
1315 _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key);
1317 for (j = 0; j < sym->nRegs; j++) {
1318 sym->regs[j] = NULL;
1319 if (sym->regType == REG_PTR)
1320 sym->regs[j] = getRegPtr (ic, ebbs[i], sym);
1323 if (ic->op == CAST && IS_SYMOP (IC_RIGHT (ic)))
1325 symbol * right = OP_SYMBOL (IC_RIGHT (ic));
1328 sym->regs[j] = allocThisReg (right->regs[j]);
1331 sym->regs[j] = getRegGpr (ic, ebbs[i], sym);
1334 /* if the allocation failed which means
1335 this was spilt then break */
1338 for (i=0; i < sym->nRegs ; i++ )
1339 sym->regs[i] = NULL;
1344 if (!POINTER_SET(ic) && !POINTER_GET(ic)) {
1345 /* if it shares registers with operands make sure
1346 that they are in the same position */
1347 if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic)) &&
1348 OP_SYMBOL (IC_LEFT (ic))->nRegs) {
1349 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1350 OP_SYMBOL (IC_LEFT (ic)));
1352 /* do the same for the right operand */
1353 if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)) &&
1354 OP_SYMBOL (IC_RIGHT (ic))->nRegs) {
1355 positionRegs (OP_SYMBOL (IC_RESULT (ic)),
1356 OP_SYMBOL (IC_RIGHT (ic)));
1369 /* Check for and fix any problems with uninitialized operands */
1370 for (i = 0; i < count; i++)
1374 if (ebbs[i]->noPath &&
1375 (ebbs[i]->entryLabel != entryLabel &&
1376 ebbs[i]->entryLabel != returnLabel))
1379 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1386 verifyRegsAssigned (IC_COND (ic), ic);
1390 if (ic->op == JUMPTABLE)
1392 verifyRegsAssigned (IC_JTCOND (ic), ic);
1396 verifyRegsAssigned (IC_RESULT (ic), ic);
1397 verifyRegsAssigned (IC_LEFT (ic), ic);
1398 verifyRegsAssigned (IC_RIGHT (ic), ic);
1403 /*-----------------------------------------------------------------*/
1404 /* fillGaps - Try to fill in the Gaps left by Pass1 */
1405 /*-----------------------------------------------------------------*/
1406 static void fillGaps()
1413 if (getenv("DISABLE_FILL_GAPS")) return;
1415 /* look for liveranges that were spilt by the allocator */
1416 for (sym = hTabFirstItem(liveRanges,&key) ; sym ;
1417 sym = hTabNextItem(liveRanges,&key)) {
1422 if (!sym->spillA || !sym->clashes || sym->remat) continue ;
1424 /* find the liveRanges this one clashes with, that are
1425 still assigned to registers & mark the registers as used*/
1426 for ( i = 0 ; i < sym->clashes->size ; i ++) {
1430 if (bitVectBitValue(sym->clashes,i) == 0 || /* those that clash with this */
1431 bitVectBitValue(_G.totRegAssigned,i) == 0) /* and are still assigned to registers */
1434 clr = hTabItemWithKey(liveRanges,i);
1437 /* mark these registers as used */
1438 for (k = 0 ; k < clr->nRegs ; k++ )
1439 useReg(clr->regs[k]);
1442 if (willCauseSpill(sym->nRegs,sym->regType)) {
1443 /* NOPE :( clear all registers & and continue */
1449 for (i = 0 ; i < sym->defs->size ; i++ )
1451 if (bitVectBitValue(sym->defs,i))
1453 if (!(ic = hTabItemWithKey(iCodehTab,i)))
1460 D(printf("Atemping fillGaps on %s: [",sym->name));
1461 /* THERE IS HOPE !!!! */
1462 for (i=0; i < sym->nRegs ; i++ ) {
1463 if (sym->regType == REG_PTR)
1464 sym->regs[i] = getRegPtrNoSpil ();
1467 sym->regs[i] = NULL;
1468 if (ic && ic->op == CAST && IS_SYMOP (IC_RIGHT (ic)))
1470 symbol * right = OP_SYMBOL (IC_RIGHT (ic));
1473 sym->regs[i] = allocThisReg (right->regs[i]);
1476 sym->regs[i] = getRegGprNoSpil ();
1478 D(printf("%s ", sym->regs[i]->name));
1482 /* For all its definitions check if the registers
1483 allocated needs positioning NOTE: we can position
1484 only ONCE if more than One positioning required
1486 We may need to perform the checks twice; once to
1487 position the registers as needed, the second to
1488 verify any register repositioning is still
1492 for (pass=0; pass<2; pass++) {
1493 D(printf(" checking definitions\n"));
1494 for (i = 0 ; i < sym->defs->size ; i++ ) {
1495 if (bitVectBitValue(sym->defs,i)) {
1496 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1497 D(printf(" ic->seq = %d\n", ic->seq));
1498 if (SKIP_IC(ic)) continue;
1499 assert(isSymbolEqual(sym,OP_SYMBOL(IC_RESULT(ic)))); /* just making sure */
1500 /* if left is assigned to registers */
1501 if (IS_SYMOP(IC_LEFT(ic)))
1503 D(printf(" left = "));
1504 D(printOperand(IC_LEFT(ic),NULL));
1506 if (IS_SYMOP(IC_LEFT(ic)) &&
1507 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_LEFT(ic))->key)) {
1508 pdone += (positionRegs(sym,OP_SYMBOL(IC_LEFT(ic)))>0);
1510 if (IS_SYMOP(IC_RIGHT(ic)))
1512 D(printf(" right = "));
1513 D(printOperand(IC_RIGHT(ic),NULL));
1515 if (IS_SYMOP(IC_RIGHT(ic)) &&
1516 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RIGHT(ic))->key)) {
1517 pdone += (positionRegs(sym,OP_SYMBOL(IC_RIGHT(ic)))>0);
1519 D(printf(" pdone = %d\n", pdone));
1520 if (pdone > 1) break;
1523 D(printf(" checking uses\n"));
1524 for (i = 0 ; i < sym->uses->size ; i++ ) {
1525 if (bitVectBitValue(sym->uses,i)) {
1527 if (!(ic = hTabItemWithKey(iCodehTab,i))) continue ;
1528 D(printf(" ic->seq = %d\n", ic->seq));
1529 if (SKIP_IC(ic)) continue;
1530 if (POINTER_SET(ic) || POINTER_GET(ic)) continue ;
1532 /* if result is assigned to registers */
1533 if (IS_SYMOP(IC_RESULT(ic)))
1535 D(printf(" result = "));
1536 D(printOperand(IC_RESULT(ic),NULL));
1538 if (IS_SYMOP(IC_RESULT(ic)) &&
1539 bitVectBitValue(_G.totRegAssigned,OP_SYMBOL(IC_RESULT(ic))->key)) {
1540 pdone += (positionRegs(sym,OP_SYMBOL(IC_RESULT(ic)))>0);
1542 D(printf(" pdone = %d\n", pdone));
1543 if (pdone > 1) break;
1546 if (pdone == 0) break; /* second pass only if regs repositioned */
1547 if (pdone > 1) break;
1549 D(printf(" sym->regs = ["));
1550 for (i=0; i < sym->nRegs ; i++ )
1551 D(printf("%s ", sym->regs[i]->name));
1553 /* had to position more than once GIVE UP */
1555 /* UNDO all the changes we made to try this */
1557 for (i=0; i < sym->nRegs ; i++ ) {
1558 sym->regs[i] = NULL;
1561 D(printf ("Fill Gap gave up due to positioning for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1564 D(printf ("FILLED GAP for %s in function %s\n",sym->name, currFunc ? currFunc->name : "UNKNOWN"));
1566 _G.totRegAssigned = bitVectSetBit(_G.totRegAssigned,sym->key);
1567 sym->isspilt = sym->spillA = 0 ;
1568 sym->usl.spillLoc->allocreq--;
1573 /*-----------------------------------------------------------------*/
1574 /* rUmaskForOp :- returns register mask for an operand */
1575 /*-----------------------------------------------------------------*/
1577 mcs51_rUmaskForOp (operand * op)
1583 /* only temporaries are assigned registers */
1587 sym = OP_SYMBOL (op);
1589 /* if spilt or no registers assigned to it
1591 if (sym->isspilt || !sym->nRegs)
1594 rumask = newBitVect (mcs51_nRegs);
1596 for (j = 0; j < sym->nRegs; j++)
1598 if (sym->regs[j]) /* EEP - debug */
1599 rumask = bitVectSetBit (rumask, sym->regs[j]->rIdx);
1605 /*-----------------------------------------------------------------*/
1606 /* regsUsedIniCode :- returns bit vector of registers used in iCode */
1607 /*-----------------------------------------------------------------*/
1609 regsUsedIniCode (iCode * ic)
1611 bitVect *rmask = newBitVect (mcs51_nRegs);
1613 /* do the special cases first */
1616 rmask = bitVectUnion (rmask,
1617 mcs51_rUmaskForOp (IC_COND (ic)));
1621 /* for the jumptable */
1622 if (ic->op == JUMPTABLE)
1624 rmask = bitVectUnion (rmask,
1625 mcs51_rUmaskForOp (IC_JTCOND (ic)));
1630 /* of all other cases */
1632 rmask = bitVectUnion (rmask,
1633 mcs51_rUmaskForOp (IC_LEFT (ic)));
1637 rmask = bitVectUnion (rmask,
1638 mcs51_rUmaskForOp (IC_RIGHT (ic)));
1641 rmask = bitVectUnion (rmask,
1642 mcs51_rUmaskForOp (IC_RESULT (ic)));
1648 /*-----------------------------------------------------------------*/
1649 /* createRegMask - for each instruction will determine the regsUsed */
1650 /*-----------------------------------------------------------------*/
1652 createRegMask (eBBlock ** ebbs, int count)
1656 /* for all blocks */
1657 for (i = 0; i < count; i++)
1661 if (ebbs[i]->noPath &&
1662 (ebbs[i]->entryLabel != entryLabel &&
1663 ebbs[i]->entryLabel != returnLabel))
1666 /* for all instructions */
1667 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1672 if (SKIP_IC2 (ic) || !ic->rlive)
1675 /* first mark the registers used in this
1677 ic->rUsed = regsUsedIniCode (ic);
1678 _G.funcrUsed = bitVectUnion (_G.funcrUsed, ic->rUsed);
1680 /* now create the register mask for those
1681 registers that are in use : this is a
1682 super set of ic->rUsed */
1683 ic->rMask = newBitVect (mcs51_nRegs + 1);
1685 /* for all live Ranges alive at this point */
1686 for (j = 1; j < ic->rlive->size; j++)
1691 /* if not alive then continue */
1692 if (!bitVectBitValue (ic->rlive, j))
1695 /* find the live range we are interested in */
1696 if (!(sym = hTabItemWithKey (liveRanges, j)))
1698 werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
1699 "createRegMask cannot find live range");
1700 fprintf(stderr, "\tmissing live range: key=%d\n", j);
1704 /* if no register assigned to it */
1705 if (!sym->nRegs || sym->isspilt)
1708 /* for all the registers allocated to it */
1709 for (k = 0; k < sym->nRegs; k++)
1712 bitVectSetBit (ic->rMask, sym->regs[k]->rIdx);
1718 /*-----------------------------------------------------------------*/
1719 /* rematStr - returns the rematerialized string for a remat var */
1720 /*-----------------------------------------------------------------*/
1722 rematStr (symbol * sym)
1725 iCode *ic = sym->rematiCode;
1732 /* if plus or minus print the right hand side */
1733 if (ic->op == '+' || ic->op == '-')
1735 SNPRINTF (s, sizeof(buffer) - strlen(buffer),
1736 "0x%04x %c ", (int) operandLitValue (IC_RIGHT (ic)),
1739 ic = OP_SYMBOL (IC_LEFT (ic))->rematiCode;
1743 /* cast then continue */
1744 if (IS_CAST_ICODE(ic)) {
1745 ic = OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
1748 /* we reached the end */
1749 SNPRINTF (s, sizeof(buffer) - strlen(buffer),
1750 "%s", OP_SYMBOL (IC_LEFT (ic))->rname);
1757 /*-----------------------------------------------------------------*/
1758 /* regTypeNum - computes the type & number of registers required */
1759 /*-----------------------------------------------------------------*/
1761 regTypeNum (eBBlock *ebbs)
1767 /* for each live range do */
1768 for (sym = hTabFirstItem (liveRanges, &k); sym;
1769 sym = hTabNextItem (liveRanges, &k))
1772 /* if used zero times then no registers needed */
1773 if ((sym->liveTo - sym->liveFrom) == 0)
1777 /* if the live range is a temporary */
1781 /* if the type is marked as a conditional */
1782 if (sym->regType == REG_CND)
1785 /* if used in return only then we don't
1787 if (sym->ruonly || sym->accuse)
1789 if (IS_AGGREGATE (sym->type) || sym->isptr)
1790 sym->type = aggrToPtr (sym->type, FALSE);
1794 /* if the symbol has only one definition &
1795 that definition is a get_pointer */
1796 if (bitVectnBitsOn (sym->defs) == 1 &&
1797 (ic = hTabItemWithKey (iCodehTab,
1798 bitVectFirstBit (sym->defs))) &&
1800 !IS_BITVAR (sym->etype) &&
1801 (aggrToPtrDclType (operandType (IC_LEFT (ic)), FALSE) == POINTER))
1804 if (ptrPseudoSymSafe (sym, ic))
1806 ptrPseudoSymConvert (sym, ic, rematStr (OP_SYMBOL (IC_LEFT (ic))));
1810 /* if in data space or idata space then try to
1811 allocate pointer register */
1815 /* if not then we require registers */
1816 sym->nRegs = ((IS_AGGREGATE (sym->type) || sym->isptr) ?
1817 getSize (sym->type = aggrToPtr (sym->type, FALSE)) :
1818 getSize (sym->type));
1822 fprintf (stderr, "allocated more than 4 or 0 registers for type ");
1823 printTypeChain (sym->type, stderr);
1824 fprintf (stderr, "\n");
1827 /* determine the type of register required */
1828 if (sym->nRegs == 1 &&
1829 IS_PTR (sym->type) &&
1831 sym->regType = REG_PTR;
1833 sym->regType = REG_GPR;
1837 /* for the first run we don't provide */
1838 /* registers for true symbols we will */
1839 /* see how things go */
1845 /*-----------------------------------------------------------------*/
1846 /* freeAllRegs - mark all registers as free */
1847 /*-----------------------------------------------------------------*/
1853 for (i = 0; i < mcs51_nRegs; i++)
1854 regs8051[i].isFree = 1;
1857 /*-----------------------------------------------------------------*/
1858 /* deallocStackSpil - this will set the stack pointer back */
1859 /*-----------------------------------------------------------------*/
1861 DEFSETFUNC (deallocStackSpil)
1869 /*-----------------------------------------------------------------*/
1870 /* farSpacePackable - returns the packable icode for far variables */
1871 /*-----------------------------------------------------------------*/
1873 farSpacePackable (iCode * ic)
1877 /* go thru till we find a definition for the
1878 symbol on the right */
1879 for (dic = ic->prev; dic; dic = dic->prev)
1881 /* if the definition is a call then no */
1882 if ((dic->op == CALL || dic->op == PCALL) &&
1883 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1888 /* if shift by unknown amount then not */
1889 if ((dic->op == LEFT_OP || dic->op == RIGHT_OP) &&
1890 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
1893 /* if pointer get and size > 1 */
1894 if (POINTER_GET (dic) &&
1895 getSize (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)) > 1)
1898 if (POINTER_SET (dic) &&
1899 getSize (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)) > 1)
1904 if (IC_COND (dic) &&
1905 IS_TRUE_SYMOP (IC_COND (dic)) &&
1906 isOperandInFarSpace (IC_COND (dic)))
1909 else if (dic->op == JUMPTABLE)
1911 if (IC_JTCOND (dic) &&
1912 IS_TRUE_SYMOP (IC_JTCOND (dic)) &&
1913 isOperandInFarSpace (IC_JTCOND (dic)))
1918 /* if any tree is a true symbol in far space */
1919 if (IC_RESULT (dic) &&
1920 IS_TRUE_SYMOP (IC_RESULT (dic)) &&
1921 isOperandInFarSpace (IC_RESULT (dic)))
1924 if (IC_RIGHT (dic) &&
1925 IS_TRUE_SYMOP (IC_RIGHT (dic)) &&
1926 isOperandInFarSpace (IC_RIGHT (dic)) &&
1927 !isOperandEqual (IC_RIGHT (dic), IC_RESULT (ic)))
1930 if (IC_LEFT (dic) &&
1931 IS_TRUE_SYMOP (IC_LEFT (dic)) &&
1932 isOperandInFarSpace (IC_LEFT (dic)) &&
1933 !isOperandEqual (IC_LEFT (dic), IC_RESULT (ic)))
1937 if (isOperandEqual (IC_RIGHT (ic), IC_RESULT (dic)))
1939 if ((dic->op == LEFT_OP ||
1940 dic->op == RIGHT_OP ||
1942 IS_OP_LITERAL (IC_RIGHT (dic)))
1952 /*-----------------------------------------------------------------*/
1953 /* packRegsForAssign - register reduction for assignment */
1954 /*-----------------------------------------------------------------*/
1956 packRegsForAssign (iCode * ic, eBBlock * ebp)
1960 if (!IS_ITEMP (IC_RIGHT (ic)) ||
1961 OP_SYMBOL (IC_RIGHT (ic))->isind ||
1962 OP_LIVETO (IC_RIGHT (ic)) > ic->seq)
1967 /* if the true symbol is defined in far space or on stack
1968 then we should not since this will increase register pressure */
1969 if (isOperandInFarSpace(IC_RESULT(ic)) && !farSpacePackable(ic)) {
1973 /* find the definition of iTempNN scanning backwards if we find a
1974 a use of the true symbol in before we find the definition then
1976 for (dic = ic->prev; dic; dic = dic->prev)
1978 int crossedCall = 0;
1980 /* We can pack across a function call only if it's a local */
1981 /* variable or our parameter. Never pack global variables */
1982 /* or parameters to a function we call. */
1983 if ((dic->op == CALL || dic->op == PCALL))
1985 if (!OP_SYMBOL (IC_RESULT (ic))->ismyparm
1986 && !OP_SYMBOL (IC_RESULT (ic))->islocal)
1997 if (IS_SYMOP (IC_COND (dic)) &&
1998 (IC_COND (dic)->key == IC_RESULT (ic)->key ||
1999 IC_COND (dic)->key == IC_RIGHT (ic)->key))
2007 if (IS_TRUE_SYMOP (IC_RESULT (dic)) &&
2008 IS_OP_VOLATILE (IC_RESULT (dic)))
2014 if (IS_SYMOP (IC_RESULT (dic)) &&
2015 IC_RESULT (dic)->key == IC_RIGHT (ic)->key)
2017 if (POINTER_SET (dic))
2023 if (IS_SYMOP (IC_RIGHT (dic)) &&
2024 (IC_RIGHT (dic)->key == IC_RESULT (ic)->key ||
2025 IC_RIGHT (dic)->key == IC_RIGHT (ic)->key))
2031 if (IS_SYMOP (IC_LEFT (dic)) &&
2032 (IC_LEFT (dic)->key == IC_RESULT (ic)->key ||
2033 IC_LEFT (dic)->key == IC_RIGHT (ic)->key))
2039 if (IS_SYMOP (IC_RESULT (dic)) &&
2040 IC_RESULT (dic)->key == IC_RESULT (ic)->key)
2056 return 0; /* did not find */
2058 /* if assignment then check that right is not a bit */
2059 if (ASSIGNMENT (ic) && !POINTER_SET (ic))
2061 sym_link *etype = operandType (IC_RESULT (dic));
2062 if (IS_BITFIELD (etype))
2064 /* if result is a bit too then it's ok */
2065 etype = operandType (IC_RESULT (ic));
2066 if (!IS_BITFIELD (etype))
2073 /* if assignment then check that right is not a bit */
2074 if (ASSIGNMENT (dic) && !POINTER_SET (dic))
2076 sym_link *etype = operandType (IC_RIGHT (dic));
2077 if (IS_BITFIELD (etype))
2079 /* if result is a bit too then it's ok */
2080 etype = operandType (IC_RESULT (dic));
2081 if (!IS_BITFIELD (etype))
2086 /* if the result is on stack or iaccess then it must be
2087 the same atleast one of the operands */
2088 if (OP_SYMBOL (IC_RESULT (ic))->onStack ||
2089 OP_SYMBOL (IC_RESULT (ic))->iaccess)
2092 /* the operation has only one symbol
2093 operator then we can pack */
2094 if ((IC_LEFT (dic) && !IS_SYMOP (IC_LEFT (dic))) ||
2095 (IC_RIGHT (dic) && !IS_SYMOP (IC_RIGHT (dic))))
2098 if (!((IC_LEFT (dic) &&
2099 IC_RESULT (ic)->key == IC_LEFT (dic)->key) ||
2101 IC_RESULT (ic)->key == IC_RIGHT (dic)->key)))
2105 /* found the definition */
2106 /* replace the result with the result of */
2107 /* this assignment and remove this assignment */
2108 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2109 ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
2111 if (IS_ITEMP (IC_RESULT (dic)) && OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq)
2113 OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq;
2115 // TODO: and the otherway around?
2117 /* delete from liverange table also
2118 delete from all the points inbetween and the new
2120 for (sic = dic; sic != ic; sic = sic->next)
2122 bitVectUnSetBit (sic->rlive, IC_RESULT (ic)->key);
2123 if (IS_ITEMP (IC_RESULT (dic)))
2124 bitVectSetBit (sic->rlive, IC_RESULT (dic)->key);
2127 remiCodeFromeBBlock (ebp, ic);
2128 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
2129 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
2130 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
2134 /*------------------------------------------------------------------*/
2135 /* findAssignToSym : scanning backwards looks for first assig found */
2136 /*------------------------------------------------------------------*/
2138 findAssignToSym (operand * op, iCode * ic)
2142 /* This routine is used to find sequences like
2144 ...; (intervening ops don't use iTempAA or modify FOO)
2145 blah = blah + iTempAA;
2147 and eliminate the use of iTempAA, freeing up its register for
2151 for (dic = ic->prev; dic; dic = dic->prev)
2154 /* if definition by assignment */
2155 if (dic->op == '=' &&
2156 !POINTER_SET (dic) &&
2157 IC_RESULT (dic)->key == op->key
2158 /* && IS_TRUE_SYMOP(IC_RIGHT(dic)) */
2160 break; /* found where this temp was defined */
2162 /* if we find an usage then we cannot delete it */
2166 if (IC_COND (dic) && IC_COND (dic)->key == op->key)
2169 else if (dic->op == JUMPTABLE)
2171 if (IC_JTCOND (dic) && IC_JTCOND (dic)->key == op->key)
2176 if (IC_LEFT (dic) && IC_LEFT (dic)->key == op->key)
2179 if (IC_RIGHT (dic) && IC_RIGHT (dic)->key == op->key)
2182 if (POINTER_SET (dic) && IC_RESULT (dic)->key == op->key)
2188 return NULL; /* didn't find any assignment to op */
2190 /* we are interested only if defined in far space */
2191 /* or in stack space in case of + & - */
2193 /* if assigned to a non-symbol then don't repack regs */
2194 if (!IS_SYMOP (IC_RIGHT (dic)))
2197 /* if the symbol is volatile then we should not */
2198 if (isOperandVolatile (IC_RIGHT (dic), TRUE))
2200 /* XXX TODO --- should we be passing FALSE to isOperandVolatile()?
2201 What does it mean for an iTemp to be volatile, anyway? Passing
2202 TRUE is more cautious but may prevent possible optimizations */
2204 /* if the symbol is in far space then we should not */
2205 if (isOperandInFarSpace (IC_RIGHT (dic)))
2208 /* for + & - operations make sure that
2209 if it is on the stack it is the same
2210 as one of the three operands */
2211 if ((ic->op == '+' || ic->op == '-') &&
2212 OP_SYMBOL (IC_RIGHT (dic))->onStack)
2215 if (IC_RESULT (ic)->key != IC_RIGHT (dic)->key &&
2216 IC_LEFT (ic)->key != IC_RIGHT (dic)->key &&
2217 IC_RIGHT (ic)->key != IC_RIGHT (dic)->key)
2221 /* now make sure that the right side of dic
2222 is not defined between ic & dic */
2225 iCode *sic = dic->next;
2227 for (; sic != ic; sic = sic->next)
2228 if (IC_RESULT (sic) &&
2229 IC_RESULT (sic)->key == IC_RIGHT (dic)->key)
2236 /*-----------------------------------------------------------------*/
2237 /* reassignAliasedSym - used by packRegsForSupport to replace */
2238 /* redundant iTemp with equivalent symbol */
2239 /*-----------------------------------------------------------------*/
2241 reassignAliasedSym (eBBlock *ebp, iCode *assignment, iCode *use, operand *op)
2244 unsigned oldSymKey, newSymKey;
2246 oldSymKey = op->key;
2247 newSymKey = IC_RIGHT(assignment)->key;
2249 /* only track live ranges of compiler-generated temporaries */
2250 if (!IS_ITEMP(IC_RIGHT(assignment)))
2253 /* update the live-value bitmaps */
2254 for (ic = assignment; ic != use; ic = ic->next) {
2255 bitVectUnSetBit (ic->rlive, oldSymKey);
2257 ic->rlive = bitVectSetBit (ic->rlive, newSymKey);
2260 /* update the sym of the used operand */
2261 OP_SYMBOL(op) = OP_SYMBOL(IC_RIGHT(assignment));
2262 op->key = OP_SYMBOL(op)->key;
2263 OP_SYMBOL(op)->accuse = 0;
2265 /* update the sym's liverange */
2266 if ( OP_LIVETO(op) < ic->seq )
2267 setToRange(op, ic->seq, FALSE);
2269 /* remove the assignment iCode now that its result is unused */
2270 remiCodeFromeBBlock (ebp, assignment);
2271 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(assignment))->defs, assignment->key);
2272 hTabDeleteItem (&iCodehTab, assignment->key, assignment, DELETE_ITEM, NULL);
2276 /*-----------------------------------------------------------------*/
2277 /* packRegsForSupport :- reduce some registers for support calls */
2278 /*-----------------------------------------------------------------*/
2280 packRegsForSupport (iCode * ic, eBBlock * ebp)
2284 /* for the left & right operand :- look to see if the
2285 left was assigned a true symbol in far space in that
2286 case replace them */
2288 if (IS_ITEMP (IC_LEFT (ic)) &&
2289 OP_SYMBOL (IC_LEFT (ic))->liveTo <= ic->seq)
2291 dic = findAssignToSym (IC_LEFT (ic), ic);
2295 /* found it we need to remove it from the block */
2296 reassignAliasedSym (ebp, dic, ic, IC_LEFT(ic));
2301 /* do the same for the right operand */
2302 if (IS_ITEMP (IC_RIGHT (ic)) &&
2303 OP_SYMBOL (IC_RIGHT (ic))->liveTo <= ic->seq)
2305 iCode *dic = findAssignToSym (IC_RIGHT (ic), ic);
2309 /* if this is a subtraction & the result
2310 is a true symbol in far space then don't pack */
2311 if (ic->op == '-' && IS_TRUE_SYMOP (IC_RESULT (dic)))
2313 sym_link *etype = getSpec (operandType (IC_RESULT (dic)));
2314 if (IN_FARSPACE (SPEC_OCLS (etype)))
2317 /* found it we need to remove it from the
2319 reassignAliasedSym (ebp, dic, ic, IC_RIGHT(ic));
2328 #define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
2331 /*-----------------------------------------------------------------*/
2332 /* packRegsForOneuse : - will reduce some registers for single Use */
2333 /*-----------------------------------------------------------------*/
2335 packRegsForOneuse (iCode * ic, operand * op, eBBlock * ebp)
2339 /* if returning a literal then do nothing */
2343 /* if rematerializable or already return use then do nothing */
2344 if (OP_SYMBOL(op)->remat || OP_SYMBOL(op)->ruonly)
2347 /* only upto 2 bytes since we cannot predict
2348 the usage of b, & acc */
2349 if (getSize (operandType (op)) > (fReturnSizeMCS51 - 2))
2352 if (ic->op != RETURN &&
2354 !POINTER_SET (ic) &&
2358 if (ic->op == SEND && ic->argreg != 1) return NULL;
2360 /* this routine will mark the a symbol as used in one
2361 instruction use only && if the defintion is local
2362 (ie. within the basic block) && has only one definition &&
2363 that definiion is either a return value from a
2364 function or does not contain any variables in
2366 if (bitVectnBitsOn (OP_USES (op)) > 1)
2369 /* if it has only one defintion */
2370 if (bitVectnBitsOn (OP_DEFS (op)) > 1)
2371 return NULL; /* has more than one definition */
2373 /* get that definition */
2375 hTabItemWithKey (iCodehTab,
2376 bitVectFirstBit (OP_DEFS (op)))))
2379 /* if that only usage is a cast */
2380 if (dic->op == CAST) {
2381 /* to a bigger type */
2382 if (getSize(OP_SYM_TYPE(IC_RESULT(dic))) >
2383 getSize(OP_SYM_TYPE(IC_RIGHT(dic)))) {
2384 /* than we can not, since we cannot predict the usage of b & acc */
2389 /* found the definition now check if it is local */
2390 if (dic->seq < ebp->fSeq ||
2391 dic->seq > ebp->lSeq)
2392 return NULL; /* non-local */
2394 /* now check if it is the return from
2396 if (dic->op == CALL || dic->op == PCALL)
2398 if (ic->op != SEND && ic->op != RETURN &&
2399 !POINTER_SET(ic) && !POINTER_GET(ic))
2401 OP_SYMBOL (op)->ruonly = 1;
2407 /* otherwise check that the definition does
2408 not contain any symbols in far space */
2409 if (isOperandInFarSpace (IC_LEFT (dic)) ||
2410 isOperandInFarSpace (IC_RIGHT (dic)) ||
2411 IS_OP_RUONLY (IC_LEFT (ic)) ||
2412 IS_OP_RUONLY (IC_RIGHT (ic)))
2417 /* if pointer set then make sure the pointer
2419 if (POINTER_SET (dic) &&
2420 !IS_DATA_PTR (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)))
2423 if (POINTER_GET (dic) &&
2424 !IS_DATA_PTR (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)))
2428 /* Make sure no overlapping liverange is already assigned to DPTR */
2429 if (OP_SYMBOL(op)->clashes)
2434 for (i = 0 ; i < OP_SYMBOL(op)->clashes->size ; i++ )
2436 if (bitVectBitValue(OP_SYMBOL(op)->clashes,i))
2438 sym = hTabItemWithKey(liveRanges,i);
2447 /* also make sure the intervenening instructions
2448 don't have any thing in far space */
2449 for (dic = dic->next; dic && dic != ic && sic != ic; dic = dic->next)
2452 /* if there is an intervening function call then no */
2453 if (dic->op == CALL || dic->op == PCALL)
2455 /* if pointer set then make sure the pointer
2457 if (POINTER_SET (dic) &&
2458 !IS_DATA_PTR (aggrToPtr (operandType (IC_RESULT (dic)), FALSE)))
2461 if (POINTER_GET (dic) &&
2462 !IS_DATA_PTR (aggrToPtr (operandType (IC_LEFT (dic)), FALSE)))
2465 /* if address of & the result is remat the okay */
2466 if (dic->op == ADDRESS_OF &&
2467 OP_SYMBOL (IC_RESULT (dic))->remat)
2470 /* if operand has size of three or more & this
2471 operation is a '*','/' or '%' then 'b' may
2473 if ((dic->op == '%' || dic->op == '/' || dic->op == '*') &&
2474 getSize (operandType (op)) >= 3)
2477 /* if left or right or result is in far space */
2478 if (isOperandInFarSpace (IC_LEFT (dic)) ||
2479 isOperandInFarSpace (IC_RIGHT (dic)) ||
2480 isOperandInFarSpace (IC_RESULT (dic)) ||
2481 IS_OP_RUONLY (IC_LEFT (dic)) ||
2482 IS_OP_RUONLY (IC_RIGHT (dic)) ||
2483 IS_OP_RUONLY (IC_RESULT (dic)))
2487 /* if left or right or result is on stack */
2488 if (isOperandOnStack(IC_LEFT(dic)) ||
2489 isOperandOnStack(IC_RIGHT(dic)) ||
2490 isOperandOnStack(IC_RESULT(dic))) {
2495 OP_SYMBOL (op)->ruonly = 1;
2499 /*-----------------------------------------------------------------*/
2500 /* isBitwiseOptimizable - requirements of JEAN LOUIS VERN */
2501 /*-----------------------------------------------------------------*/
2503 isBitwiseOptimizable (iCode * ic)
2505 sym_link *ltype = getSpec (operandType (IC_LEFT (ic)));
2506 sym_link *rtype = getSpec (operandType (IC_RIGHT (ic)));
2508 /* bitwise operations are considered optimizable
2509 under the following conditions (Jean-Louis VERN)
2521 if (IS_LITERAL(rtype) ||
2522 (IS_BITVAR (ltype) && IN_BITSPACE (SPEC_OCLS (ltype))))
2528 /*-----------------------------------------------------------------*/
2529 /* isCommutativeOp - tests whether this op cares what order its */
2530 /* operands are in */
2531 /*-----------------------------------------------------------------*/
2532 bool isCommutativeOp(unsigned int op)
2534 if (op == '+' || op == '*' || op == EQ_OP ||
2535 op == '^' || op == '|' || op == BITWISEAND)
2541 /*-----------------------------------------------------------------*/
2542 /* operandUsesAcc - determines whether the code generated for this */
2543 /* operand will have to use the accumulator */
2544 /*-----------------------------------------------------------------*/
2545 bool operandUsesAcc(operand *op)
2551 symbol *sym = OP_SYMBOL(op);
2555 return TRUE; /* duh! */
2557 if (IN_STACK(sym->etype) || sym->onStack ||
2558 (SPIL_LOC(op) && SPIL_LOC(op)->onStack))
2559 return TRUE; /* acc is used to calc stack offset */
2564 sym = SPIL_LOC(op); /* if spilled, look at spill location */
2566 return FALSE; /* more checks? */
2570 symspace = SPEC_OCLS(sym->etype);
2572 if (sym->iaccess && symspace->paged)
2573 return TRUE; /* must fetch paged indirect sym via accumulator */
2575 if (IN_BITSPACE(symspace))
2576 return TRUE; /* fetching bit vars uses the accumulator */
2578 if (IN_FARSPACE(symspace) || IN_CODESPACE(symspace))
2579 return TRUE; /* fetched via accumulator and dptr */
2585 /*-----------------------------------------------------------------*/
2586 /* packRegsForAccUse - pack registers for acc use */
2587 /*-----------------------------------------------------------------*/
2589 packRegsForAccUse (iCode * ic)
2593 /* if this is an aggregate, e.g. a one byte char array */
2594 if (IS_AGGREGATE(operandType(IC_RESULT(ic)))) {
2598 /* if we are calling a reentrant function that has stack parameters */
2599 if (ic->op == CALL &&
2600 IFFUNC_ISREENT(operandType(IC_LEFT(ic))) &&
2601 FUNC_HASSTACKPARM(operandType(IC_LEFT(ic))))
2604 if (ic->op == PCALL &&
2605 IFFUNC_ISREENT(operandType(IC_LEFT(ic))->next) &&
2606 FUNC_HASSTACKPARM(operandType(IC_LEFT(ic))->next))
2609 /* if + or - then it has to be one byte result */
2610 if ((ic->op == '+' || ic->op == '-')
2611 && getSize (operandType (IC_RESULT (ic))) > 1)
2614 /* if shift operation make sure right side is not a literal */
2615 if (ic->op == RIGHT_OP &&
2616 (isOperandLiteral (IC_RIGHT (ic)) ||
2617 getSize (operandType (IC_RESULT (ic))) > 1))
2620 if (ic->op == LEFT_OP &&
2621 (isOperandLiteral (IC_RIGHT (ic)) ||
2622 getSize (operandType (IC_RESULT (ic))) > 1))
2625 if (IS_BITWISE_OP (ic) &&
2626 getSize (operandType (IC_RESULT (ic))) > 1)
2630 /* has only one definition */
2631 if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
2634 /* has only one use */
2635 if (bitVectnBitsOn (OP_USES (IC_RESULT (ic))) > 1)
2638 /* and the usage immediately follows this iCode */
2639 if (!(uic = hTabItemWithKey (iCodehTab,
2640 bitVectFirstBit (OP_USES (IC_RESULT (ic))))))
2643 if (ic->next != uic)
2646 /* if it is a conditional branch then we definitely can */
2650 if (uic->op == JUMPTABLE)
2653 if (POINTER_SET (uic) &&
2654 getSize (aggrToPtr (operandType (IC_RESULT (uic)), FALSE)) > 1)
2657 /* if the usage is not is an assignment
2658 or an arithmetic / bitwise / shift operation then not */
2659 if (uic->op != '=' &&
2660 !IS_ARITHMETIC_OP (uic) &&
2661 !IS_BITWISE_OP (uic) &&
2662 uic->op != LEFT_OP &&
2663 uic->op != RIGHT_OP)
2666 /* if used in ^ operation then make sure right is not a
2667 literal (WIML: Why is this?) */
2668 if (uic->op == '^' && isOperandLiteral (IC_RIGHT (uic)))
2671 /* if shift operation make sure right side is not a literal */
2672 /* WIML: Why is this? */
2673 if (uic->op == RIGHT_OP &&
2674 (isOperandLiteral (IC_RIGHT (uic)) ||
2675 getSize (operandType (IC_RESULT (uic))) > 1))
2677 if (uic->op == LEFT_OP &&
2678 (isOperandLiteral (IC_RIGHT (uic)) ||
2679 getSize (operandType (IC_RESULT (uic))) > 1))
2682 /* make sure that the result of this icode is not on the
2683 stack, since acc is used to compute stack offset */
2685 if (IS_TRUE_SYMOP (IC_RESULT (uic)) &&
2686 OP_SYMBOL (IC_RESULT (uic))->onStack)
2689 if (isOperandOnStack(IC_RESULT(uic)))
2693 /* if the usage has only one operand then we can */
2694 if (IC_LEFT (uic) == NULL ||
2695 IC_RIGHT (uic) == NULL)
2698 /* if the other operand uses the accumulator then we cannot */
2699 if ( (IC_LEFT(uic)->key == IC_RESULT(ic)->key &&
2700 operandUsesAcc(IC_RIGHT(uic))) ||
2701 (IC_RIGHT(uic)->key == IC_RESULT(ic)->key &&
2702 operandUsesAcc(IC_LEFT(uic))) )
2705 /* make sure this is on the left side if not commutative */
2706 /* except for '-', which has been written to be able to
2707 handle reversed operands */
2708 if (!(isCommutativeOp(ic->op) || ic->op == '-') &&
2709 IC_LEFT (uic)->key != IC_RESULT (ic)->key)
2713 // this is too dangerous and need further restrictions
2716 /* if one of them is a literal then we can */
2717 if ((IC_LEFT (uic) && IS_OP_LITERAL (IC_LEFT (uic))) ||
2718 (IC_RIGHT (uic) && IS_OP_LITERAL (IC_RIGHT (uic))))
2720 OP_SYMBOL (IC_RESULT (ic))->accuse = 1;
2726 OP_SYMBOL (IC_RESULT (ic))->accuse = 1;
2730 /*-----------------------------------------------------------------*/
2731 /* packForPush - heuristics to reduce iCode for pushing */
2732 /*-----------------------------------------------------------------*/
2734 packForPush (iCode * ic, eBBlock ** ebpp, int blockno)
2738 struct eBBlock * ebp=ebpp[blockno];
2740 if (ic->op != IPUSH || !IS_ITEMP (IC_LEFT (ic)))
2743 /* must have only definition & one usage */
2744 if (bitVectnBitsOn (OP_DEFS (IC_LEFT (ic))) != 1 ||
2745 bitVectnBitsOn (OP_USES (IC_LEFT (ic))) != 1)
2748 /* find the definition */
2749 if (!(dic = hTabItemWithKey (iCodehTab,
2750 bitVectFirstBit (OP_DEFS (IC_LEFT (ic))))))
2753 if (dic->op != '=' || POINTER_SET (dic))
2756 if (dic->seq < ebp->fSeq) { // Evelyn did this
2758 for (i=0; i<blockno; i++) {
2759 if (dic->seq >= ebpp[i]->fSeq && dic->seq <= ebpp[i]->lSeq) {
2764 wassert (i!=blockno); // no way to recover from here
2767 if (IS_SYMOP(IC_RIGHT(dic))) {
2768 /* make sure the right side does not have any definitions
2770 dbv = OP_DEFS(IC_RIGHT(dic));
2771 for (lic = ic; lic && lic != dic ; lic = lic->prev) {
2772 if (bitVectBitValue(dbv,lic->key))
2775 /* make sure they have the same type */
2776 if (IS_SPEC(operandType(IC_LEFT(ic))))
2778 sym_link *itype=operandType(IC_LEFT(ic));
2779 sym_link *ditype=operandType(IC_RIGHT(dic));
2781 if (SPEC_USIGN(itype)!=SPEC_USIGN(ditype) ||
2782 SPEC_LONG(itype)!=SPEC_LONG(ditype))
2785 /* extend the live range of replaced operand if needed */
2786 if (OP_SYMBOL(IC_RIGHT(dic))->liveTo < ic->seq) {
2787 OP_SYMBOL(IC_RIGHT(dic))->liveTo = ic->seq;
2789 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
2792 /* we now we know that it has one & only one def & use
2793 and the that the definition is an assignment */
2794 ReplaceOpWithCheaperOp(&IC_LEFT (ic), IC_RIGHT (dic));
2795 remiCodeFromeBBlock (ebp, dic);
2796 hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL);
2799 /*-----------------------------------------------------------------*/
2800 /* packRegisters - does some transformations to reduce register */
2802 /*-----------------------------------------------------------------*/
2804 packRegisters (eBBlock ** ebpp, int blockno)
2808 eBBlock *ebp=ebpp[blockno];
2814 /* look for assignments of the form */
2815 /* iTempNN = TRueSym (someoperation) SomeOperand */
2817 /* TrueSym := iTempNN:1 */
2818 for (ic = ebp->sch; ic; ic = ic->next)
2820 /* find assignment of the form TrueSym := iTempNN:1 */
2821 if (ic->op == '=' && !POINTER_SET (ic))
2822 change += packRegsForAssign (ic, ebp);
2829 for (ic = ebp->sch; ic; ic = ic->next)
2831 /* Fix for bug #979599: */
2834 /* Look for two subsequent iCodes with */
2836 /* _c = iTemp & op; */
2837 /* and replace them by */
2840 if ((ic->op == BITWISEAND || ic->op == '|' || ic->op == '^') &&
2842 ic->prev->op == '=' &&
2843 IS_ITEMP (IC_LEFT (ic)) &&
2844 IC_LEFT (ic) == IC_RESULT (ic->prev) &&
2845 isOperandEqual (IC_RESULT(ic), IC_RIGHT(ic->prev)))
2847 iCode* ic_prev = ic->prev;
2848 symbol* prev_result_sym = OP_SYMBOL (IC_RESULT (ic_prev));
2850 ReplaceOpWithCheaperOp (&IC_LEFT (ic), IC_RESULT (ic));
2851 if (IC_RESULT (ic_prev) != IC_RIGHT (ic))
2853 bitVectUnSetBit (OP_USES (IC_RESULT (ic_prev)), ic->key);
2854 if (/*IS_ITEMP (IC_RESULT (ic_prev)) && */
2855 prev_result_sym->liveTo == ic->seq)
2857 prev_result_sym->liveTo = ic_prev->seq;
2860 bitVectSetBit (OP_USES (IC_RESULT (ic)), ic->key);
2862 bitVectSetBit (ic->rlive, IC_RESULT (ic)->key);
2864 if (bitVectIsZero (OP_USES (IC_RESULT (ic_prev))))
2866 bitVectUnSetBit (ic->rlive, IC_RESULT (ic)->key);
2867 bitVectUnSetBit (OP_DEFS (IC_RESULT (ic_prev)), ic_prev->key);
2868 remiCodeFromeBBlock (ebp, ic_prev);
2869 hTabDeleteItem (&iCodehTab, ic_prev->key, ic_prev, DELETE_ITEM, NULL);
2873 /* if this is an itemp & result of an address of a true sym
2874 then mark this as rematerialisable */
2875 if (ic->op == ADDRESS_OF &&
2876 IS_ITEMP (IC_RESULT (ic)) &&
2877 IS_TRUE_SYMOP (IC_LEFT (ic)) &&
2878 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 &&
2879 !OP_SYMBOL (IC_LEFT (ic))->onStack)
2881 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2882 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2883 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2886 /* if straight assignment then carry remat flag if
2887 this is the only definition */
2888 if (ic->op == '=' &&
2889 !POINTER_SET (ic) &&
2890 IS_SYMOP (IC_RIGHT (ic)) &&
2891 OP_SYMBOL (IC_RIGHT (ic))->remat &&
2892 !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode) &&
2893 bitVectnBitsOn (OP_SYMBOL (IC_RESULT (ic))->defs) <= 1)
2895 OP_SYMBOL (IC_RESULT (ic))->remat =
2896 OP_SYMBOL (IC_RIGHT (ic))->remat;
2897 OP_SYMBOL (IC_RESULT (ic))->rematiCode =
2898 OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
2901 /* if cast to a generic pointer & the pointer being
2902 cast is remat, then we can remat this cast as well */
2903 if (ic->op == CAST &&
2904 IS_SYMOP(IC_RIGHT(ic)) &&
2905 OP_SYMBOL(IC_RIGHT(ic))->remat &&
2906 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1)
2908 sym_link *to_type = operandType(IC_LEFT(ic));
2909 sym_link *from_type = operandType(IC_RIGHT(ic));
2910 if (IS_GENPTR(to_type) && IS_PTR(from_type))
2912 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2913 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2914 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2918 /* if this is a +/- operation with a rematerizable
2919 then mark this as rematerializable as well */
2920 if ((ic->op == '+' || ic->op == '-') &&
2921 (IS_SYMOP (IC_LEFT (ic)) &&
2922 IS_ITEMP (IC_RESULT (ic)) &&
2923 IS_OP_LITERAL (IC_RIGHT (ic))) &&
2924 OP_SYMBOL (IC_LEFT (ic))->remat &&
2925 (!IS_SYMOP (IC_RIGHT (ic)) || !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode)) &&
2926 bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1)
2928 OP_SYMBOL (IC_RESULT (ic))->remat = 1;
2929 OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic;
2930 OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL;
2933 /* mark the pointer usages */
2934 if (POINTER_SET (ic))
2935 OP_SYMBOL (IC_RESULT (ic))->uptr = 1;
2937 if (POINTER_GET (ic) &&
2938 IS_SYMOP(IC_LEFT (ic)))
2939 OP_SYMBOL (IC_LEFT (ic))->uptr = 1;
2943 /* if we are using a symbol on the stack
2944 then we should say mcs51_ptrRegReq */
2945 if (options.useXstack && ic->parmPush
2946 && (ic->op == IPUSH || ic->op == IPOP))
2948 if (ic->op == IFX && IS_SYMOP (IC_COND (ic)))
2949 mcs51_ptrRegReq += ((OP_SYMBOL (IC_COND (ic))->onStack ||
2950 OP_SYMBOL (IC_COND (ic))->iaccess ||
2951 SPEC_OCLS(OP_SYMBOL (IC_COND (ic))->etype) == idata) ? 1 : 0);
2952 else if (ic->op == JUMPTABLE && IS_SYMOP (IC_JTCOND (ic)))
2953 mcs51_ptrRegReq += ((OP_SYMBOL (IC_JTCOND (ic))->onStack ||
2954 OP_SYMBOL (IC_JTCOND (ic))->iaccess ||
2955 SPEC_OCLS(OP_SYMBOL (IC_JTCOND (ic))->etype) == idata) ? 1 : 0);
2958 if (IS_SYMOP (IC_LEFT (ic)))
2959 mcs51_ptrRegReq += ((OP_SYMBOL (IC_LEFT (ic))->onStack ||
2960 OP_SYMBOL (IC_LEFT (ic))->iaccess ||
2961 SPEC_OCLS(OP_SYMBOL (IC_LEFT (ic))->etype) == idata) ? 1 : 0);
2962 if (IS_SYMOP (IC_RIGHT (ic)))
2963 mcs51_ptrRegReq += ((OP_SYMBOL (IC_RIGHT (ic))->onStack ||
2964 OP_SYMBOL (IC_RIGHT (ic))->iaccess ||
2965 SPEC_OCLS(OP_SYMBOL (IC_RIGHT (ic))->etype) == idata) ? 1 : 0);
2966 if (IS_SYMOP (IC_RESULT (ic)))
2967 mcs51_ptrRegReq += ((OP_SYMBOL (IC_RESULT (ic))->onStack ||
2968 OP_SYMBOL (IC_RESULT (ic))->iaccess ||
2969 SPEC_OCLS(OP_SYMBOL (IC_RESULT (ic))->etype) == idata) ? 1 : 0);
2970 if (POINTER_GET (ic) && IS_SYMOP (IC_LEFT (ic))
2971 && getSize (OP_SYMBOL (IC_LEFT (ic))->type) <= (unsigned int) PTRSIZE)
2973 if (POINTER_SET (ic) && IS_SYMOP (IC_RESULT (ic))
2974 && getSize (OP_SYMBOL (IC_RESULT (ic))->type) <= (unsigned int) PTRSIZE)
2979 /* if the condition of an if instruction
2980 is defined in the previous instruction and
2981 this is the only usage then
2982 mark the itemp as a conditional */
2983 if ((IS_CONDITIONAL (ic) ||
2984 (IS_BITWISE_OP(ic) && isBitwiseOptimizable (ic))) &&
2985 ic->next && ic->next->op == IFX &&
2986 bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
2987 isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
2988 OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq)
2990 OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND;
2994 /* if the condition of an if instruction
2995 is defined in the previous GET_POINTER instruction and
2996 this is the only usage then
2997 mark the itemp as accumulator use */
2998 if ((POINTER_GET (ic) && getSize (operandType (IC_RESULT (ic))) <=1) &&
2999 ic->next && ic->next->op == IFX &&
3000 bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 &&
3001 isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) &&
3002 OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq)
3004 OP_SYMBOL (IC_RESULT (ic))->accuse = 1;
3008 /* reduce for support function calls */
3009 if (ic->supportRtn || ic->op == '+' || ic->op == '-')
3010 packRegsForSupport (ic, ebp);
3012 /* some cases the redundant moves can
3013 can be eliminated for return statements */
3014 if ((ic->op == RETURN || (ic->op == SEND && ic->argreg == 1)) &&
3015 !isOperandInFarSpace (IC_LEFT (ic)) &&
3016 options.model == MODEL_SMALL) {
3017 packRegsForOneuse (ic, IC_LEFT (ic), ebp);
3020 /* if pointer set & left has a size more than
3021 one and right is not in far space */
3022 if (POINTER_SET (ic) &&
3023 !isOperandInFarSpace (IC_RIGHT (ic)) &&
3024 !OP_SYMBOL (IC_RESULT (ic))->remat &&
3025 !IS_OP_RUONLY (IC_RIGHT (ic)) &&
3026 getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1)
3027 packRegsForOneuse (ic, IC_RESULT (ic), ebp);
3029 /* if pointer get */
3030 if (POINTER_GET (ic) &&
3031 IS_SYMOP (IC_LEFT (ic)) &&
3032 !isOperandInFarSpace (IC_RESULT (ic)) &&
3033 !OP_SYMBOL (IC_LEFT (ic))->remat &&
3034 !IS_OP_RUONLY (IC_RESULT (ic)) &&
3035 getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1)
3036 packRegsForOneuse (ic, IC_LEFT (ic), ebp);
3039 /* if this is a cast for intergral promotion then
3040 check if it's the only use of the definition of the
3041 operand being casted/ if yes then replace
3042 the result of that arithmetic operation with
3043 this result and get rid of the cast */
3046 sym_link *fromType = operandType (IC_RIGHT (ic));
3047 sym_link *toType = operandType (IC_LEFT (ic));
3049 if (IS_INTEGRAL (fromType) && IS_INTEGRAL (toType) &&
3050 getSize (fromType) != getSize (toType) &&
3051 SPEC_USIGN (fromType) == SPEC_USIGN (toType))
3054 iCode *dic = packRegsForOneuse (ic, IC_RIGHT (ic), ebp);
3057 if (IS_ARITHMETIC_OP (dic))
3059 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
3060 ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
3061 remiCodeFromeBBlock (ebp, ic);
3062 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
3063 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
3064 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
3068 OP_SYMBOL (IC_RIGHT (ic))->ruonly = 0;
3074 /* if the type from and type to are the same
3075 then if this is the only use then packit */
3076 if (compareType (operandType (IC_RIGHT (ic)),
3077 operandType (IC_LEFT (ic))) == 1)
3079 iCode *dic = packRegsForOneuse (ic, IC_RIGHT (ic), ebp);
3082 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key);
3083 ReplaceOpWithCheaperOp(&IC_RESULT (dic), IC_RESULT (ic));
3084 remiCodeFromeBBlock (ebp, ic);
3085 bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key);
3086 hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL);
3087 OP_DEFS(IC_RESULT (dic))=bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key);
3095 iTempNN := (some variable in farspace) V1
3100 if (ic->op == IPUSH)
3102 packForPush (ic, ebpp, blockno);
3106 /* pack registers for accumulator use, when the
3107 result of an arithmetic or bit wise operation
3108 has only one use, that use is immediately following
3109 the defintion and the using iCode has only one
3110 operand or has two operands but one is literal &
3111 the result of that operation is not on stack then
3112 we can leave the result of this operation in acc:b
3114 if ((IS_ARITHMETIC_OP (ic)
3115 || IS_CONDITIONAL(ic)
3116 || IS_BITWISE_OP (ic)
3117 || ic->op == LEFT_OP || ic->op == RIGHT_OP || ic->op == CALL
3118 || (ic->op == ADDRESS_OF && isOperandOnStack (IC_LEFT (ic)))
3120 IS_ITEMP (IC_RESULT (ic)) &&
3121 getSize (operandType (IC_RESULT (ic))) <= 2)
3123 packRegsForAccUse (ic);
3127 /*-----------------------------------------------------------------*/
3128 /* assignRegisters - assigns registers to each live range as need */
3129 /*-----------------------------------------------------------------*/
3131 mcs51_assignRegisters (eBBlock ** ebbs, int count)
3136 setToNull ((void *) &_G.funcrUsed);
3137 setToNull ((void *) &_G.regAssigned);
3138 setToNull ((void *) &_G.totRegAssigned);
3139 mcs51_ptrRegReq = _G.stackExtend = _G.dataExtend = 0;
3142 /* change assignments this will remove some
3143 live ranges reducing some register pressure */
3145 for (i = 0; i < count; i++)
3146 packRegisters (ebbs, i);
3148 /* liveranges probably changed by register packing
3149 so we compute them again */
3150 recomputeLiveRanges (ebbs, count);
3152 if (options.dump_pack)
3153 dumpEbbsToFileExt (DUMP_PACK, ebbs, count);
3155 /* first determine for each live range the number of
3156 registers & the type of registers required for each */
3159 /* and serially allocate registers */
3160 serialRegAssign (ebbs, count);
3163 //setToNull ((void *) &_G.regAssigned);
3164 //setToNull ((void *) &_G.totRegAssigned);
3167 /* if stack was extended then tell the user */
3170 /* werror(W_TOOMANY_SPILS,"stack", */
3171 /* _G.stackExtend,currFunc->name,""); */
3177 /* werror(W_TOOMANY_SPILS,"data space", */
3178 /* _G.dataExtend,currFunc->name,""); */
3182 /* after that create the register mask
3183 for each of the instruction */
3184 createRegMask (ebbs, count);
3186 /* redo that offsets for stacked automatic variables */
3188 redoStackOffsets ();
3191 /* make sure r0 & r1 are flagged as used if they might be used */
3193 if (currFunc && mcs51_ptrRegReq)
3195 currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, R0_IDX);
3196 currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, R1_IDX);
3199 if (options.dump_rassgn)
3201 dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count);
3202 dumpLiveRanges (DUMP_LRANGE, liveRanges);
3205 /* do the overlaysegment stuff SDCCmem.c */
3206 doOverlays (ebbs, count);
3208 /* now get back the chain */
3209 ic = iCodeLabelOptimize (iCodeFromeBBlock (ebbs, count));
3213 /* free up any _G.stackSpil locations allocated */
3214 applyToSet (_G.stackSpil, deallocStackSpil);
3216 setToNull ((void *) &_G.stackSpil);
3217 setToNull ((void *) &_G.spiltSet);
3218 /* mark all registers as free */