aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2021-09-19 17:18:48 -0600
committerMartin Sebor <msebor@redhat.com>2021-09-19 17:23:19 -0600
commit825293da703aa1f7ce870b40afce91c1e8b6c0fa (patch)
tree419171fefd734ad0827c7dc6c45fe2e4fa111e57 /gcc
parentc3895ef466f3068cac6f5c18b55716f494484917 (diff)
downloadgcc-825293da703aa1f7ce870b40afce91c1e8b6c0fa.zip
gcc-825293da703aa1f7ce870b40afce91c1e8b6c0fa.tar.gz
gcc-825293da703aa1f7ce870b40afce91c1e8b6c0fa.tar.bz2
Correct a function pre/postcondition [PR102403].
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-predicate-analysis.cc6
-rw-r--r--gcc/testsuite/gcc.dg/uninit-pr102403-c2.c34
-rw-r--r--gcc/testsuite/gcc.dg/uninit-pr102403.c49
3 files changed, 88 insertions, 1 deletions
diff --git a/gcc/gimple-predicate-analysis.cc b/gcc/gimple-predicate-analysis.cc
index 3404f2d..f0c8444 100644
--- a/gcc/gimple-predicate-analysis.cc
+++ b/gcc/gimple-predicate-analysis.cc
@@ -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
index 0000000..8181143
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/uninit-pr102403-c2.c
@@ -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
index 0000000..1e62e98
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/uninit-pr102403.c
@@ -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" } */