Author: zoltan
Date: 2006-01-16 16:43:55 -0500 (Mon, 16 Jan 2006)
New Revision: 55657
Modified:
branches/vargaz/mini-linear-il/mono/mono/mini/mini-codegen.c
branches/vargaz/mini-linear-il/mono/mono/mini/mini.c
Log:
Implement copy propagation
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-16 21:38:04 UTC (rev 55656)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-codegen.c
2006-01-16 21:43:55 UTC (rev 55657)
@@ -1195,8 +1195,9 @@
* TRACK DREG
*/
fp = dreg_is_fp (ins);
- if (spec [MONO_INST_DEST] && (!fp || (fp && !use_fpstack)) &&
is_soft_reg (ins->dreg, fp))
+ if (spec [MONO_INST_DEST] && (!fp || (fp && !use_fpstack)) &&
is_soft_reg (ins->dreg, fp)) {
prev_dreg = ins->dreg;
+ }
if (spec [MONO_INST_DEST] == 'b') {
/*
@@ -1242,6 +1243,11 @@
if (dest_dreg != -1)
dreg_mask = (regmask (dest_dreg));
+ /* FIXME: Do this earlier */
+ if ((ins->opcode == OP_MOVE) && !fp && (reginfo
[ins->dreg].last_use == i) && (reginfo [ins->dreg].prev_use == 0)) {
+ ins->opcode = CEE_NOP;
+ }
+
val = rassign (cfg, ins->dreg, fp);
if (val < 0) {
@@ -1534,7 +1540,7 @@
}
}
else if ((dest_sreg1 != -1) && (dest_sreg1 !=
val)) {
- g_assert_not_reached ();
+ create_copy_ins (cfg, dest_sreg1, val,
ins, ip, fp);
}
ins->sreg1 = val;
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini.c 2006-01-16
21:38:04 UTC (rev 55656)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini.c 2006-01-16
21:43:55 UTC (rev 55657)
@@ -9303,6 +9303,96 @@
}
static void
+mono_local_cprop_bb2 (MonoCompile *cfg, MonoBasicBlock *bb, int acp_size)
+{
+ MonoInst *ins;
+ int i;
+ GArray *acp;
+
+ /* FIXME: Speed this up */
+
+ acp = g_array_new (FALSE, FALSE, sizeof (int));
+
+ for (ins = bb->code; ins; ins = ins->next) {
+ const char *spec = ins_info [ins->opcode - OP_START - 1];
+ int regtype, srcindex, sreg;
+ gboolean store;
+
+ if (ins->opcode < MONO_CEE_LAST)
+ continue;
+
+ /* FIXME: Store opcodes */
+
+ if (acp->len > 0) {
+ for (srcindex = 0; srcindex < 2; ++srcindex) {
+ regtype = spec [(srcindex == 0) ?
MONO_INST_SRC1 : MONO_INST_SRC2];
+ sreg = srcindex == 0 ? ins->sreg1 : ins->sreg2;
+
+ if ((regtype == 'i') && (sreg != -1)) {
+ for (i = 0; i < acp->len; i += 2)
+ if (g_array_index (acp, int, i)
== sreg) {
+ int vreg =
g_array_index (acp, int, i + 1);
+#if 0
+ {
+ static int
count = 0;
+ count ++;
+ if (count ==
atoi (getenv ("COUNT2")))
+ printf
("FOO\n");
+ if (count >
atoi (getenv ("COUNT2")))
+ vreg =
sreg;
+ }
+#endif
+ //printf ("CCOPY: R%d
-> R%d\n", sreg, vreg);
+ if (srcindex == 0)
+ ins->sreg1 =
vreg;
+ else
+ ins->sreg2 =
vreg;
+ break;
+ }
+ }
+ }
+ }
+
+ if ((ins->dreg != -1) && (spec [MONO_INST_DEST] == 'i')) {
+ /* Invalidate values */
+ for (i = 0; i < acp->len; i += 2)
+ if ((g_array_index (acp, int, i) == ins->dreg)
|| (g_array_index (acp, int, i + 1) == ins->dreg))
+ g_array_index (acp, int, i) = -1;
+ }
+
+ if (ins->opcode == OP_LDADDR) {
+ return;
+ }
+
+ /* FIXME: Add support for long/float */
+ if (ins->opcode == OP_MOVE) {
+ for (i = 0; i < acp->len; i += 2)
+ if (g_array_index (acp, int, i) == ins->dreg)
+ break;
+
+ if (i < acp->len)
+ g_array_index (acp, int, i + 1) = ins->sreg1;
+ else {
+ g_array_append_val (acp, ins->dreg);
+ g_array_append_val (acp, ins->sreg1);
+ }
+ }
+ }
+
+ g_array_free (acp, TRUE);
+}
+
+static void
+mono_local_cprop2 (MonoCompile *cfg)
+{
+ MonoBasicBlock *bb;
+
+ for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
+ mono_local_cprop_bb2 (cfg, bb, cfg->num_varinfo);
+ }
+}
+
+static void
remove_critical_edges (MonoCompile *cfg) {
MonoBasicBlock *bb;
MonoBasicBlock *previous_bb;
@@ -9608,6 +9698,8 @@
} else {
mono_local_cprop (cfg);
}
+ } else if (cfg->new_ir) {
+ mono_local_cprop2 (cfg);
}
if (cfg->comp_done & MONO_COMP_SSA) {
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches