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

Reply via email to