X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Falias-analysis.c;h=f3524006d98144893b625ca62ff632aca2bf2e8a;hb=HEAD;hp=c260dae2c7abcf706b005ef0fc5f7e10ea103c50;hpb=811674bc6331c98d33134e2a37a7c7dd66402227;p=mono.git diff --git a/mono/mini/alias-analysis.c b/mono/mini/alias-analysis.c index c260dae2c7a..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 @@ -40,7 +42,7 @@ is_long_stack_size (int type) static gboolean lower_load (MonoCompile *cfg, MonoInst *load, MonoInst *ldaddr) { - MonoInst *var = ldaddr->inst_p0; + MonoInst *var = (MonoInst *)ldaddr->inst_p0; MonoType *type = &var->klass->byval_arg; int replaced_op = mono_type_to_load_membase (cfg, type); @@ -63,14 +65,14 @@ 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; } static gboolean lower_store (MonoCompile *cfg, MonoInst *store, MonoInst *ldaddr) { - MonoInst *var = ldaddr->inst_p0; + MonoInst *var = (MonoInst *)ldaddr->inst_p0; MonoType *type = &var->klass->byval_arg; int replaced_op = mono_type_to_store_membase (cfg, type); @@ -94,14 +96,14 @@ 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; } static gboolean lower_store_imm (MonoCompile *cfg, MonoInst *store, MonoInst *ldaddr) { - MonoInst *var = ldaddr->inst_p0; + MonoInst *var = (MonoInst *)ldaddr->inst_p0; MonoType *type = &var->klass->byval_arg; int store_op = mono_type_to_store_membase (cfg, type); if (store_op == OP_STOREV_MEMBASE || store_op == OP_STOREX_MEMBASE) @@ -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,11 +200,13 @@ 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; - tmp = g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->sreg1)); + tmp = (MonoInst *)g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->sreg1)); if (tmp) { if (cfg->verbose_level > 2) { printf ("Found candidate load:"); mono_print_ins (ins); } if (lower_load (cfg, ins, tmp)) { @@ -211,12 +222,14 @@ 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) continue; - tmp = g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->dreg)); + tmp = (MonoInst *)g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->dreg)); if (tmp) { if (cfg->verbose_level > 2) { printf ("Found candidate store:"); mono_print_ins (ins); } if (lower_store (cfg, ins, tmp)) { @@ -226,13 +239,13 @@ 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: if (ins->inst_offset != 0) continue; - tmp = g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->dreg)); + tmp = (MonoInst *)g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->dreg)); if (tmp) { if (cfg->verbose_level > 2) { printf ("Found candidate store-imm:"); mono_print_ins (ins); } needs_dce |= lower_store_imm (cfg, ins, tmp); @@ -240,7 +253,7 @@ handle_instruction: break; case OP_CHECK_THIS: case OP_NOT_NULL: - tmp = g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->sreg1)); + tmp = (MonoInst *)g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->sreg1)); if (tmp) { if (cfg->verbose_level > 2) { printf ("Found null check over local: "); mono_print_ins (ins); } NULLIFY_INS (ins); @@ -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 */