From 825293da703aa1f7ce870b40afce91c1e8b6c0fa Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Sun, 19 Sep 2021 17:18:48 -0600 Subject: [PATCH] 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. --- gcc/gimple-predicate-analysis.cc | 6 +++- gcc/testsuite/gcc.dg/uninit-pr102403-c2.c | 34 +++++++++++++++++++++ gcc/testsuite/gcc.dg/uninit-pr102403.c | 49 +++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/uninit-pr102403-c2.c create mode 100644 gcc/testsuite/gcc.dg/uninit-pr102403.c 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 *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" } */ -- 2.7.4