This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/36296] bogus uninitialized warning (loop representation)
- From: "manu at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 18 Aug 2008 23:38:16 -0000
- Subject: [Bug middle-end/36296] bogus uninitialized warning (loop representation)
- References: <bug-36296-16207@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #10 from manu at gcc dot gnu dot org 2008-08-18 23:38 -------
(In reply to comment #9)
> (In reply to comment #8)
> > Please provide a preprocessed reduced testcase as similar to the original as
> > possible.
>
> Here's a similar testcase.
Thanks.
This is the optimized SSA dump:
f ()
{
voidD.39 * pD.1952;
intD.0 initD.1951;
# BLOCK 2 freq:1
# PRED: ENTRY [100.0%] (fallthru,exec)
# SUCC: 3 [100.0%] (fallthru,exec)
# BLOCK 3 freq:10000
# PRED: 2 [100.0%] (fallthru,exec) 5 [100.0%] (fallthru,dfs_back,exec)
# initD.1951_1 = PHI <0(2), initD.1951_2(5)>
# pD.1952_3 = PHI <pD.1952_6(D)(2), pD.1952_4(5)>
[/home/manuel/src/pr36296.c : 11] if (initD.1951_1 == 0)
goto <bb 4>;
else
goto <bb 5>;
# SUCC: 4 [29.0%] (true,exec) 5 [71.0%] (false,exec)
# BLOCK 4 freq:2900
# PRED: 3 [29.0%] (true,exec)
[/home/manuel/src/pr36296.c : 13] # SMT.10D.1967_13 = VDEF <SMT.10D.1967_10>
{ SMT.10D.1967 }
pD.1952_7 = fooD.1945 ();
# SUCC: 5 [100.0%] (fallthru,exec)
# BLOCK 5 freq:10000
# PRED: 3 [71.0%] (false,exec) 4 [100.0%] (fallthru,exec)
# initD.1951_2 = PHI <initD.1951_1(3), 2(4)>
# pD.1952_4 = PHI <pD.1952_3(3), pD.1952_7(4)>
[/home/manuel/src/pr36296.c : 16] # SMT.10D.1967_14 = VDEF <SMT.10D.1967_11>
{ SMT.10D.1967 }
barD.1947 (pD.1952_4);
[/home/manuel/src/pr36296.c : 17] goto <bb 3>;
# SUCC: 3 [100.0%] (fallthru,dfs_back,exec)
}
Because we create a PHI node for p in BB 3, we think that p can be used
uninitialized. Notice also that we are not able to move the 'if' and the call
to foo() out of the infinite loop. This is perhaps a missed optimization.
> This is quite strange: if I replace the value 2 by 1 or if I replace foo() by
> 0, the warning is no longer displayed.
If you replace foo() by 0, then CCP just assumes the p is always 0. In fact, it
will remove p altogether, even if you use 'if (init == 2)', thus missing a real
uninitialized use. This behaviour is known to hide warnings, both correct and
wrong warnings.
If I replace the value 2 by 1 I still get the warning in GCC 4.4, so that
really sounds strange. Are you sure about that?
Anyway, this is a confirmed bug but not easy to fix.
--
manu at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|WAITING |NEW
Ever Confirmed|0 |1
Last reconfirmed|0000-00-00 00:00:00 |2008-08-18 23:38:16
date| |
Summary|wrong warning about |bogus uninitialized warning
|potential uninitialized |(loop representation)
|variable |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36296