diff options
author | Rodrigo Kumpera <kumpera@gmail.com> | 2017-02-25 02:52:03 +0300 |
---|---|---|
committer | Rodrigo Kumpera <kumpera@gmail.com> | 2017-02-27 23:45:19 +0300 |
commit | e461b821b1b5246ee0854a841bcd1a8f20a254ac (patch) | |
tree | 686e771d46544dd4fd55400b6ca0feae8a7c6492 | |
parent | a6c34bea959fee6a86093a51db6fcb05ce2456b8 (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.c | 13 |
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)); /* |