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:
parent
c3895ef466
commit
825293da70
3 changed files with 88 additions and 1 deletions
|
@ -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
|
||||
|
|
34
gcc/testsuite/gcc.dg/uninit-pr102403-c2.c
Normal file
34
gcc/testsuite/gcc.dg/uninit-pr102403-c2.c
Normal 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;
|
||||
}
|
||||
}
|
49
gcc/testsuite/gcc.dg/uninit-pr102403.c
Normal file
49
gcc/testsuite/gcc.dg/uninit-pr102403.c
Normal 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" } */
|
Loading…
Add table
Reference in a new issue