Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRodrigo Kumpera <kumpera@gmail.com>2017-02-25 02:52:03 +0300
committerRodrigo Kumpera <kumpera@gmail.com>2017-02-27 23:45:19 +0300
commite461b821b1b5246ee0854a841bcd1a8f20a254ac (patch)
tree686e771d46544dd4fd55400b6ca0feae8a7c6492
parenta6c34bea959fee6a86093a51db6fcb05ce2456b8 (diff)
[alias-analysis] Ignore addresses taken of volatile variables.
Volatile variables should be ignored by AA as, by design, we can't properly tell whether removing indirection is safe or not. This shows up when handling the LMF var in some cases.
-rw-r--r--mono/mini/alias-analysis.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/mono/mini/alias-analysis.c b/mono/mini/alias-analysis.c
index c419dfa2b42..7ff437f9f9d 100644
--- a/mono/mini/alias-analysis.c
+++ b/mono/mini/alias-analysis.c
@@ -159,10 +159,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));
/*