From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25164 invoked by alias); 18 Aug 2008 23:39:41 -0000 Received: (qmail 24851 invoked by uid 48); 18 Aug 2008 23:38:16 -0000 Date: Mon, 18 Aug 2008 23:39:00 -0000 Message-ID: <20080818233816.24850.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug middle-end/36296] bogus uninitialized warning (loop representation) In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "manu at gcc dot gnu dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2008-08/txt/msg01344.txt.bz2 ------- 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 [/home/manuel/src/pr36296.c : 11] if (initD.1951_1 == 0) goto ; else goto ; # 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 } 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 # pD.1952_4 = PHI [/home/manuel/src/pr36296.c : 16] # SMT.10D.1967_14 = VDEF { SMT.10D.1967 } barD.1947 (pD.1952_4); [/home/manuel/src/pr36296.c : 17] goto ; # 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