-/*
- * alias-analysis.c: Implement simple alias analysis for local variables.
+/**
+ * \file
+ * Implement simple alias analysis for local variables.
*
* Author:
* Rodrigo Kumpera (kumpera@gmail.com)
#include "mini.h"
#include "ir-emit.h"
#include "glib.h"
+#include <mono/utils/mono-compiler.h>
#ifndef DISABLE_JIT
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;
}
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;
}
default:
return FALSE;
}
- mono_jit_stats.stores_eliminated++;
+ InterlockedIncrement (&mono_jit_stats.stores_eliminated);
return TRUE;
}
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));
/*
}
*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));
mono_print_code (cfg, "AFTER ALIAS_ANALYSIS");
}
+#else /* !DISABLE_JIT */
+
+MONO_EMPTY_SOURCE_FILE (alias_analysis);
+
#endif /* !DISABLE_JIT */