diff options
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r-- | gcc/tree-ssa-loop-im.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 0d77aaa..63f4ef8 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -2130,7 +2130,7 @@ struct sm_aux static void execute_sm (class loop *loop, im_mem_ref *ref, - hash_map<im_mem_ref *, sm_aux *> &aux_map) + hash_map<im_mem_ref *, sm_aux *> &aux_map, bool maybe_mt) { gassign *load; struct fmt_data fmt_data; @@ -2154,8 +2154,9 @@ execute_sm (class loop *loop, im_mem_ref *ref, for_each_index (&ref->mem.ref, force_move_till, &fmt_data); bool always_stored = ref_always_accessed_p (loop, ref, true); - if (bb_in_transaction (loop_preheader_edge (loop)->src) - || (! flag_store_data_races && ! always_stored)) + if (maybe_mt + && (bb_in_transaction (loop_preheader_edge (loop)->src) + || (! flag_store_data_races && ! always_stored))) multi_threaded_model_p = true; if (multi_threaded_model_p) @@ -2244,7 +2245,7 @@ execute_sm_exit (class loop *loop, edge ex, vec<seq_entry> &seq, else { sm_aux *aux = *aux_map.get (ref); - if (!aux->store_flag) + if (!aux->store_flag || kind == sm_ord) { gassign *store; store = gimple_build_assign (unshare_expr (ref->mem.ref), @@ -2630,7 +2631,7 @@ hoist_memory_references (class loop *loop, bitmap mem_refs, EXECUTE_IF_SET_IN_BITMAP (mem_refs, 0, i, bi) { ref = memory_accesses.refs_list[i]; - execute_sm (loop, ref, aux_map); + execute_sm (loop, ref, aux_map, bitmap_bit_p (refs_not_supported, i)); } /* Materialize ordered store sequences on exits. */ |