From patchwork Wed Jun 30 09:15:35 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Fix PR39799: missing uninitialized vars warning Date: Tue, 29 Jun 2010 23:15:35 -0000 From: Bernd Schmidt X-Patchwork-Id: 57388 Message-Id: <4C2B0B37.70209@codesourcery.com> To: GCC Patches This is a problem that was introduced with the fix for PR31081. Looking at that PR's history, it seems the inliner has problems with overlapping lifetimes for things where SSA_NAME_OCCURS_IN_ABNORMAL_PHI. The solution was to zero-initialize all uninitialized variables when inlining. This disables warnings for them, which is the regression in PR39799. I've bootstrapped and regression tested the patch below on i686-linux. This limits the zero-initialization to variables with SSA_NAME_OCCURS_IN_ABNORMAL_PHI. I doubt register pressure is an issue since we have another rtl-based init-regs pass. Ok? Bernd PR tree-optimization/39799 * tree-inline.c (remap_ssa_name): Initialize variable only if SSA_NAME_OCCURS_IN_ABNORMAL_PHI. PR tree-optimization/39799 * gcc.dg/uninit-17.c: New test. Index: tree-inline.c =================================================================== --- tree-inline.c (revision 161371) +++ tree-inline.c (working copy) @@ -234,6 +234,7 @@ remap_ssa_name (tree name, copy_body_dat regions of the CFG, but this is expensive to test. */ if (id->entry_bb && is_gimple_reg (SSA_NAME_VAR (name)) + && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name) && TREE_CODE (SSA_NAME_VAR (name)) != PARM_DECL && (id->entry_bb != EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest || EDGE_COUNT (id->entry_bb->preds) != 1)) Index: testsuite/gcc.dg/uninit-17.c =================================================================== --- testsuite/gcc.dg/uninit-17.c (revision 0) +++ testsuite/gcc.dg/uninit-17.c (revision 0) @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wuninitialized" } */ + +inline int foo(int x) +{ + return x; +} +static void bar(int a, int *ptr) +{ + do + { + int b; + if (b < 40) { + ptr[0] = b; /* { dg-warning "may be used uninitialized" } */ + } + b += 1; + ptr++; + } + while (--a != 0); +} +void foobar(int a, int *ptr) +{ + bar(foo(a), ptr); +} + +/* { dg-message "note: '\[^\n'\]*' was declared here" "note: expected" { target *-*-* } 0 } */