Correct a function pre/postcondition [PR102403].
authorMartin Sebor <msebor@redhat.com>
Sun, 19 Sep 2021 23:18:48 +0000 (17:18 -0600)
committerMartin Sebor <msebor@redhat.com>
Sun, 19 Sep 2021 23:23:19 +0000 (17:23 -0600)
Resolves:
PR middle-end/102403 - ICE in init_from_control_deps, at gimple-predicate-analysis.cc:2364

gcc/ChangeLog:
PR middle-end/102403
* gimple-predicate-analysis.cc (predicate::init_from_control_deps):
Correct a function pre/postcondition.

gcc/testsuite/ChangeLog:
PR middle-end/102403
* gcc.dg/uninit-pr102403.c: New test.
* gcc.dg/uninit-pr102403-c2.c: New test.

gcc/gimple-predicate-analysis.cc
gcc/testsuite/gcc.dg/uninit-pr102403-c2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/uninit-pr102403.c [new file with mode: 0644]

index 3404f2d..f0c8444 100644 (file)
@@ -2361,7 +2361,11 @@ predicate::init_from_control_deps (const vec<edge> *dep_chains,
       dump (NULL, "");
     }
 
-  gcc_assert (has_valid_pred == (m_preds.length () > 0));
+  if (has_valid_pred)
+    gcc_assert (m_preds.length () != 0);
+  else
+    /* Clear M_PREDS to indicate failure.  */
+    m_preds.release ();
 }
 
 /* Return the predicate expression guarding the definition of
diff --git a/gcc/testsuite/gcc.dg/uninit-pr102403-c2.c b/gcc/testsuite/gcc.dg/uninit-pr102403-c2.c
new file mode 100644 (file)
index 0000000..8181143
--- /dev/null
@@ -0,0 +1,34 @@
+/* PR middle-end/102403 - ICE in init_from_control_deps, at
+   gimple-predicate-analysis.cc:2364
+   { dg-do compile }
+   { dg-options "-O2 -Wall" } */
+
+extern int a[], b, c, d, e, f, g, h;
+
+inline void foo (void) { b = 1 ^ a[b ^ (c & 1)]; }
+
+void bar (void);
+
+int main (void)
+{
+  if (!f && ~h)
+    {
+      if (g)
+       goto L2;
+    }
+  else
+    {
+      int m = 0;              // { dg-message "declared here" }
+    L1:
+      e = m;
+    L2:
+      m ^= 1;                 // { dg-warning "-Wmaybe-uninitialized" }
+      if (d)
+       bar ();
+
+      for (int j = 0; j < 10; j++)
+       foo ();
+
+      goto L1;
+    }
+}
diff --git a/gcc/testsuite/gcc.dg/uninit-pr102403.c b/gcc/testsuite/gcc.dg/uninit-pr102403.c
new file mode 100644 (file)
index 0000000..1e62e98
--- /dev/null
@@ -0,0 +1,49 @@
+/* PR middle-end/102403 - ICE in init_from_control_deps, at
+   gimple-predicate-analysis.cc:2364
+   { dg-do compile }
+   { dg-options "-O2 -Wall" } */
+
+int __fmaf (void)
+{
+  int a = 0;
+  int b, c, d, e, f;
+
+  int r = 0;
+
+  switch (b)        // { dg-warning "-Wuninitialized" }
+    {
+    default:
+      c |= 1;
+
+    case 0:
+      if (c == 0)
+       a = 1;
+
+      switch (d) {
+      case 15:
+       f = c;
+       break;
+
+      case 11:
+      case 6:
+      case 4:
+       f = c;
+      case 10:
+       e = a;
+      }
+
+      if (e == 0)   // { dg-warning "-Wmaybe-uninitialized" }
+       f = 0;
+
+      r = f;
+  }
+
+  // The return statement below gets the unhelpful warning:
+  // 'f' may be used uninitialized in this function [-Wmaybe-uninitialized]
+  return r;
+}
+
+/* Prune out warnings issued on the wrong lines, such as:
+   uninit-pr102403.c:9:13: warning: ā€˜dā€™ is used uninitialized [-Wuninitialized]
+   { dg-prune-output "-Wuninitialized" }
+   { dg-prune-output "-Wmaybe-uninitialized" } */