* s390x.md: correct int_xor_imm length
[mono.git] / mono / mini / ssa.c
index 51d83789cf8a1d849b12a81273b72c27755790c6..1a5313d97f1d5cfaf8111cd4e4ccf0afb2adcd05 100644 (file)
@@ -104,7 +104,7 @@ replace_usage (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *inst, MonoInst **
 
        arity = mono_burg_arity [inst->opcode];
 
-       if ((inst->ssa_op == MONO_SSA_LOAD || inst->ssa_op == MONO_SSA_MAYBE_LOAD) && 
+       if ((inst->ssa_op == MONO_SSA_LOAD || inst->ssa_op == MONO_SSA_ADDRESS_TAKEN) && 
            (inst->inst_i0->opcode == OP_LOCAL || inst->inst_i0->opcode == OP_ARG)) {
                MonoInst *new_var;
                int idx = inst->inst_i0->inst_c0;
@@ -147,7 +147,7 @@ extends_live (MonoInst *inst)
        arity = mono_burg_arity [inst->opcode];
 
        if (inst->ssa_op == MONO_SSA_LOAD && 
-           (inst->inst_i0->opcode == OP_LOCAL /*|| inst->inst_i0->opcode == OP_ARG*/)) {
+           (inst->inst_i0->opcode == OP_LOCAL || inst->inst_i0->opcode == OP_ARG)) {
                return 1;
        } else {
                if (arity) {
@@ -213,7 +213,7 @@ mono_ssa_rename_vars (MonoCompile *cfg, int max_vars, MonoBasicBlock *bb, MonoIn
                        idx = inst->inst_i0->inst_c0;
                        g_assert (idx < max_vars);
 
-                       if (!stack [idx] && bb == cfg->bb_init) {
+                       if ((!stack [idx]) && (bb == cfg->bb_init) && (inst->inst_i0->opcode != OP_ARG)) {
                                new_var = cfg->varinfo [idx];
                        } else {
                                new_var = mono_compile_create_var (cfg, inst->inst_i0->inst_vtype,  inst->inst_i0->opcode);
@@ -276,7 +276,7 @@ mono_ssa_compute (MonoCompile *cfg)
        g_assert (!(cfg->comp_done & MONO_COMP_SSA));
 
        /* we dont support methods containing exception clauses */
-       g_assert (((MonoMethodNormal *)cfg->method)->header->num_clauses == 0);
+       g_assert (mono_method_get_header (cfg->method)->num_clauses == 0);
        g_assert (!cfg->disable_ssa);
 
        //printf ("COMPUTS SSA %s %d\n", mono_method_full_name (cfg->method, TRUE), cfg->num_varinfo);
@@ -338,6 +338,8 @@ mono_ssa_compute (MonoCompile *cfg)
             
                        store->next = bb->code;
                        bb->code = store;
+                       if (!bb->last_ins)
+                               bb->last_ins = bb->code;
 
 #ifdef DEBUG_SSA
                        printf ("ADD PHI BB%d %s\n", cfg->bblocks [idx]->block_num, mono_method_full_name (cfg->method, TRUE));
@@ -416,7 +418,7 @@ mono_ssa_replace_copies (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *inst, c
 
        arity = mono_burg_arity [inst->opcode];
 
-       if ((inst->ssa_op == MONO_SSA_LOAD || inst->ssa_op == MONO_SSA_MAYBE_LOAD || inst->ssa_op == MONO_SSA_STORE) && 
+       if ((inst->ssa_op == MONO_SSA_LOAD || inst->ssa_op == MONO_SSA_ADDRESS_TAKEN || inst->ssa_op == MONO_SSA_STORE) && 
            (inst->inst_i0->opcode == OP_LOCAL || inst->inst_i0->opcode == OP_ARG)) {
                MonoInst *new_var;
                int idx = inst->inst_i0->inst_c0;
@@ -619,7 +621,7 @@ analyze_dev_use (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *root, MonoInst
                }
        }
 
-       if ((inst->ssa_op == MONO_SSA_LOAD || inst->ssa_op == MONO_SSA_MAYBE_LOAD) && 
+       if ((inst->ssa_op == MONO_SSA_LOAD || inst->ssa_op == MONO_SSA_ADDRESS_TAKEN) && 
            (inst->inst_i0->opcode == OP_LOCAL || inst->inst_i0->opcode == OP_ARG)) {
                MonoVarUsageInfo *ui = mono_mempool_alloc (cfg->mempool, sizeof (MonoVarUsageInfo));
                idx = inst->inst_i0->inst_c0;   
@@ -907,7 +909,7 @@ fold_tree (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *inst, MonoInst **carr
                        inst->opcode = CEE_BR;
                        inst->inst_target_bb = target;
                }
-       } else if (inst->opcode == CEE_SWITCH && evaluate_const_tree (cfg, inst->inst_left, &a, carray) == 1) {
+       } else if (inst->opcode == CEE_SWITCH && (evaluate_const_tree (cfg, inst->inst_left, &a, carray) == 1) && (a >= 0) && (a < GPOINTER_TO_INT (inst->klass))) {
                bb->out_bb [0] = inst->inst_many_bb [a];
                bb->out_count = 1;
                inst->inst_target_bb = bb->out_bb [0];
@@ -943,8 +945,11 @@ visit_inst (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *inst, GList **cvars,
 
        if (inst->opcode == CEE_SWITCH) {
                int r1, i, a;
+               int cases = GPOINTER_TO_INT (inst->klass);
 
                r1 = evaluate_const_tree (cfg, inst->inst_left, &a, carray);
+               if ((r1 == 1) && ((a < 0) || (a >= cases)))
+                       r1 = 2;
                if (r1 == 1) {
                        MonoBasicBlock *tb = inst->inst_many_bb [a];
                        if (!(tb->flags &  BB_REACHABLE)) {
@@ -952,7 +957,7 @@ visit_inst (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *inst, GList **cvars,
                                *bblist = g_list_prepend (*bblist, tb);
                        }
                } else if (r1 == 2) {
-                       for (i = (int)inst->klass; i >= 0; i--) {
+                       for (i = GPOINTER_TO_INT (inst->klass); i >= 0; i--) {
                                MonoBasicBlock *tb = inst->inst_many_bb [i];
                                if (!(tb->flags &  BB_REACHABLE)) {
                                        tb->flags |= BB_REACHABLE;
@@ -1168,6 +1173,8 @@ mono_ssa_deadce (MonoCompile *cfg)
        for (i = 0; i < cfg->num_varinfo; i++) {
                MonoMethodVar *info = cfg->vars [i];
                work_list = g_list_prepend (work_list, info);
+               
+               //if ((info->def != NULL) && (info->def->inst_i1->opcode != OP_PHI)) printf ("SSA DEADCE TOTAL LOCAL\n");
        }
 
        while (work_list) {
@@ -1190,6 +1197,7 @@ mono_ssa_deadce (MonoCompile *cfg)
                                        MonoMethodVar *u = cfg->vars [i1->inst_i0->inst_c0];
                                        add_to_dce_worklist (cfg, info, u, &work_list);
                        }
+                       //if (i1->opcode != OP_PHI) printf ("SSA DEADCE DEAD LOCAL\n");
 
                        info->def->opcode = CEE_NOP;
                        info->def->ssa_op = MONO_SSA_NOP;