Author: zoltan
Date: 2006-01-14 20:21:30 -0500 (Sat, 14 Jan 2006)
New Revision: 55589

Modified:
   branches/vargaz/mini-linear-il/mono/mono/mini/liveness.c
   branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c
   branches/vargaz/mini-linear-il/mono/mono/mini/mini-codegen.c
   branches/vargaz/mini-linear-il/mono/mono/mini/regalloc.c
   branches/vargaz/mini-linear-il/mono/mono/mini/regalloc.h
Log:
Optimize things a bit

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/liveness.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/liveness.c    2006-01-14 
21:32:53 UTC (rev 55588)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/liveness.c    2006-01-15 
01:21:30 UTC (rev 55589)
@@ -60,7 +60,7 @@
 static void
 update_gen_kill_set (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *inst, int 
inst_num)
 {
-       int arity = mono_burg_arity [inst->opcode];
+       int arity;
        int max_vars = cfg->num_varinfo;
 
        if (cfg->new_ir) {
@@ -153,6 +153,7 @@
                return;
        }
 
+       arity = mono_burg_arity [inst->opcode];
        if (arity)
                update_gen_kill_set (cfg, bb, inst->inst_i0, inst_num);
 

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c        
2006-01-14 21:32:53 UTC (rev 55588)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c        
2006-01-15 01:21:30 UTC (rev 55589)
@@ -9183,6 +9183,7 @@
  * - fix #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS for x86
  * - same goes for lcall and other non-decomposable long opcodes
  * - make byref a 'normal' type.
+ * - use 8 bytes per chunk in monobitset on 64 bit platforms
  * - LAST MERGE: 55174
  */
 

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-codegen.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-codegen.c        
2006-01-14 21:32:53 UTC (rev 55588)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-codegen.c        
2006-01-15 01:21:30 UTC (rev 55589)
@@ -692,7 +692,7 @@
        MONO_FP_NEEDS_LOAD                      = regmask (2)
 };
 
-static int
+static inline int
 alloc_int_reg (MonoCompile *cfg, InstList *tmp, MonoInst *ins, regmask_t 
dest_mask, int sym_reg, RegTrack *info)
 {
        int val;
@@ -712,7 +712,7 @@
        return val;
 }
 
-static int
+static inline int
 alloc_float_reg (MonoCompile *cfg, InstList *tmp, MonoInst *ins, regmask_t 
dest_mask, int sym_reg)
 {
        int val;
@@ -726,7 +726,7 @@
        return val;
 }
 
