* src/port.h,
[fw/sdcc] / src / avr / ralloc.c
index abecd394c9a2efde31e97fec66b23eb669e6b98c..706ae3cefffb6905e65da6b653189803a4996782 100644 (file)
@@ -1163,6 +1163,7 @@ deassignLRs (iCode * ic, eBBlock * ebp)
                            (result = OP_SYMBOL (IC_RESULT (ic))) &&    /* has a result */
                            result->liveTo > ic->seq && /* and will live beyond this */
                            result->liveTo <= ebp->lSeq &&      /* does not go beyond this block */
+                           result->liveFrom == ic->seq &&    /* does not start before here */
                            result->regType == sym->regType &&  /* same register types */
                            result->nRegs &&    /* which needs registers */
                            !result->isspilt && /* and does not already have them */
@@ -1393,6 +1394,17 @@ serialRegAssign (eBBlock ** ebbs, int count)
                                        continue;
                                }
 
+                               /* If the live range preceeds the point of definition 
+                                  then ideally we must take into account registers that 
+                                  have been allocated after sym->liveFrom but freed
+                                  before ic->seq. This is complicated, so spill this
+                                  symbol instead and let fillGaps handle the allocation. */
+                               if (sym->liveFrom < ic->seq)
+                               {
+                                       spillThis (sym);
+                                       continue;                     
+                               }
+
                                /* if it has a spillocation & is used less than
                                   all other live ranges then spill this */
                                if (willCS) {