From: Patrick Palka Date: Mon, 10 Nov 2014 20:43:40 +0000 (+0000) Subject: re PR tree-optimization/63748 (wrong may be used uninitialized warning (abnormal... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c7488fba456957f70edd5a6bb0464fe336f694c5;p=gcc.git re PR tree-optimization/63748 (wrong may be used uninitialized warning (abnormal edges)) 2014-11-10 Patrick Palka gcc/ PR middle-end/63748 * tree-ssa-propagate.c (may_propagate_copy): Allow propagating SSA copies whose source and destination names both occur in abnormal PHIs. gcc/testsuite/ PR middle-end/63748 * gcc.dg/pr63748.c: New testcase. From-SVN: r217317 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ad43420446..8a329222dc5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-11-10 Patrick Palka + + PR middle-end/63748 + * tree-ssa-propagate.c (may_propagate_copy): Allow propagating + SSA copies whose source and destination names both occur in + abnormal PHIs. + 2014-11-10 Roman Gareev * Makefile.in: Remove the compilation of graphite-clast-to-gimple.o. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9cb2d0a1b9..812696db961 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-11-10 Patrick Palka + + PR middle-end/63748 + * gcc.dg/pr63748.c: New testcase. + 2014-11-10 H.J. Lu * gcc.dg/pr44194-1.c (dg-do): Add missing braces. diff --git a/gcc/testsuite/gcc.dg/pr63748.c b/gcc/testsuite/gcc.dg/pr63748.c new file mode 100644 index 00000000000..2e5044584a6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr63748.c @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall" } */ + +#include + +jmp_buf *alloc_jmp_buf (); +int foo (void *); + +int +test (int op, int noside) +{ + void *argvec = 0; + + if (op) + { + jmp_buf *buf = alloc_jmp_buf (); /* { dg-bogus "uninitialized" } */ + setjmp (*buf); + + if (noside) + goto nosideret; + + do_call_it: + + if (noside) + goto nosideret; + + return foo (argvec); + } + + argvec = __builtin_alloca (1); + goto do_call_it; + +nosideret: + return 1; +} + diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 9f4d3811f28..0195afa7f01 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -1275,21 +1275,24 @@ may_propagate_copy (tree dest, tree orig) tree type_d = TREE_TYPE (dest); tree type_o = TREE_TYPE (orig); - /* If ORIG flows in from an abnormal edge, it cannot be propagated. */ + /* If ORIG is a default definition which flows in from an abnormal edge + then the copy can be propagated. It is important that we do so to avoid + uninitialized copies. */ if (TREE_CODE (orig) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig) - /* If it is the default definition and an automatic variable then - we can though and it is important that we do to avoid - uninitialized regular copies. */ - && !(SSA_NAME_IS_DEFAULT_DEF (orig) - && (SSA_NAME_VAR (orig) == NULL_TREE - || TREE_CODE (SSA_NAME_VAR (orig)) == VAR_DECL))) + && SSA_NAME_IS_DEFAULT_DEF (orig) + && (SSA_NAME_VAR (orig) == NULL_TREE + || TREE_CODE (SSA_NAME_VAR (orig)) == VAR_DECL)) + ; + /* Otherwise if ORIG just flows in from an abnormal edge then the copy cannot + be propagated. */ + else if (TREE_CODE (orig) == SSA_NAME + && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig)) return false; - - /* If DEST is an SSA_NAME that flows from an abnormal edge, then it - cannot be replaced. */ - if (TREE_CODE (dest) == SSA_NAME - && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest)) + /* Similarly if DEST flows in from an abnormal edge then the copy cannot be + propagated. */ + else if (TREE_CODE (dest) == SSA_NAME + && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest)) return false; /* Do not copy between types for which we *do* need a conversion. */