public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] tree-optimization/94963 - avoid bogus uninit warning with store-motion
@ 2020-05-06 10:35 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2020-05-06 10:35 UTC (permalink / raw)
  To: gcc-patches


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.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

Richard.

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/testsuite/gcc.dg/pr94963.c | 35 +++++++++++++++++++++++++++++++++++
 gcc/tree-ssa-loop-im.c         | 18 +++++++++++-------
 2 files changed, 46 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr94963.c

diff --git a/gcc/testsuite/gcc.dg/pr94963.c b/gcc/testsuite/gcc.dg/pr94963.c
new file mode 100644
index 00000000000..aca9e161301
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr94963.c
@@ -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);
+}
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 554dd4be5bb..3056b4bfed2 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -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)
     {
-- 
2.12.3

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-05-06 10:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-06 10:35 [PATCH] tree-optimization/94963 - avoid bogus uninit warning with store-motion Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).