* src/configure.in, src/configure, src/Makefile.in, as/z80/Makefile.in,
[fw/sdcc] / src / pic16 / ralloc.c
index 611142db48593b9f1a8f813824fae562902ce9b5..c06b5daa8104ed30c46f34aa37732816b5b9fe75 100644 (file)
@@ -153,6 +153,7 @@ debugLog (char *fmt,...)
   vsprintf (buffer, fmt, ap);
 
   fprintf (debugF, "%s", buffer);
+  //fprintf (stderr, "%s", buffer);
 /*
    while (isspace((unsigned char)*bufferP)) bufferP++;
 
@@ -424,7 +425,7 @@ regs* newReg(int type, short pc_type, int rIdx, char *name, unsigned size, int a
        dReg->regop = refop;
   
        if(!(type == REG_SFR && alias == 0x80))
-               hTabAddItem(&dynDirectRegNames, regname2key(name), dReg);
+               hTabAddItem(&dynDirectRegNames, regname2key(dReg->name), dReg);
 
   return dReg;
 }
@@ -578,17 +579,16 @@ allocReg (short type)
 //                                     (_inRegAllocator)?"ralloc":"", currFunc, reg->name, reg->rIdx);
 
 #if 1
-                if(_inRegAllocator && (dynrIdx > MAX_P16_NREGS)) {
-//                  debugf("allocating more registers than available\n", 0);
-//                  return (NULL);
-                }
+               if(_inRegAllocator && (dynrIdx > MAX_P16_NREGS)) {
+                 //                  debugf("allocating more registers than available\n", 0);
+                 //                  return (NULL);
+               }
+               
+               addSet(&pic16_dynAllocRegs, reg);
+               hTabAddItem(&dynAllocRegNames, regname2key(reg->name), reg);
+//             fprintf(stderr, "%s:%d added reg to pic16_dynAllocRegs = %p\n", __FUNCTION__, __LINE__, pic16_dynAllocRegs);
 #endif
        }
-
-       addSet(&pic16_dynAllocRegs, reg);
-       hTabAddItem(&dynAllocRegNames, regname2key(reg->name), reg);
-
-//     fprintf(stderr, "%s:%d added reg to pic16_dynAllocRegs = %p\n", __FUNCTION__, __LINE__, pic16_dynAllocRegs);
        
        debugLog ("%s of type %s for register rIdx: %d (0x%x)\n", __FUNCTION__, debugLogRegType (type), dynrIdx-1, dynrIdx-1);
 
@@ -3181,12 +3181,12 @@ packRegsForAssign (iCode * ic, eBBlock * ebp)
         * if it fits for pic16, but I leave it here just in case */
 
        /* if assignment then check that right is not a bit */
-       if (ASSIGNMENT (dic) && !POINTER_SET (dic)) {
-         sym_link *etype = operandType (IC_RIGHT (dic));
+       if (ASSIGNMENT (ic) && !POINTER_SET (ic)) {
+         sym_link *etype = operandType (IC_RESULT (dic));
 
                if (IS_BITFIELD (etype)) {
                        /* if result is a bit too then it's ok */
-                       etype = operandType (IC_RESULT (dic));
+                       etype = operandType (IC_RESULT (ic));
                        if (!IS_BITFIELD (etype)) {
                                debugLog(" %d bitfields\n");
                          return 0;
@@ -4464,7 +4464,9 @@ pic16_assignRegisters (ebbIndex * ebbi)
   regTypeNum ();
 
   /* start counting function temporary registers from zero */
-  dynrIdx = 0;
+  /* XXX: Resetting dynrIdx breaks register allocation,
+   *      see #1489055, #1483693 (?), and #1445850! */
+  //dynrIdx = 0;
 
   /* and serially allocate registers */
   serialRegAssign (ebbs, count);