X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Falias-analysis.c;h=f3524006d98144893b625ca62ff632aca2bf2e8a;hb=HEAD;hp=ebab8ae4b25519a818acf6fc04a10b53de9004c8;hpb=749dbde308c61a1df0dfe6fad00f699957083fa6;p=mono.git diff --git a/mono/mini/alias-analysis.c b/mono/mini/alias-analysis.c index ebab8ae4b25..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)); /* @@ -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) @@ -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 */