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.
This commit is contained in:
Martin Sebor 2021-09-19 17:18:48 -06:00
parent c3895ef466
commit 825293da70
3 changed files with 88 additions and 1 deletions

View 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

View file

@ -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;
}
}

View file

@ -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" } */