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 (®info [ins->dreg], 0, sizeof
(RegTrack));
+ if ((ins->sreg1 != -1) && (ins->sreg1 < max))
+ memset (®info [ins->sreg1], 0, sizeof
(RegTrack));
+ if ((ins->sreg2 != -1) && (ins->sreg2 < max))
+ memset (®info [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