Author: zoltan
Date: 2007-05-04 15:54:51 -0400 (Fri, 04 May 2007)
New Revision: 76723
Modified:
branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
branches/vargaz/mini-linear-il/mono/mono/mini/abcremoval2.c
branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c
branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h
Log:
2007-05-04 Zoltan Varga <[EMAIL PROTECTED]>
* mini-ops.h: Add OP_NEWARR.
* method-to-ir.c: Decompose CEE_NEWARR after abcrem.
* abcremoval2.c (summarize_integer_value): Handle CEE_NEWARR too.
* abcremoval2.c (get_relations_from_previous_bb): Handle
OP_ICOMPARE_IMM too.
* abcremoval2.c (mono_perform_abc_removal2): Add symmetric relations.
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog 2007-05-04
19:53:09 UTC (rev 76722)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog 2007-05-04
19:54:51 UTC (rev 76723)
@@ -1,5 +1,15 @@
2007-05-04 Zoltan Varga <[EMAIL PROTECTED]>
+ * mini-ops.h: Add OP_NEWARR.
+
+ * method-to-ir.c: Decompose CEE_NEWARR after abcrem.
+
+ * abcremoval2.c (summarize_integer_value): Handle CEE_NEWARR too.
+
+ * abcremoval2.c (get_relations_from_previous_bb): Handle
OP_ICOMPARE_IMM too.
+
+ * abcremoval2.c (mono_perform_abc_removal2): Add symmetric relations.
+
* abcremoval2.c (mono_perform_abc_removal2): Compute
variable_value_kind as in the
original implementation.
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/abcremoval2.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/abcremoval2.c 2007-05-04
19:53:09 UTC (rev 76722)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/abcremoval2.c 2007-05-04
19:54:51 UTC (rev 76723)
@@ -293,6 +293,11 @@
result->value.variable.delta = 0;
value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_4;
break;
+ case OP_NEWARR:
+ result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
+ result->value.variable.variable = ins->sreg1;
+ result->value.variable.delta = 0;
+ break;
/* FIXME: Add more opcodes */
default:
@@ -396,6 +401,11 @@
relations->relation2.relation.related_value.type =
MONO_VARIABLE_SUMMARIZED_VALUE;
relations->relation2.relation.related_value.value.variable.variable =
compare->sreg1;
relations->relation2.relation.related_value.value.variable.delta = 0;
+ } else if (compare->opcode == OP_ICOMPARE_IMM) {
+ relations->relation1.variable = compare->sreg1;
+ relations->relation1.relation.relation =
branch_relation;
+
relations->relation1.relation.related_value.type =
MONO_CONSTANT_SUMMARIZED_VALUE;
+
relations->relation1.relation.related_value.value.constant.value =
compare->inst_imm;
}
}
}
@@ -560,7 +570,7 @@
MonoSummarizedValueRelation *relation = &(area->relations
[variable]);
if (TRACE_ABC_REMOVAL) {
- printf ("Evaluating varible %d (target variable %d)\n",
variable, target_variable);
+ printf ("Evaluating variable %d (target variable
%d)\n", variable, target_variable);
print_summarized_value_relation (relation);
printf ("\n");
}
@@ -620,7 +630,7 @@
// Check if we are part of a
recursive loop
if (context->status &
MONO_RELATIONS_EVALUATION_IS_RECURSIVE) {
if (TRACE_ABC_REMOVAL) {
- printf
("Recursivity detected for varible %d (target variable %d), status ", variable,
target_variable);
+ printf
("Recursivity detected for variable %d (target variable %d), status ",
variable, target_variable);
print_evaluation_context_status (context->status);
}
@@ -673,7 +683,7 @@
// This means we are part of a
recursive loop
if (context->status &
MONO_RELATIONS_EVALUATION_IS_RECURSIVE) {
if (TRACE_ABC_REMOVAL) {
- printf ("Recursivity
detected for varible %d (target variable %d), status ", variable,
target_variable);
+ printf ("Recursivity
detected for variable %d (target variable %d), status ", variable,
target_variable);
print_evaluation_context_status (context->status);
printf ("\n");
}
@@ -720,7 +730,7 @@
// Check if any recursivity bits are still in the status, and
in any case clear them
if (context->status & MONO_RELATIONS_EVALUATION_IS_RECURSIVE) {
if (TRACE_ABC_REMOVAL) {
- printf ("Recursivity for varible %d (target
variable %d) discards computation, status ", variable, target_variable);
+ printf ("Recursivity for variable %d (target
variable %d) discards computation, status ", variable, target_variable);
print_evaluation_context_status
(context->status);
printf ("\n");
}
@@ -730,7 +740,7 @@
context->status = MONO_RELATIONS_EVALUATION_NOT_STARTED;
} else {
if (TRACE_ABC_REMOVAL) {
- printf ("Ranges for varible %d (target variable
%d) computed: ", variable, target_variable);
+ printf ("Ranges for variable %d (target
variable %d) computed: ", variable, target_variable);
print_evaluation_context_ranges
(&(context->ranges));
printf ("\n");
}
@@ -748,7 +758,7 @@
int path_value = 0;
if (TRACE_ABC_REMOVAL) {
- printf ("Evaluation of varible %d (target variable %d)
already in progress\n", variable, target_variable);
+ printf ("Evaluation of variable %d (target variable %d)
already in progress\n", variable, target_variable);
print_evaluation_context (context);
print_summarized_value_relation
(context->current_relation);
printf ("\n");
@@ -814,7 +824,7 @@
}
default:
if (TRACE_ABC_REMOVAL) {
- printf ("Varible %d (target variable %d) already in a
recursive ring, skipping\n", variable, target_variable);
+ printf ("Variable %d (target variable %d) already in a
recursive ring, skipping\n", variable, target_variable);
print_evaluation_context (context);
print_summarized_value_relation
(context->current_relation);
printf ("\n");
@@ -1138,7 +1148,28 @@
}
}
- /* FIXME: Add symmetric relations */
+ /* Add symmetric relations */
+ for (i = 0; i < cfg->next_vreg; i++) {
+ if (area.relations [i].related_value.type ==
MONO_VARIABLE_SUMMARIZED_VALUE) {
+ int related_index = cfg->next_vreg + i;
+ int related_variable = area.relations
[i].related_value.value.variable.variable;
+
+ area.relations [related_index].relation =
MONO_EQ_RELATION;
+ area.relations
[related_index].relation_is_static_definition = TRUE;
+ area.relations [related_index].related_value.type =
MONO_VARIABLE_SUMMARIZED_VALUE;
+ area.relations
[related_index].related_value.value.variable.variable = i;
+ area.relations
[related_index].related_value.value.variable.delta = - area.relations
[i].related_value.value.variable.delta;
+
+ area.relations [related_index].next = area.relations
[related_variable].next;
+ area.relations [related_variable].next =
&(area.relations [related_index]);
+
+ if (TRACE_ABC_REMOVAL) {
+ printf ("Added symmetric summarized value for
variable variable %d (to %d): ", i, related_variable);
+ print_summarized_value (&(area.relations
[related_index].related_value));
+ printf ("\n");
+ }
+ }
+ }
process_block (cfg->bblocks [0], &area);
}
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
2007-05-04 19:53:09 UTC (rev 76722)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c
2007-05-04 19:54:51 UTC (rev 76723)
@@ -5374,6 +5374,7 @@
MonoInst *ins;
MonoInst *prev = NULL;
MonoInst *dest;
+ MonoInst *iargs [3];
gboolean restart;
if (cfg->verbose_level > 3) mono_print_bb (bb, "BEFORE
DECOMPOSE-ARRAY-ACCESS-OPTS ");
@@ -5394,6 +5395,27 @@
case OP_BOUNDS_CHECK:
MONO_ARCH_EMIT_BOUNDS_CHECK (cfg,
ins->sreg1, ins->inst_imm, ins->sreg2);
break;
+ case OP_NEWARR:
+ if (cfg->opt & MONO_OPT_SHARED) {
+ EMIT_NEW_DOMAINCONST (cfg,
iargs [0]);
+ EMIT_NEW_CLASSCONST (cfg, iargs
[1], ins->inst_newa_class);
+ MONO_INST_NEW (cfg, iargs [2],
OP_MOVE);
+ iargs [2]->dreg = ins->sreg1;
+
+ dest = mono_emit_jit_icall
(cfg, mono_array_new, iargs, ins->cil_code);
+ dest->dreg = ins->dreg;
+ } else {
+ MonoVTable *vtable =
mono_class_vtable (cfg->domain, mono_array_class_get (ins->inst_newa_class, 1));
+
+ NEW_VTABLECONST (cfg, iargs
[0], vtable);
+ MONO_ADD_INS (cfg->cbb, iargs
[0]);
+ MONO_INST_NEW (cfg, iargs [1],
OP_MOVE);
+ iargs [1]->dreg = ins->sreg1;
+
+ dest = mono_emit_jit_icall
(cfg, mono_array_new_specific, iargs, ins->cil_code);
+ dest->dreg = ins->dreg;
+ }
+ break;
default:
break;
}
@@ -7700,9 +7722,7 @@
/*
* Array opcodes
*/
- case CEE_NEWARR: {
- MonoInst *iargs [3];
-
+ case CEE_NEWARR:
CHECK_STACK (1);
--sp;
@@ -7713,25 +7733,28 @@
CHECK_TYPELOAD (klass);
if (cfg->opt & MONO_OPT_SHARED) {
+ /* Decompose now to avoid problems with
references to the domainvar */
+ MonoInst *iargs [3];
+
EMIT_NEW_DOMAINCONST (cfg, iargs [0]);
EMIT_NEW_CLASSCONST (cfg, iargs [1], klass);
iargs [2] = sp [0];
*sp++ = mono_emit_jit_icall (cfg,
mono_array_new, iargs, ip);
} else {
- MonoVTable *vtable = mono_class_vtable
(cfg->domain, mono_array_class_get (klass, 1));
-
- NEW_VTABLECONST (cfg, iargs [0], vtable);
- MONO_ADD_INS (cfg->cbb, iargs [0]);
- iargs [1] = sp [0];
-
- *sp++ = mono_emit_jit_icall (cfg,
mono_array_new_specific, iargs, ip);
+ /* Decompose later since it is needed by abcrem
*/
+ MONO_INST_NEW (cfg, ins, OP_NEWARR);
+ ins->dreg = alloc_preg (cfg);
+ ins->sreg1 = sp [0]->dreg;
+ ins->inst_newa_class = klass;
+ ins->type = STACK_OBJ;
+ ins->klass = klass;
+ MONO_ADD_INS (cfg->cbb, ins);
+ *sp++ = ins;
}
-
ip += 5;
inline_costs += 1;
break;
- }
case CEE_LDLEN:
CHECK_STACK (1);
--sp;
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h 2007-05-04
19:53:09 UTC (rev 76722)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h 2007-05-04
19:54:51 UTC (rev 76723)
@@ -545,6 +545,7 @@
MINI_OP(OP_STRLEN, "strlen", NONE, NONE, NONE)
MINI_OP(OP_GETTYPE, "gettype", NONE, NONE, NONE)
MINI_OP(OP_GETHASHCODE, "gethashcode", NONE, NONE, NONE)
+MINI_OP(OP_NEWARR, "newarr", IREG, IREG, NONE)
MINI_OP(OP_LDLEN, "ldlen", IREG, IREG, NONE)
MINI_OP(OP_BOUNDS_CHECK, "bounds_check", NONE, IREG, IREG)
/* get adress of element in a 2D array */
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches