1 /*-------------------------------------------------------------------------
3 SDCClrange.c - source file for live range computations
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 hTab *liveRanges = NULL;
31 hTab *iCodehTab = NULL;
32 hTab *iCodeSeqhTab = NULL;
34 /*-----------------------------------------------------------------*/
35 /* hashiCodeKeys - add all iCodes to the hash table */
36 /*-----------------------------------------------------------------*/
38 hashiCodeKeys (eBBlock ** ebbs, int count)
42 for (i = 0; i < count; i++)
45 for (ic = ebbs[i]->sch; ic; ic = ic->next)
46 hTabAddItem (&iCodehTab, ic->key, ic);
50 /*-----------------------------------------------------------------*/
51 /* sequenceiCode - creates a sequence number for the iCode & add */
52 /*-----------------------------------------------------------------*/
54 sequenceiCode (eBBlock ** ebbs, int count)
58 for (i = 0; i < count; i++)
62 ebbs[i]->fSeq = iCodeSeq + 1;
63 for (ic = ebbs[i]->sch; ic; ic = ic->next)
66 ic->depth = ebbs[i]->depth;
67 //hTabAddItem (&iCodehTab, ic->key, ic);
68 hTabAddItem (&iCodeSeqhTab, ic->seq, ic);
70 ebbs[i]->lSeq = iCodeSeq;
74 /*-----------------------------------------------------------------*/
75 /* setFromRange - sets the from range of a given operand */
76 /*-----------------------------------------------------------------*/
78 setFromRange (operand * op, int from)
80 /* only for compiler defined temporaries */
84 hTabAddItemIfNotP (&liveRanges, op->key, OP_SYMBOL (op));
87 OP_SYMBOL (op)->isptr = 1;
89 if (!OP_LIVEFROM (op) ||
90 OP_LIVEFROM (op) > from)
91 OP_LIVEFROM (op) = from;
94 /*-----------------------------------------------------------------*/
95 /* setToRange - set the range to for an operand */
96 /*-----------------------------------------------------------------*/
98 setToRange (operand * op, int to, bool check)
100 /* only for compiler defined temps */
104 OP_SYMBOL (op)->key = op->key;
105 hTabAddItemIfNotP (&liveRanges, op->key, OP_SYMBOL (op));
108 OP_SYMBOL (op)->isptr = 1;
118 /*-----------------------------------------------------------------*/
119 /* setFromRange - sets the from range of a given operand */
120 /*-----------------------------------------------------------------*/
122 setLiveFrom (symbol * sym, int from)
124 if (!sym->liveFrom || sym->liveFrom > from)
125 sym->liveFrom = from;
128 /*-----------------------------------------------------------------*/
129 /* setToRange - set the range to for an operand */
130 /*-----------------------------------------------------------------*/
132 setLiveTo (symbol * sym, int to)
134 if (!sym->liveTo || sym->liveTo < to)
138 /*-----------------------------------------------------------------*/
139 /* markLiveRanges - for each operand mark the liveFrom & liveTo */
140 /*-----------------------------------------------------------------*/
142 markLiveRanges (eBBlock ** ebbs, int count)
147 for (i = 0; i < count; i++)
151 for (ic = ebbs[i]->sch; ic; ic = ic->next)
153 if (ic->op == CALL || ic->op == PCALL)
154 if (bitVectIsZero (OP_SYMBOL (IC_RESULT (ic))->uses))
155 bitVectUnSetBit (ebbs[i]->defSet, ic->key);
157 /* for all iTemps alive at this iCode */
158 for (key = 1; key < ic->rlive->size; key++)
160 if (!bitVectBitValue(ic->rlive, key))
163 sym = hTabItemWithKey(liveRanges, key);
164 setLiveTo(sym, ic->seq);
165 setLiveFrom(sym, ic->seq);
172 /*-----------------------------------------------------------------*/
173 /* markAlive - marks the operand as alive between sic and eic */
174 /*-----------------------------------------------------------------*/
176 markAlive (iCode * sic, iCode * eic, int key)
180 for (dic = sic; dic != eic->next; dic = dic->next)
182 dic->rlive = bitVectSetBit (dic->rlive, key);
186 /*-----------------------------------------------------------------*/
187 /* findNextUseSym - finds the next use of the symbol and marks it */
188 /* alive in between */
189 /*-----------------------------------------------------------------*/
191 findNextUseSym (eBBlock *ebp, iCode *ic, symbol * sym)
197 hTabAddItemIfNotP (&liveRanges, sym->key, sym);
200 goto check_successors;
202 /* if we check a complete block and the symbol */
203 /* is alive at the beginning of the block */
204 /* and not defined in the first instructions */
205 /* then a next use exists (return 1) */
206 if ((ic == ebp->sch) && bitVectBitValue(ic->rlive, sym->key))
208 /* check if the first instruction is a def of this op */
209 if (ic->op == JUMPTABLE || ic->op == IFX || SKIP_IC2(ic))
212 if (IS_ITEMP(IC_RESULT(ic)))
213 if (IC_RESULT(ic)->key == sym->key)
225 /* for all remaining instructions in current block */
226 for (uic = ic; uic; uic = uic->next)
232 if (uic->op == JUMPTABLE)
234 if (IS_ITEMP(IC_JTCOND(uic)) && IC_JTCOND(uic)->key == sym->key)
236 markAlive(ic, uic, sym->key);
244 if (IS_ITEMP(IC_COND(uic)) && IC_COND(uic)->key == sym->key)
246 markAlive(ic, uic, sym->key);
252 if (IS_ITEMP (IC_LEFT (uic)))
253 if (IC_LEFT (uic)->key == sym->key)
255 markAlive(ic, uic, sym->key);
259 if (IS_ITEMP (IC_RIGHT (uic)))
260 if (IC_RIGHT (uic)->key == sym->key)
262 markAlive (ic, uic, sym->key);
266 if (IS_ITEMP (IC_RESULT (uic)))
267 if (IC_RESULT (uic)->key == sym->key)
269 if (POINTER_SET (uic))
271 markAlive (ic, uic, sym->key);
280 /* check all successors */
283 succ = setFirstItem (ebp->succList);
284 for (; succ; succ = setNextItem (ebp->succList))
286 retval += findNextUseSym (succ, succ->sch, sym);
291 if (ic) markAlive (ic, ebp->ech, sym->key);
298 /*-----------------------------------------------------------------*/
299 /* findNextUse - finds the next use of the operand and marks it */
300 /* alive in between */
301 /*-----------------------------------------------------------------*/
303 findNextUse (eBBlock *ebp, iCode *ic, operand *op)
306 OP_SYMBOL (op)->isptr = 1;
308 OP_SYMBOL (op)->key = op->key;
310 return findNextUseSym (ebp, ic, OP_SYMBOL(op));
313 /*-----------------------------------------------------------------*/
314 /* unvisitBlocks - clears visited in all blocks */
315 /*-----------------------------------------------------------------*/
316 void unvisitBlocks (eBBlock ** ebbs, int count)
320 for (i = 0; i < count; i++)
321 ebbs[i]->visited = 0;
324 /*------------------------------------------------------------------*/
325 /* findRecursiveSucc - build a bit vector of recursive successors */
326 /*------------------------------------------------------------------*/
327 DEFSETFUNC (findRecursiveSucc)
330 V_ARG (bitVect *, succVect);
336 bitVectSetBit (succVect, ebp->bbnum);
337 applyToSet (ebp->succList, findRecursiveSucc, succVect);
342 /*------------------------------------------------------------------*/
343 /* findRecursivePred - build a bit vector of recursive predecessors */
344 /*------------------------------------------------------------------*/
345 DEFSETFUNC (findRecursivePred)
348 V_ARG (bitVect *, predVect);
354 bitVectSetBit (predVect, ebp->bbnum);
355 applyToSet (ebp->predList, findRecursivePred, predVect);
360 /*------------------------------------------------------------------*/
361 /* findPrevUse - handle degenerate case of a symbol used prior to */
362 /* findNextUse() marking any definition. */
363 /*------------------------------------------------------------------*/
365 findPrevUse (eBBlock *ebp, iCode *ic, operand *op, eBBlock **ebbs, int count)
371 /* If liveness is already known, then a previous call to findNextUse() */
372 /* has already taken care of everything. */
373 if (ic && bitVectBitValue(ic->rlive, op->key))
377 OP_SYMBOL (op)->isptr = 1;
379 OP_SYMBOL (op)->key = op->key;
381 /* Otherwise, it appears that this symbol was used prior to definition. */
382 /* Just fix the live range; we'll deal with a diagnostic message elsewhere. */
383 /* If the symbol use was in a loop, we need to extend the live range to the */
384 /* outermost loop. */
385 unvisitBlocks (ebbs, count);
386 succVect = newBitVect (count);
387 applyToSet (ebp->succList, findRecursiveSucc, succVect);
388 unvisitBlocks (ebbs, count);
389 predVect = newBitVect (count);
390 applyToSet (ebp->predList, findRecursivePred, predVect);
392 /* Blocks that are both recursively predecessors and successors are in */
393 /* a loop with the current iCode. Mark the operand as alive in them. */
394 for (i = 0; i < count; i++)
396 if (bitVectBitValue(succVect, i) && bitVectBitValue(predVect, i))
397 markAlive (ebbs[i]->sch, ebbs[i]->ech, op->key);
400 freeBitVect (succVect);
401 freeBitVect (predVect);
404 /*-----------------------------------------------------------------*/
405 /* incUsed - increment a symbol's usage count */
406 /*-----------------------------------------------------------------*/
408 incUsed (iCode *ic, operand *op)
411 OP_SYMBOL (op)->used += (((unsigned int) 1 << ic->depth) + 1);
413 OP_SYMBOL (op)->used += 1;
416 /*-----------------------------------------------------------------*/
417 /* rliveClear - clears the rlive bitVectors */
418 /*-----------------------------------------------------------------*/
420 rliveClear (eBBlock ** ebbs, int count)
424 /* for all blocks do */
425 for (i = 0; i < count; i++)
429 /* for all instructions in this block do */
430 for (ic = ebbs[i]->sch; ic; ic = ic->next)
432 freeBitVect (ic->rlive);
438 /*-----------------------------------------------------------------*/
439 /* rlivePoint - for each point compute the ranges that are alive */
440 /*-----------------------------------------------------------------*/
442 rlivePoint (eBBlock ** ebbs, int count)
448 /* for all blocks do */
449 for (i = 0; i < count; i++)
453 /* for all instructions in this block do */
454 for (ic = ebbs[i]->sch; ic; ic = ic->next)
458 ic->rlive = newBitVect (operandKey);
463 if (ic->op == JUMPTABLE && IS_SYMOP(IC_JTCOND(ic)))
465 incUsed (ic, IC_JTCOND(ic));
467 if (!IS_ITEMP(IC_JTCOND(ic)))
470 findPrevUse (ebbs[i], ic->prev, IC_JTCOND(ic), ebbs, count);
471 unvisitBlocks(ebbs, count);
472 ic->rlive = bitVectSetBit (ic->rlive, IC_JTCOND(ic)->key);
473 findNextUse (ebbs[i], ic->next, IC_JTCOND(ic));
478 if (ic->op == IFX && IS_SYMOP(IC_COND(ic)))
480 incUsed (ic, IC_COND(ic));
482 if (!IS_ITEMP(IC_COND(ic)))
485 findPrevUse (ebbs[i], ic->prev, IC_COND(ic), ebbs, count);
486 unvisitBlocks (ebbs, count);
487 ic->rlive = bitVectSetBit (ic->rlive, IC_COND(ic)->key);
488 findNextUse (ebbs[i], ic->next, IC_COND(ic));
493 if (IS_SYMOP(IC_LEFT(ic)))
495 incUsed (ic, IC_LEFT(ic));
496 if (IS_ITEMP(IC_LEFT(ic)))
499 findPrevUse (ebbs[i], ic->prev, IC_LEFT(ic), ebbs, count);
500 unvisitBlocks(ebbs, count);
501 ic->rlive = bitVectSetBit (ic->rlive, IC_LEFT(ic)->key);
502 findNextUse (ebbs[i], ic->next, IC_LEFT(ic));
504 /* if this is a send extend the LR to the call */
508 for (lic = ic; lic; lic = lic->next)
510 if (lic->op == CALL || lic->op == PCALL)
512 markAlive (ic, lic->prev, IC_LEFT (ic)->key);
520 if (IS_SYMOP(IC_RIGHT(ic)))
522 incUsed (ic, IC_RIGHT(ic));
523 if (IS_ITEMP(IC_RIGHT(ic)))
525 findPrevUse (ebbs[i], ic->prev, IC_RIGHT(ic), ebbs, count);
526 unvisitBlocks(ebbs, count);
527 ic->rlive = bitVectSetBit (ic->rlive, IC_RIGHT(ic)->key);
528 findNextUse (ebbs[i], ic->next, IC_RIGHT(ic));
532 if (POINTER_SET(ic) && IS_SYMOP(IC_RESULT(ic)))
533 incUsed (ic, IC_RESULT(ic));
535 if (IS_ITEMP(IC_RESULT(ic)))
539 findPrevUse (ebbs[i], ic->prev, IC_RESULT(ic), ebbs, count);
541 unvisitBlocks(ebbs, count);
542 ic->rlive = bitVectSetBit (ic->rlive, IC_RESULT(ic)->key);
543 findNextUse (ebbs[i], ic->next, IC_RESULT(ic));
546 if (!POINTER_SET(ic) && IC_RESULT(ic))
547 ic->defKey = IC_RESULT(ic)->key;
551 /* check all symbols that are alive in the last instruction */
552 /* but are not alive in all successors */
554 succ = setFirstItem (ebbs[i]->succList);
558 alive = succ->sch->rlive;
559 while ((succ = setNextItem (ebbs[i]->succList)))
562 alive = bitVectIntersect (alive, succ->sch->rlive);
566 alive = bitVectCplAnd ( bitVectCopy (ebbs[i]->ech->rlive), alive);
570 for (key = 1; key < alive->size; key++)
572 if (!bitVectBitValue (alive, key))
575 unvisitBlocks(ebbs, count);
576 findNextUseSym (ebbs[i], NULL, hTabItemWithKey (liveRanges, key));
582 /*-----------------------------------------------------------------*/
583 /* computeClash - find out which live ranges collide with others */
584 /*-----------------------------------------------------------------*/
586 computeClash (eBBlock ** ebbs, int count)
590 /* for all blocks do */
591 for (i = 0; i < count; i++)
595 /* for every iCode do */
596 for (ic = ebbs[i]->sch; ic; ic = ic->next)
601 /* for all iTemps alive at this iCode */
602 for (key1 = 1; key1 < ic->rlive->size; key1++)
604 if (!bitVectBitValue(ic->rlive, key1))
607 sym1 = hTabItemWithKey(liveRanges, key1);
612 /* for all other iTemps alive at this iCode */
613 for (key2 = key1+1; key2 < ic->rlive->size; key2++)
615 if (!bitVectBitValue(ic->rlive, key2))
618 sym2 = hTabItemWithKey(liveRanges, key2);
623 /* if the result and left or right is an iTemp */
624 /* than possibly the iTemps do not clash */
625 if ((ic->op != JUMPTABLE) && (ic->op != IFX) &&
626 IS_ITEMP(IC_RESULT(ic)) &&
627 (IS_ITEMP(IC_LEFT(ic)) || IS_ITEMP(IC_RIGHT(ic))))
629 if (OP_SYMBOL(IC_RESULT(ic))->key == key1
630 && sym1->liveFrom == ic->seq
631 && sym2->liveTo == ic->seq)
633 if (IS_SYMOP(IC_LEFT(ic)))
634 if (OP_SYMBOL(IC_LEFT(ic))->key == key2)
636 if (IS_SYMOP(IC_RIGHT(ic)))
637 if (OP_SYMBOL(IC_RIGHT(ic))->key == key2)
641 if (OP_SYMBOL(IC_RESULT(ic))->key == key2
642 && sym2->liveFrom == ic->seq
643 && sym1->liveTo == ic->seq)
645 if (IS_SYMOP(IC_LEFT(ic)))
646 if (OP_SYMBOL(IC_LEFT(ic))->key == key1)
648 if (IS_SYMOP(IC_RIGHT(ic)))
649 if (OP_SYMBOL(IC_RIGHT(ic))->key == key1)
654 /* the iTemps do clash. set the bits in clashes */
655 sym1->clashes = bitVectSetBit (sym1->clashes, key2);
656 sym2->clashes = bitVectSetBit (sym2->clashes, key1);
658 /* check if they share the same spill location */
659 /* what is this good for? */
660 if (SYM_SPIL_LOC(sym1) && SYM_SPIL_LOC(sym2) &&
661 SYM_SPIL_LOC(sym1) == SYM_SPIL_LOC(sym2))
663 if (sym1->reqv && !sym2->reqv) SYM_SPIL_LOC(sym2)=NULL;
664 else if (sym2->reqv && !sym1->reqv) SYM_SPIL_LOC(sym1)=NULL;
665 else if (sym1->used > sym2->used) SYM_SPIL_LOC(sym2)=NULL;
666 else SYM_SPIL_LOC(sym1)=NULL;
674 /*-----------------------------------------------------------------*/
675 /* allDefsOutOfRange - all definitions are out of a range */
676 /*-----------------------------------------------------------------*/
678 allDefsOutOfRange (bitVect * defs, int fseq, int toseq)
685 for (i = 0; i < defs->size; i++)
689 if (bitVectBitValue (defs, i) &&
690 (ic = hTabItemWithKey (iCodehTab, i)) &&
691 (ic->seq >= fseq && ic->seq <= toseq))
699 /*-----------------------------------------------------------------*/
700 /* notUsedInBlock - not used in this block */
701 /*-----------------------------------------------------------------*/
703 notUsedInBlock (symbol * sym, eBBlock * ebp, iCode *ic)
705 return (!bitVectBitsInCommon (sym->defs, ebp->usesDefs) &&
706 allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq) &&
707 allDefsOutOfRange (sym->uses, ebp->fSeq, ebp->lSeq));
710 /*-----------------------------------------------------------------*/
711 /* adjustIChain - correct the sch and ech pointers */
712 /*-----------------------------------------------------------------*/
714 adjustIChain (eBBlock ** ebbs, int count)
718 for (i = 0; i < count; i++)
727 /* is there any code for this eBBlock? (e.g. ROM assignment) */
741 /*-----------------------------------------------------------------*/
742 /* computeLiveRanges - computes the live ranges for variables */
743 /*-----------------------------------------------------------------*/
745 computeLiveRanges (eBBlock ** ebbs, int count)
747 /* first look through all blocks and adjust the
748 sch and ech pointers */
749 adjustIChain (ebbs, count);
751 /* sequence the code the live ranges are computed
752 in terms of this sequence additionally the
753 routine will also create a hashtable of instructions */
755 setToNull ((void *) &iCodehTab);
756 iCodehTab = newHashTable (iCodeKey);
757 hashiCodeKeys (ebbs, count);
758 setToNull ((void *) &iCodeSeqhTab);
759 iCodeSeqhTab = newHashTable (iCodeKey);
760 sequenceiCode (ebbs, count);
762 /* mark the ranges live for each point */
763 setToNull ((void *) &liveRanges);
764 rlivePoint (ebbs, count);
766 /* mark the from & to live ranges for variables used */
767 markLiveRanges (ebbs, count);
769 /* compute which overlaps with what */
770 computeClash(ebbs, count);
773 /*-----------------------------------------------------------------*/
774 /* recomputeLiveRanges - recomputes the live ranges for variables */
775 /*-----------------------------------------------------------------*/
777 recomputeLiveRanges (eBBlock ** ebbs, int count)
782 /* clear all rlive bitVectors */
783 rliveClear (ebbs, count);
785 sym = hTabFirstItem (liveRanges, &key);
792 freeBitVect (sym->clashes);
794 } while ( (sym = hTabNextItem (liveRanges, &key)));
797 /* do the LR computation again */
798 computeLiveRanges (ebbs, count);