2008-08-19 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / aliasing.c
index 584a03ee89c84ae30508da217a0d82f79a73e9ae..f0ef836024967522f0cc56659ae2691f836ff822 100644 (file)
@@ -48,7 +48,7 @@ static const char *mono_stack_type_names[] = {
 
 
 #define OP_IS_OUTARG(op) (((op)==OP_OUTARG)||((op)==OP_OUTARG_REG)||((op)==OP_OUTARG_IMM)||((op)==OP_OUTARG_R4)||((op)==OP_OUTARG_R8)||((op)==OP_OUTARG_VT))
-#define OP_IS_CALL(op) (((op)==CEE_CALLI)||((op)==CEE_CALL)||((op)==CEE_CALLVIRT)||(((op)>=OP_VOIDCALL)&&((op)<=OP_CALL_MEMBASE)))
+#define OP_IS_CALL(op) (((op)==CEE_CALLI)||((op)==OP_CALL)||((op)==OP_CALLVIRT)||(((op)>=OP_VOIDCALL)&&((op)<=OP_CALL_MEMBASE)))
 #define OP_IS_STORE(op) (((op)==CEE_STIND_REF)||((op)==CEE_STIND_I1)||((op)==CEE_STIND_I2)||((op)==CEE_STIND_I4)||((op)==CEE_STIND_I8)||((op)==CEE_STIND_R4)||((op)==CEE_STIND_R8)||((op)==CEE_STIND_I))
 #define OP_IS_LOAD(op) (((op)==CEE_LDIND_REF)||((op)==CEE_LDIND_I1)||((op)==CEE_LDIND_I2)||((op)==CEE_LDIND_I4)||((op)==CEE_LDIND_U1)||((op)==CEE_LDIND_U2)||((op)==CEE_LDIND_U4)||((op)==CEE_LDIND_I8)||((op)==CEE_LDIND_R4)||((op)==CEE_LDIND_R8)||((op)==CEE_LDIND_I))
 #define OP_IS_CONST(op) (((op)==OP_ICONST)||((op)==OP_I8CONST)||((op)==OP_R4CONST)||((op)==OP_R8CONST)||((op)==OP_AOTCONST))
@@ -158,8 +158,8 @@ print_tree_node (MonoInst *tree) {
        case CEE_NEWARR:
                printf ("[%s]",  tree->inst_newa_class->name);
                break;
-       case CEE_CALL:
-       case CEE_CALLVIRT:
+       case OP_CALL:
+       case OP_CALLVIRT:
        case OP_FCALL:
        case OP_FCALLVIRT:
        case OP_LCALL:
@@ -168,7 +168,22 @@ print_tree_node (MonoInst *tree) {
        case OP_VCALLVIRT:
        case OP_VOIDCALL:
        case OP_VOIDCALLVIRT:
-       case OP_TRAMPCALL_VTABLE: {
+       case OP_TRAMPCALL_VTABLE:
+       case OP_CALL_RGCTX:
+       case OP_FCALL_RGCTX:
+       case OP_VOIDCALL_RGCTX:
+       case OP_LCALL_RGCTX:
+       case OP_VCALL_RGCTX:
+       case OP_CALL_REG_RGCTX:
+       case OP_FCALL_REG_RGCTX:
+       case OP_VOIDCALL_REG_RGCTX:
+       case OP_LCALL_REG_RGCTX:
+       case OP_VCALL_REG_RGCTX:
+       case OP_CALLVIRT_IMT:
+       case OP_VOIDCALLVIRT_IMT:
+       case OP_FCALLVIRT_IMT:
+       case OP_LCALLVIRT_IMT:
+       case OP_VCALLVIRT_IMT: {
                MonoCallInst *call = (MonoCallInst*)tree;
                if (call->method)
                        printf ("[%s]", call->method->name);
@@ -649,24 +664,33 @@ update_aliasing_information_on_inst (MonoAliasingInformation *info, MonoAliasing
                }
        } else {
                MonoAliasType father_type = MONO_ALIASING_TYPE_NO_ALIAS;
+               MonoLocalVariableList *affected_variables = NULL;
+               
                if ((context.subtree_aliases [0].type == MONO_ALIASING_TYPE_LOCAL) || (context.subtree_aliases [0].type == MONO_ALIASING_TYPE_LOCAL_FIELD)) {
-                       MonoAliasUsageInformation *use = mono_mempool_alloc (info->mempool, sizeof (MonoAliasUsageInformation));
-                       
-                       inst->ssa_op = MONO_SSA_INDIRECT_LOAD_STORE;
-                       use->inst = inst;
-                       use->affected_variables = &(info->variables [context.subtree_aliases [0].variable_index]);
-                       APPEND_USE (info, bb_info, use);
+                       affected_variables = &(info->variables [context.subtree_aliases [0].variable_index]);
                        ADD_BAD_ALIAS (info, context.subtree_aliases [0].variable_index);
                }
                if ((context.subtree_aliases [1].type == MONO_ALIASING_TYPE_LOCAL) || (context.subtree_aliases [1].type == MONO_ALIASING_TYPE_LOCAL_FIELD)) {
+                       if (affected_variables == NULL) {
+                               affected_variables = &(info->variables [context.subtree_aliases [1].variable_index]);
+                       } else if (affected_variables->variable_index != context.subtree_aliases [1].variable_index) {
+                               int previous_index = affected_variables->variable_index;
+                               affected_variables = NULL;
+                               ADD_UNIQUE_VARIABLE (info, affected_variables, previous_index);
+                               ADD_UNIQUE_VARIABLE (info, affected_variables, context.subtree_aliases [1].variable_index);
+                       }
+                       ADD_BAD_ALIAS (info, context.subtree_aliases [1].variable_index);
+               }
+               
+               if (affected_variables != NULL) {
                        MonoAliasUsageInformation *use = mono_mempool_alloc (info->mempool, sizeof (MonoAliasUsageInformation));
                        
                        inst->ssa_op = MONO_SSA_INDIRECT_LOAD_STORE;
                        use->inst = inst;
-                       use->affected_variables = &(info->variables [context.subtree_aliases [1].variable_index]);
+                       use->affected_variables = affected_variables;
                        APPEND_USE (info, bb_info, use);
-                       ADD_BAD_ALIAS (info, context.subtree_aliases [1].variable_index);
                }
+               
                if (father_alias != NULL) { 
                        if ((context.subtree_aliases [0].type == MONO_ALIASING_TYPE_ANY) || (context.subtree_aliases [1].type == MONO_ALIASING_TYPE_ANY)) {
                                father_type = MONO_ALIASING_TYPE_ANY;
@@ -979,9 +1003,7 @@ mono_aliasing_deadce (MonoAliasingInformation *info) {
        possibly_dead_assignments = alloca (cfg->num_varinfo * sizeof (MonoInst*));
        
        if (LOG_DEADCE) {
-               printf ("BEFORE DEADCE START\n");
-               mono_print_code (cfg);
-               printf ("BEFORE DEADCE END\n");
+               mono_print_code (cfg, "BEFORE DEADCE START");
        }
        
 #if (MONO_APPLY_DEADCE_TO_SINGLE_METHOD)
@@ -1038,8 +1060,6 @@ mono_aliasing_deadce (MonoAliasingInformation *info) {
        }
        
        if (LOG_DEADCE) {
-               printf ("AFTER DEADCE START\n");
-               mono_print_code (cfg);
-               printf ("AFTER DEADCE END\n");
+               mono_print_code (cfg, "AFTER DEADCE");
        }
 }