* support/Util/findme.c: alloca() replaced with malloc()/free() pair
[fw/sdcc] / src / pic16 / pcoderegs.c
index 525a1bae5fa00cd125653d32f5ec708507779c77..2c66a5527205a3da6cd4282fdee6415e950cc6cb 100644 (file)
@@ -170,6 +170,7 @@ static void pCodeRegMapLiveRangesInFlow(pCodeFlow *pcfl)
     if(reg) {
 
 #if 0
+      fprintf(stderr, "reg= %p\n", reg);
       fprintf(stderr, "flow seq %d, inst seq %d  %s  ",PCODE(pcfl)->seq,pc->seq,reg->name);
       fprintf(stderr, "addr = 0x%03x, type = %d  rIdx=0x%03x",
              reg->address,reg->type,reg->rIdx);
@@ -184,7 +185,7 @@ static void pCodeRegMapLiveRangesInFlow(pCodeFlow *pcfl)
 
       if(PCC_REGISTER & PCI(pc)->outCond)
        addSetIfnotP(& (reg->reglives.assignedpFlows), pcfl);
-       
+
       addSetIfnotP(& (reg->reglives.usedpCodes), pc);
 
 #if 1
@@ -195,6 +196,13 @@ static void pCodeRegMapLiveRangesInFlow(pCodeFlow *pcfl)
 
 //                     fprintf(stderr, "trying to get second operand from pCode reg= %s\n", reg->name);
                        addSetIfnotP(& (PCFL(pcfl)->registers), reg);
+
+                       if((PCC_REGISTER | PCC_LITERAL) & PCI(pc)->inCond)
+                               addSetIfnotP(& (reg->reglives.usedpFlows), pcfl);
+
+                       if(PCC_REGISTER & PCI(pc)->outCond)
+                               addSetIfnotP(& (reg->reglives.assignedpFlows), pcfl);
+                       
                        addSetIfnotP(& (reg->reglives.usedpCodes), pc);
 
        }
@@ -321,7 +329,7 @@ static void  RemoveRegsFromSet(set *regset)
        pc = setFirstItem(reg->reglives.usedpCodes);
 
        if(reg->type == REG_SFR) {
-         //fprintf(stderr, "not removing SFR reg %s even though used only once\n",reg->name);
+               fprintf(stderr, "not removing SFR reg %s even though used only once\n",reg->name);
          continue;
        }
 
@@ -379,7 +387,8 @@ void pic16_RemoveUnusedRegisters(void)
   */
   RemoveRegsFromSet(pic16_dynDirectBitRegs);
 
-  if(total_registers_saved) fprintf(stderr, " *** Saved %d registers ***\n", total_registers_saved);
+  if(total_registers_saved && pic16_pcode_verbose)
+       fprintf(stderr, " *** Saved %d registers ***\n", total_registers_saved);
 }
 
 
@@ -660,10 +669,10 @@ static void OptimizeRegUsage(set *fregs, int optimize_multi_uses, int optimize_l
     reg = fregs->item;
     fregs = fregs->next;
 
-    if(reg->type == REG_SFR) {
-      //fprintf(stderr,"skipping SFR: %s\n",reg->name);
-      continue;
-    }
+       if(reg->type == REG_SFR) {
+//             fprintf(stderr,"skipping SFR: %s\n",reg->name);
+               continue;
+       }
 
     pcfl_used = setFirstItem(reg->reglives.usedpFlows);
     pcfl_assigned = setFirstItem(reg->reglives.assignedpFlows);
@@ -677,12 +686,13 @@ static void OptimizeRegUsage(set *fregs, int optimize_multi_uses, int optimize_l
        * instructions are examined. If possible, they're optimized out.
        */
 
-/*
+#if 0
       fprintf (stderr, "OptimizeRegUsage: %s  addr=0x%03x rIdx=0x%03x type=%d used=%d\n",
               reg->name,
               reg->address,
               reg->rIdx, reg->type, used);
-*/
+#endif
+
       pc1 = setFirstItem(reg->reglives.usedpCodes);
       pc2 = setNextItem(reg->reglives.usedpCodes);
 
@@ -712,7 +722,7 @@ static void OptimizeRegUsage(set *fregs, int optimize_multi_uses, int optimize_l
        //fprintf(stderr,"WARNING %s: reg %s used without being assigned\n",__FUNCTION__,reg->name);
 
       } else {
-       //fprintf(stderr,"WARNING %s: reg %s assigned without being used\n",__FUNCTION__,reg->name);
+//             fprintf(stderr,"WARNING %s: reg %s assigned without being used\n",__FUNCTION__,reg->name);
        Remove2pcodes(pcfl_assigned, pc1, pc2, reg, 1);
        total_registers_saved++;  // debugging stats.
       }
@@ -723,7 +733,7 @@ static void OptimizeRegUsage(set *fregs, int optimize_multi_uses, int optimize_l
       if(used && !pcfl_used && pcfl_assigned) {
        pCode *pc;
 
-       //fprintf(stderr,"WARNING %s: reg %s assigned without being used\n",__FUNCTION__,reg->name);
+//             fprintf(stderr,"WARNING %s: reg %s assigned without being used\n",__FUNCTION__,reg->name);
 
        pc = setFirstItem(reg->reglives.usedpCodes);
        while(pc) {
@@ -810,7 +820,8 @@ void pic16_pCodeRegOptimizeRegUsage(int level)
     OptimizeRegUsage(pic16_dynStackRegs,level, (OPT_PASSES-passes));
     OptimizeRegUsage(pic16_dynDirectRegs,0, (OPT_PASSES-passes));
 
-    if(total_registers_saved != saved)
+    if((total_registers_saved != saved)
+       && (pic16_pcode_verbose))
       fprintf(stderr, " *** pass %d, Saved %d registers, total saved %d ***\n", 
              (1+OPT_PASSES-passes),total_registers_saved-saved,total_registers_saved);
       
@@ -819,6 +830,8 @@ void pic16_pCodeRegOptimizeRegUsage(int level)
   } while( passes && ((total_registers_saved != saved) || (passes==OPT_PASSES-1)) );
 
   if(total_registers_saved == t) 
+
+  if(pic16_debug_verbose)
     fprintf(stderr, "No registers saved on this pass\n");