Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / alias-analysis.c
index f40070aeb38b9f2212c5f674aa1f346923938158..f3524006d98144893b625ca62ff632aca2bf2e8a 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * alias-analysis.c: Implement simple alias analysis for local variables.
+/**
+ * \file
+ * Implement simple alias analysis for local variables.
  *
  * Author:
  *   Rodrigo Kumpera (kumpera@gmail.com)
@@ -13,6 +14,7 @@
 #include "mini.h"
 #include "ir-emit.h"
 #include "glib.h"
+#include <mono/utils/mono-compiler.h>
 
 #ifndef DISABLE_JIT
 
@@ -63,7 +65,7 @@ lower_load (MonoCompile *cfg, MonoInst *load, MonoInst *ldaddr)
        load->opcode = mono_type_to_regmove (cfg, type);
        type_to_eval_stack_type (cfg, type, load);
        load->sreg1 = var->dreg;
-       mono_jit_stats.loads_eliminated++;
+       InterlockedIncrement (&mono_jit_stats.loads_eliminated);
        return TRUE;
 }
 
@@ -94,7 +96,7 @@ lower_store (MonoCompile *cfg, MonoInst *store, MonoInst *ldaddr)
        store->opcode = mono_type_to_regmove (cfg, type);
        type_to_eval_stack_type (cfg, type, store);
        store->dreg = var->dreg;
-       mono_jit_stats.stores_eliminated++;
+       InterlockedIncrement (&mono_jit_stats.stores_eliminated);
        return TRUE;
 }
 
@@ -140,7 +142,7 @@ lower_store_imm (MonoCompile *cfg, MonoInst *store, MonoInst *ldaddr)
        default:
                return FALSE;
        }
-       mono_jit_stats.stores_eliminated++;     
+       InterlockedIncrement (&mono_jit_stats.stores_eliminated);
        return TRUE;
 }
 
@@ -158,10 +160,17 @@ lower_memory_access (MonoCompile *cfg)
                for (ins = bb->code; ins; ins = ins->next) {
 handle_instruction:
                        switch (ins->opcode) {
-                       case OP_LDADDR:
-                               g_hash_table_insert (addr_loads, GINT_TO_POINTER (ins->dreg), ins);
-                               if (cfg->verbose_level > 2) { printf ("New address: "); mono_print_ins (ins); }
+                       case OP_LDADDR: {
+                               MonoInst *var = (MonoInst*)ins->inst_p0;
+                               if (var->flags & MONO_INST_VOLATILE) {
+                                       if (cfg->verbose_level > 2) { printf ("Found address to volatile var, can't take it: "); mono_print_ins (ins); }
+                               } else {
+                                       g_hash_table_insert (addr_loads, GINT_TO_POINTER (ins->dreg), ins);
+                                       if (cfg->verbose_level > 2) { printf ("New address: "); mono_print_ins (ins); }
+                               }
                                break;
+                       }
+
                        case OP_MOVE:
                                tmp = (MonoInst*)g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->sreg1));
                                /*
@@ -191,7 +200,9 @@ handle_instruction:
                        case OP_LOADU4_MEMBASE:
                        case OP_LOADI1_MEMBASE:
                        case OP_LOADI8_MEMBASE:
+#ifndef MONO_ARCH_SOFT_FLOAT_FALLBACK
                        case OP_LOADR4_MEMBASE:
+#endif
                        case OP_LOADR8_MEMBASE:
                                if (ins->inst_offset != 0)
                                        continue;
@@ -211,7 +222,9 @@ handle_instruction:
                        case OP_STOREI2_MEMBASE_REG:
                        case OP_STOREI4_MEMBASE_REG:
                        case OP_STOREI8_MEMBASE_REG:
+#ifndef MONO_ARCH_SOFT_FLOAT_FALLBACK
                        case OP_STORER4_MEMBASE_REG:
+#endif
                        case OP_STORER8_MEMBASE_REG:
                        case OP_STOREV_MEMBASE:
                                if (ins->inst_offset != 0)
@@ -226,7 +239,7 @@ handle_instruction:
                                        }
                                }
                                break;
-
+                       //FIXME missing storei1_membase_imm and storei2_membase_imm
                        case OP_STORE_MEMBASE_IMM:
                        case OP_STOREI4_MEMBASE_IMM:
                        case OP_STOREI8_MEMBASE_IMM:
@@ -296,8 +309,8 @@ recompute_aliased_variables (MonoCompile *cfg, int *restored_vars)
        }
        *restored_vars = adds;
 
-       mono_jit_stats.alias_found += kills;
-       mono_jit_stats.alias_removed += kills - adds;
+       InterlockedAdd (&mono_jit_stats.alias_found, kills);
+       InterlockedAdd (&mono_jit_stats.alias_removed, kills - adds);
        if (kills > adds) {
                if (cfg->verbose_level > 2) {
                        printf ("Method: %s\n", mono_method_full_name (cfg->method, 1));
@@ -358,4 +371,8 @@ done:
                mono_print_code (cfg, "AFTER ALIAS_ANALYSIS");
 }
 
+#else /* !DISABLE_JIT */
+
+MONO_EMPTY_SOURCE_FILE (alias_analysis);
+
 #endif /* !DISABLE_JIT */