Author: leo
Date: Mon Oct 10 07:42:06 2005
New Revision: 9431

Modified:
   trunk/imcc/reg_alloc.c
   trunk/imcc/unit.h
Log:
Variable-sized reg frames 1 - used register statistics

* move regs_used into the unit structure
* always record use register count
* whitespace cleanup of stat code


Modified: trunk/imcc/reg_alloc.c
==============================================================================
--- trunk/imcc/reg_alloc.c      (original)
+++ trunk/imcc/reg_alloc.c      Mon Oct 10 07:42:06 2005
@@ -110,14 +110,15 @@ imc_reg_alloc(Interp *interpreter, IMC_U
 
     if (!unit)
         return;
+    if (!unit->instructions)
+        return;
+    imc_stat_init(unit);
     if (!(IMCC_INFO(interpreter)->optimizer_level &
                 (OPT_PRE|OPT_CFG|OPT_PASM)) && unit->pasm_file)
-        return;
+        goto done;
 
     imcc_init_tables(interpreter);
     IMCC_INFO(interpreter)->allocated = 0;
-    if (!unit->instructions)
-        return;
 
 #if IMC_TRACE
     fprintf(stderr, "reg_alloc.c: imc_reg_alloc\n");
@@ -131,13 +132,12 @@ imc_reg_alloc(Interp *interpreter, IMC_U
     IMCC_debug(interpreter, DEBUG_IMC, "\n------------------------\n");
     IMCC_debug(interpreter, DEBUG_IMC, "processing sub %s\n", function);
     IMCC_debug(interpreter, DEBUG_IMC, "------------------------\n\n");
-    if (IMCC_INFO(interpreter)->verbose ||
-            (IMCC_INFO(interpreter)->debug & DEBUG_IMC))
-        imc_stat_init(unit);
 
-    if (IMCC_INFO(interpreter)->optimizer_level == OPT_PRE && unit->pasm_file) 
{
-        while (pre_optimize(interpreter, unit));
-        return;
+    if (IMCC_INFO(interpreter)->optimizer_level == OPT_PRE &&
+            unit->pasm_file) {
+        while (pre_optimize(interpreter, unit))
+            ;
+        goto done;
     }
 
     nodeStack = imcstack_new();
@@ -160,16 +160,22 @@ imc_reg_alloc(Interp *interpreter, IMC_U
 
         build_reglist(interpreter, unit, 1);
         life_analysis(interpreter, unit);
-    } while (!IMCC_INFO(interpreter)->dont_optimize && optimize(interpreter, 
unit));
+    } while (!IMCC_INFO(interpreter)->dont_optimize &&
+            optimize(interpreter, unit));
 
     graph_coloring_reg_alloc(interpreter, unit);
 
     if (IMCC_INFO(interpreter)->debug & DEBUG_IMC)
         dump_instructions(interpreter, unit);
+    imcstack_free(nodeStack);
+done:
     if (IMCC_INFO(interpreter)->verbose  ||
-            (IMCC_INFO(interpreter)->debug & DEBUG_IMC))
+            (IMCC_INFO(interpreter)->debug & DEBUG_IMC)) {
         print_stat(interpreter, unit);
-    imcstack_free(nodeStack);
+    }
+    else {
+        make_stat(unit, NULL, unit->n_regs_used);
+    }
 }
 
 void
@@ -254,45 +260,66 @@ make_stat(IMC_Unit * unit, int *sets, in
        for (; r; r = r->next)
             for (j = 0; j < 4; j++)
                 if (r->set == type[j] && (r->type & VTREGISTER)) {
-                    sets[j]++;
+                    if (sets)
+                        sets[j]++;
                     if (cols)
                         if (r->color > cols[j])
                             cols[j] = r->color;
                 }
     }
+    if (cols) {
+        for (j = 0; j < 4; j++)
+            ++cols[j];
+    }
 }
-static int imcsets[4];
+
 /* registes usage of .imc */
-static void imc_stat_init(IMC_Unit * unit) {
-    imcsets[0] = imcsets[1] = imcsets[2] = imcsets[3] = 0;
-    make_stat(unit, imcsets, 0);
+static void
+imc_stat_init(IMC_Unit * unit)
+{
+    int j;
+
+    make_stat(unit, unit->n_vars_used, NULL);
+    for (j = 0; j < 4; j++)
+        unit->n_regs_used[j] = -1;
+    /*
+     * TODO move statistic into unit
+     */
     memset(&ostat, 0, sizeof(ostat));
 }
 
 /* and final */
-static void print_stat(Parrot_Interp interpreter, IMC_Unit * unit)
+static void
+print_stat(Parrot_Interp interpreter, IMC_Unit * unit)
 {
     int sets[4] = {0,0,0,0};
-    int cols[4] = {-1,-1,-1,-1};
+
     char *function = unit->instructions->r[0]->name;
 
-    make_stat(unit, sets, cols);
-    IMCC_info(interpreter, 1, "sub %s:\n\tregisters in .imc:\t I%d, N%d, S%d, 
P%d\n",
-            function, imcsets[0], imcsets[1], imcsets[2], imcsets[3]);
-    IMCC_info(interpreter, 1, "\t%d labels, %d lines deleted, %d if_branch, %d 
branch_branch\n",
+    make_stat(unit, sets, unit->n_regs_used);
+    IMCC_info(interpreter, 1,
+            "sub %s:\n\tregisters in .imc:\t I%d, N%d, S%d, P%d\n",
+            function,
+            unit->n_vars_used[0], unit->n_vars_used[1],
+            unit->n_vars_used[2], unit->n_vars_used[3]);
+    IMCC_info(interpreter, 1,
+            "\t%d labels, %d lines deleted, "
+            "%d if_branch, %d branch_branch\n",
             ostat.deleted_labels, ostat.deleted_ins, ostat.if_branch,
             ostat.branch_branch);
     IMCC_info(interpreter, 1, "\t%d used once deleted\n",
             ostat.used_once);
-    IMCC_info(interpreter, 1, "\t%d invariants_moved\n", 
ostat.invariants_moved);
+    IMCC_info(interpreter, 1, "\t%d invariants_moved\n",
+            ostat.invariants_moved);
     IMCC_info(interpreter, 1, "\tregisters needed:\t I%d, N%d, S%d, P%d\n",
             sets[0], sets[1], sets[2], sets[3]);
-    IMCC_info(interpreter, 1, "\tregisters in .pasm:\t I%d, N%d, S%d, P%d - %d 
spilled\n",
-            cols[0]+1, cols[1]+1, cols[2]+1, cols[3]+1,
+    IMCC_info(interpreter, 1,
+            "\tregisters in .pasm:\t I%d, N%d, S%d, P%d - %d spilled\n",
+            unit->n_regs_used[0], unit->n_regs_used[1],
+            unit->n_regs_used[2], unit->n_regs_used[3],
             unit->n_spilled);
     IMCC_info(interpreter, 1, "\t%d basic_blocks, %d edges\n",
             unit->n_basic_blocks, edge_count(unit));
-
 }
 
 /* sort list by line  nr */

Modified: trunk/imcc/unit.h
==============================================================================
--- trunk/imcc/unit.h   (original)
+++ trunk/imcc/unit.h   Mon Oct 10 07:42:06 2005
@@ -47,6 +47,8 @@ typedef struct _IMC_Unit {
     SymReg *namespace;
     int pasm_file;
     INTVAL HLL_id;
+    int n_vars_used[4];        /* INSP in PIR */
+    int n_regs_used[4];        /* INSP in PBC */
 } IMC_Unit;
 
 

Reply via email to