Merge pull request #463 from strawd/concurrent-requests
[mono.git] / mono / mini / ssa.c
index 98805ba533e244567f271daaeb69871dbd3fce6f..95bea3006eef32939c9fbfd145f62f5b754c3816 100644 (file)
 #include <alloca.h>
 #endif
 
-#define USE_ORIGINAL_VARS
 #define CREATE_PRUNED_SSA
 
 //#define DEBUG_SSA 1
 
 #define NEW_PHI(cfg,dest,val) do {     \
-               (dest) = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst));       \
-               (dest)->opcode = OP_PHI;        \
-               (dest)->inst_c0 = (val);        \
-        (dest)->dreg = (dest)->sreg1 = (dest)->sreg2 = -1; \
+       MONO_INST_NEW ((cfg), (dest), OP_PHI); \
+       (dest)->inst_c0 = (val);                                                           \
        } while (0)
 
 typedef struct {
@@ -530,8 +527,7 @@ mono_ssa_remove (MonoCompile *cfg)
                                                }
                                        }
 
-                                       ins->opcode = OP_NOP;
-                                       ins->dreg = -1;
+                                       NULLIFY_INS (ins);
                                }
                        }
                }
@@ -1287,12 +1283,10 @@ mono_ssa_deadce (MonoCompile *cfg)
                                MonoInst *src_var = get_vreg_to_inst (cfg, def->sreg1);
                                if (src_var && !(src_var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)))
                                        add_to_dce_worklist (cfg, info, MONO_VARINFO (cfg, src_var->inst_c0), &work_list);
-                               def->opcode = OP_NOP;
-                               def->dreg = def->sreg1 = def->sreg2 = -1;
+                               NULLIFY_INS (def);
                                info->reg = -1;
                        } else if ((def->opcode == OP_ICONST) || (def->opcode == OP_I8CONST) || MONO_IS_ZERO (def)) {
-                               def->opcode = OP_NOP;
-                               def->dreg = def->sreg1 = def->sreg2 = -1;
+                               NULLIFY_INS (def);
                                info->reg = -1;
                        } else if (MONO_IS_PHI (def)) {
                                int j;
@@ -1300,8 +1294,7 @@ mono_ssa_deadce (MonoCompile *cfg)
                                        MonoMethodVar *u = MONO_VARINFO (cfg, get_vreg_to_inst (cfg, def->inst_phi_args [j])->inst_c0);
                                        add_to_dce_worklist (cfg, info, u, &work_list);
                                }
-                               def->opcode = OP_NOP;
-                               def->dreg = def->sreg1 = def->sreg2 = -1;
+                               NULLIFY_INS (def);
                                info->reg = -1;
                        }
                        else if (def->opcode == OP_NOP) {
@@ -1370,22 +1363,10 @@ mono_ssa_loop_invariant_code_motion (MonoCompile *cfg)
                if (bb != h)
                        continue;
                MONO_BB_FOR_EACH_INS_SAFE (bb, n, ins) {
-                       gboolean is_class_init = FALSE;
-
                        /*
                         * Try to move instructions out of loop headers into the preceeding bblock.
                         */
-                       if (ins->opcode == OP_VOIDCALL) {
-                               MonoCallInst *call = (MonoCallInst*)ins;
-
-                               if (call->fptr_is_patch) {
-                                       MonoJumpInfo *ji = (MonoJumpInfo*)call->fptr;
-
-                                       if (ji->type == MONO_PATCH_INFO_CLASS_INIT)
-                                               is_class_init = TRUE;
-                               }
-                       }
-                       if (ins->opcode == OP_LDLEN || ins->opcode == OP_STRLEN || ins->opcode == OP_CHECK_THIS || ins->opcode == OP_AOTCONST || is_class_init) {
+                       if (ins->opcode == OP_LDLEN || ins->opcode == OP_STRLEN || ins->opcode == OP_CHECK_THIS || ins->opcode == OP_AOTCONST || ins->opcode == OP_GENERIC_CLASS_INIT) {
                                gboolean skip;
                                int sreg;
 
@@ -1424,9 +1405,9 @@ mono_ssa_loop_invariant_code_motion (MonoCompile *cfg)
                                else
                                        sreg = -1;
                                if (sreg != -1) {
-                                       skip = FALSE;
-                                       MonoInst *tins;
+                                       MonoInst *tins, *var;
 
+                                       skip = FALSE;
                                        for (tins = ins->prev; tins; tins = tins->prev) {
                                                const char *spec = INS_INFO (tins->opcode);
 
@@ -1439,6 +1420,9 @@ mono_ssa_loop_invariant_code_motion (MonoCompile *cfg)
                                        }
                                        if (skip)
                                                continue;
+                                       var = get_vreg_to_inst (cfg, sreg);
+                                       if (var && (var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)))
+                                               continue;
                                        ins->sreg1 = sreg;
                                }