re PR middle-end/71581 (ICE on valid code on x86_64-linux-gnu with -Wuninitialized...
authorJakub Jelinek <jakub@redhat.com>
Mon, 20 Jun 2016 21:41:20 +0000 (23:41 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 20 Jun 2016 21:41:20 +0000 (23:41 +0200)
PR middle-end/71581
* tree-ssa-uninit.c (warn_uninit): If EXPR and VAR are NULL,
see if T isn't anonymous SSA_NAME with COMPLEX_EXPR created
for conversion of scalar user var to complex type and use the
underlying SSA_NAME_VAR in that case.  If EXPR is still NULL,
punt.

* gcc.dg/pr71581.c: New test.

From-SVN: r237621

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr71581.c [new file with mode: 0644]
gcc/tree-ssa-uninit.c

index d4b3aae5d6d686b0efd195c313a6f53608287a2c..1f47a9d9bef9e60819963aa6cc23420004656ce6 100644 (file)
@@ -1,5 +1,12 @@
 2016-06-20  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/71581
+       * tree-ssa-uninit.c (warn_uninit): If EXPR and VAR are NULL,
+       see if T isn't anonymous SSA_NAME with COMPLEX_EXPR created
+       for conversion of scalar user var to complex type and use the
+       underlying SSA_NAME_VAR in that case.  If EXPR is still NULL,
+       punt.
+
        PR rtl-optimization/71591
        * toplev.c (toplev::run_self_tests): If no_backend, complain and
        don't run any tests.
index 4b966e956bc9da38a0a0895fc1758879f1c5b57e..ce31fb71f5df66544438ebcbb33316b2579fc7c4 100644 (file)
@@ -1,5 +1,8 @@
 2016-06-20  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/71581
+       * gcc.dg/pr71581.c: New test.
+
        PR rtl-optimization/71591
        * gcc.dg/cpp/pr71591.c: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr71581.c b/gcc/testsuite/gcc.dg/pr71581.c
new file mode 100644 (file)
index 0000000..d82eb1e
--- /dev/null
@@ -0,0 +1,24 @@
+/* PR middle-end/71581 */
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized" } */
+
+_Complex float
+f1 (void)
+{
+  float x;
+  return x;    /* { dg-warning "is used uninitialized in this function" } */
+}
+
+_Complex double
+f2 (void)
+{
+  double x;
+  return x;    /* { dg-warning "is used uninitialized in this function" } */
+}
+
+_Complex int
+f3 (void)
+{
+  int x;
+  return x;    /* { dg-warning "is used uninitialized in this function" } */
+}
index 941d575f848d11e95bae9d96df5cdd8f5dbbfca2..d5f03442c3db076a2f417b15a19eb9980b4a1dde 100644 (file)
@@ -131,6 +131,29 @@ warn_uninit (enum opt_code wc, tree t, tree expr, tree var,
   if (!has_undefined_value_p (t))
     return;
 
+  /* Anonymous SSA_NAMEs shouldn't be uninitialized, but ssa_undefined_value_p
+     can return true if the def stmt of anonymous SSA_NAME is COMPLEX_EXPR
+     created for conversion from scalar to complex.  Use the underlying var of
+     the COMPLEX_EXPRs real part in that case.  See PR71581.  */
+  if (expr == NULL_TREE
+      && var == NULL_TREE
+      && SSA_NAME_VAR (t) == NULL_TREE
+      && is_gimple_assign (SSA_NAME_DEF_STMT (t))
+      && gimple_assign_rhs_code (SSA_NAME_DEF_STMT (t)) == COMPLEX_EXPR)
+    {
+      tree v = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (t));
+      if (TREE_CODE (v) == SSA_NAME
+         && has_undefined_value_p (v)
+         && zerop (gimple_assign_rhs2 (SSA_NAME_DEF_STMT (t))))
+       {
+         expr = SSA_NAME_VAR (v);
+         var = expr;
+       }
+    }
+
+  if (expr == NULL_TREE)
+    return;
+
   /* TREE_NO_WARNING either means we already warned, or the front end
      wishes to suppress the warning.  */
   if ((context