tree-optimization/95172 - avoid mixing conditionalized and ordered SM
authorRichard Biener <rguenther@suse.de>
Mon, 18 May 2020 07:17:24 +0000 (09:17 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 18 May 2020 09:53:10 +0000 (11:53 +0200)
The following testcase shows a missed optimization that then leads to
wrong-code when issueing SMed stores on exits.  When we were able to
compute an ordered sequence of stores for an exit we need to emit
that in the correct order and we can emit it disregarding to any
conditional for whether a store actually happened (we know it did).
We can also improve detection as of whether we need conditional
processing at all.  Both parts fix the testcase.

2020-05-18  Richard Biener  <rguenther@suse.de>

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.

* gcc.dg/torture/pr95172.c: New testcase.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr95172.c [new file with mode: 0644]
gcc/tree-ssa-loop-im.c

index 3a090452a969d5bbb249a6546bdc4837f0120792..491293d77df1f14ecbbfac94936c06c01207f666 100644 (file)
@@ -1,3 +1,13 @@
+2020-05-18  Richard Biener  <rguenther@suse.de>
+
+       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  <law@redhat.com>
 
        * config/h8300/predicates.md (pc_or_label_operand): New predicate.
index 54fbdb08b66b37cf13ba57efb878fc7da64fd579..1123599b9a71f188594cfbd29cc1f7dac587c2ff 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-18  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/95172
+       * gcc.dg/torture/pr95172.c: New testcase.
+
 2020-05-17  H.J. Lu  <hongjiu.lu@intel.com>
 
        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 (file)
index 0000000..b39de69
--- /dev/null
@@ -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;
+}
index 0d77aaa08a55a7172557698848df495b0859246b..63f4ef8883c0b190a77f9e69c486cf380b5b4bef 100644 (file)
@@ -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.  */