-static int
+static inline int
 alloc_reg (MonoCompile *cfg, InstList *tmp, MonoInst *ins, regmask_t 
dest_mask, int sym_reg, RegTrack *info, gboolean fp)
 {
        if (fp)
@@ -791,23 +791,43 @@
        rs->next_vireg = bb->max_ireg;
        rs->next_vfreg = bb->max_freg;
        mono_regstate_assign (rs);
-       reginfo = g_malloc0 (sizeof (RegTrack) * rs->next_vireg);
-       reginfof = g_malloc0 (sizeof (RegTrack) * rs->next_vfreg);
        rs->ifree_mask = MONO_ARCH_CALLEE_REGS;
        rs->ffree_mask = MONO_ARCH_CALLEE_FREGS;
 
        if (use_fpstack)
                rs->ffree_mask = 0xff & ~(regmask (MONO_ARCH_FPSTACK_SIZE));
 
-       ins = bb->code;
+       /* 
+        * For large methods, next_vireg can be very large, so g_malloc0 time 
can
+        * be prohibitive. In those cases, manually init the reginfo entries 
used
+        * by the bblock.
+        */
+       if (rs->next_vireg > 256) {
+               int max = rs->next_vireg;
 
+               reginfo = g_malloc (sizeof (RegTrack) * max);
+               for (ins = bb->code; ins; ins = ins->next) {
+                       if ((ins->dreg != -1) && (ins->dreg < max))
+                               memset (&reginfo [ins->dreg], 0, sizeof 
(RegTrack));
+                       if ((ins->sreg1 != -1) && (ins->sreg1 < max))
+                               memset (&reginfo [ins->sreg1], 0, sizeof 
(RegTrack));
+                       if ((ins->sreg2 != -1) && (ins->sreg2 < max))
+                               memset (&reginfo [ins->sreg2], 0, sizeof 
(RegTrack));
+               }
+       }
+       else
+               reginfo = g_malloc0 (sizeof (RegTrack) * rs->next_vireg);
+       reginfof = g_malloc0 (sizeof (RegTrack) * rs->next_vfreg);
+
        /*if (cfg->opt & MONO_OPT_COPYPROP)
                local_copy_prop (cfg, ins);*/
 
        i = 1;
        fpcount = 0;
        DEBUG (g_print ("\nLOCAL regalloc: basic block %d:\n", bb->block_num));
+
        /* forward pass on the instructions to collect register liveness info */
+       ins = bb->code;
        while (ins) {
                spec = ins_spec [ins->opcode];
 
@@ -866,6 +886,8 @@
                        if (cfg->new_ir && is_soft_reg (ins->sreg1, fp))
                                /* This means the vreg is not local to this bb 
*/
                                g_assert (reginfo1 [ins->sreg1].born_in > 0);
+                       if (!fp)
+                               rs->iassign [ins->sreg1] = -1;
                        reginfo1 [ins->sreg1].prev_use = reginfo1 
[ins->sreg1].last_use;
                        reginfo1 [ins->sreg1].last_use = i;
                        if (MONO_ARCH_INST_IS_REGPAIR (spec [MONO_INST_SRC2])) {
@@ -885,6 +907,8 @@
                        if (cfg->new_ir && is_soft_reg (ins->sreg2, fp))
                                /* This means the vreg is not local to this bb 
*/
                                g_assert (reginfo2 [ins->sreg2].born_in > 0);
+                       if (!fp)
+                               rs->iassign [ins->sreg2] = -1;
                        reginfo2 [ins->sreg2].prev_use = reginfo2 
[ins->sreg2].last_use;
                        reginfo2 [ins->sreg2].last_use = i;
                        if (MONO_ARCH_INST_IS_REGPAIR (spec [MONO_INST_SRC2])) {
@@ -900,13 +924,13 @@
                if (spec [MONO_INST_DEST]) {
                        int dest_dreg;
 
-                       if (dreg_is_fp (ins))
-                               reginfod = reginfof;
-                       else
-                               reginfod = reginfo;
+                       fp = dreg_is_fp (ins);
+                       reginfod = fp ? reginfof : reginfo;
                        if (spec [MONO_INST_DEST] != 'b') /* it's not just a 
base register */
                                reginfod [ins->dreg].killed_in = i;
                        g_assert (ins->dreg != -1);
+                       if (!fp)
+                               rs->iassign [ins->dreg] = -1;
                        reginfod [ins->dreg].prev_use = reginfod 
[ins->dreg].last_use;
                        reginfod [ins->dreg].last_use = i;
                        if (reginfod [ins->dreg].born_in == 0 || reginfod 
[ins->dreg].born_in > i)

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/regalloc.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/regalloc.c    2006-01-14 
21:32:53 UTC (rev 55588)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/regalloc.c    2006-01-15 
01:21:30 UTC (rev 55589)
@@ -35,22 +35,34 @@
 mono_regstate_assign (MonoRegState *rs) {
        int i;
        rs->max_ireg = -1;
-       g_free (rs->iassign);
-       rs->iassign = g_malloc (MAX (MONO_MAX_IREGS, rs->next_vireg) * sizeof 
(int));
+
+       if (rs->next_vireg != rs->iassign_size) {
+               g_free (rs->iassign);
+               rs->iassign = g_malloc (MAX (MONO_MAX_IREGS, rs->next_vireg) * 
sizeof (int));
+               rs->iassign_size = rs->next_vireg;
+       }
+
        for (i = 0; i < MONO_MAX_IREGS; ++i) {
                rs->iassign [i] = i;
                rs->isymbolic [i] = 0;
        }
-       memset (rs->iassign, -1, sizeof (rs->iassign [0]) * rs->next_vireg);
 
-       g_free (rs->fassign);
-       rs->fassign = g_malloc (MAX (MONO_MAX_FREGS, rs->next_vfreg) * sizeof 
(int));
+       /* iassign can be very large so it needs to be initialized by the 
caller */
+       memset (rs->iassign, -1, MONO_MAX_IREGS);
+
+       if (rs->next_vfreg != rs->fassign_size) {
+               g_free (rs->fassign);
+               rs->fassign = g_malloc (MAX (MONO_MAX_FREGS, rs->next_vfreg) * 
sizeof (int));
+               rs->fassign_size = rs->next_vfreg;
+       }
+
        for (i = 0; i < MONO_MAX_FREGS; ++i) {
                rs->fassign [i] = i;
                rs->fsymbolic [i] = 0;
        }
-       for (; i < rs->next_vfreg; ++i)
-               rs->fassign [i] = -1;
+
+       if (rs->next_vfreg)
+               memset (rs->fassign, -1, sizeof (rs->fassign [0]) * 
rs->next_vfreg);
 }
 
 int

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/regalloc.h
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/regalloc.h    2006-01-14 
21:32:53 UTC (rev 55588)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/regalloc.h    2006-01-15 
01:21:30 UTC (rev 55589)
@@ -40,6 +40,8 @@
 
        int max_ireg;
        int ispills;
+
+       int iassign_size, fassign_size;
 } MonoRegState;
 
 #define mono_regstate_next_int(rs)   ((rs)->next_vireg++)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to