diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3a090452a96..491293d77df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2020-05-18 Richard Biener + + PR tree-optimization/95172 + * tree-ssa-loop-im.c (execute_sm): Get flag whether we + eventually need the conditional processing. + (execute_sm_exit): When processing an orderd sequence + avoid doing any conditional processing. + (hoist_memory_references): Pass down whether all edges + have ordered processing for a ref to execute_sm. + 2020-05-17 Jeff Law * config/h8300/predicates.md (pc_or_label_operand): New predicate. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 54fbdb08b66..1123599b9a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-18 Richard Biener + + PR tree-optimization/95172 + * gcc.dg/torture/pr95172.c: New testcase. + 2020-05-17 H.J. Lu PR target/95021 diff --git a/gcc/testsuite/gcc.dg/torture/pr95172.c b/gcc/testsuite/gcc.dg/torture/pr95172.c new file mode 100644 index 00000000000..b39de69f08e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr95172.c @@ -0,0 +1,17 @@ +/* { dg-do run } */ + +int a, d; +int *b = &a; +short c; +int main() +{ + for (; c <= 4; c--) { + for (; d;) + ; + a = 1; + *b = 0; + } + if (a != 0) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 0d77aaa08a5..63f4ef8883c 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 &aux_map) + hash_map &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, 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. */