X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Falias-analysis.c;h=f3524006d98144893b625ca62ff632aca2bf2e8a;hb=HEAD;hp=82e3672ae1dee2f7b56abf3141204e2d2dbe844c;hpb=eb42f74662d4e65e6f91522f1298506f5eedf9dc;p=mono.git diff --git a/mono/mini/alias-analysis.c b/mono/mini/alias-analysis.c index 82e3672ae1d..f3524006d98 100644 --- a/mono/mini/alias-analysis.c +++ b/mono/mini/alias-analysis.c @@ -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 #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)); /* @@ -300,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)); @@ -362,4 +371,8 @@ done: mono_print_code (cfg, "AFTER ALIAS_ANALYSIS"); } +#else /* !DISABLE_JIT */ + +MONO_EMPTY_SOURCE_FILE (alias_analysis); + #endif /* !DISABLE_JIT */