tree-optimization/94963 - avoid bogus uninit warning with store-motion
authorRichard Biener <rguenther@suse.de>
Wed, 6 May 2020 07:39:45 +0000 (09:39 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 6 May 2020 10:39:24 +0000 (12:39 +0200)
Eliding the load for store-motion causes an uninitialized variable
flowing into the loop, conditionally initialized and used.  The
uninit warning cannot relate the flag used to guard the initialization
and use with the actual initialization so the following robustifies
the previous approach of marking the conditional store as not to
be warned on by instead initializing the variable on loop entry
from an uninitialized variable we mark as not to be warned for.

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

PR tree-optimization/94963
* tree-ssa-loop-im.c (execute_sm_if_changed): Remove
no-warning marking of the conditional store.
(execute_sm): Instead mark the uninitialized state
on loop entry to be not warned about.

* gcc.dg/pr94963.c: New testcase.

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

index c40d88792747606b8308cb1ad11dc23ddb2d3e1e..73a601528f0e76a6081362373ac5a05908dadeeb 100644 (file)
@@ -1,3 +1,11 @@
+2020-05-06  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/94963
+       * tree-ssa-loop-im.c (execute_sm_if_changed): Remove
+       no-warning marking of the conditional store.
+       (execute_sm): Instead mark the uninitialized state
+       on loop entry to be not warned about.
+
 2020-05-06  Hongtao Liu  <hongtao.liu@intel.com>
 
        * common/config/i386/i386-common.c (OPTION_MASK_ISA2_TSXLDTRK_SET,
index b917e810588953594794f82c202db65ac10a35dd..a3cf68d0a10a6a3d9e5af9a9cee8e75f5976aab9 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-06  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/94963
+       * gcc.dg/pr94963.c: New testcase.
+
 2020-05-06  Hongtao Liu  <hongtao.liu@intel.com>
 
        * g++.dg/other/i386-2.c: Add -mtsxldtrk.
diff --git a/gcc/testsuite/gcc.dg/pr94963.c b/gcc/testsuite/gcc.dg/pr94963.c
new file mode 100644 (file)
index 0000000..aca9e16
--- /dev/null
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wall" } */
+
+typedef struct
+{
+  int p1;
+  int p2;
+  int p3;
+} P;
+struct S
+{
+  int field;
+};
+extern int v2;
+extern void foo (struct S *map);
+static struct S var;
+const P *pv;
+int ps;
+void
+f (void)
+{
+  if (pv != 0)
+    for (const P *ph = pv; ph < &pv[ps]; ++ph)
+      switch (ph->p1)
+       {
+       case 1:
+       v2 = ph->p2;
+       break;
+       case 2:
+       var.field = ph->p3;
+       break;
+       }
+  if (var.field != 0) /* { dg-bogus "uninitialized" } */
+    foo (&var);
+}
index 554dd4be5bbcfb1496c8111e5cce1d61e23d98ab..3056b4bfed2bc201339df87489fe6f8b248e000f 100644 (file)
@@ -1994,8 +1994,6 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag,
   gsi = gsi_start_bb (then_bb);
   /* Insert actual store.  */
   stmt = gimple_build_assign (unshare_expr (mem), tmp_var);
-  /* Make sure to not warn about maybe-uninit uses of tmp_var here.  */
-  gimple_set_no_warning (stmt, true);
   gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
 
   edge e1 = single_succ_edge (new_bb);
@@ -2149,13 +2147,19 @@ execute_sm (class loop *loop, vec<edge> exits, im_mem_ref *ref)
      store then.  */
   if ((!always_stored && !multi_threaded_model_p)
       || (ref->loaded && bitmap_bit_p (ref->loaded, loop->num)))
+    load = gimple_build_assign (tmp_var, unshare_expr (ref->mem.ref));
+  else
     {
-      load = gimple_build_assign (tmp_var, unshare_expr (ref->mem.ref));
-      lim_data = init_lim_data (load);
-      lim_data->max_loop = loop;
-      lim_data->tgt_loop = loop;
-      gsi_insert_before (&gsi, load, GSI_SAME_STMT);
+      /* If not emitting a load mark the uninitialized state on the
+        loop entry as not to be warned for.  */
+      tree uninit = create_tmp_reg (TREE_TYPE (tmp_var));
+      TREE_NO_WARNING (uninit) = 1;
+      load = gimple_build_assign (tmp_var, uninit);
     }
+  lim_data = init_lim_data (load);
+  lim_data->max_loop = loop;
+  lim_data->tgt_loop = loop;
+  gsi_insert_before (&gsi, load, GSI_SAME_STMT);
 
   if (multi_threaded_model_p)
     {