Re: [PATCH] Fix PR 63748

2014-11-10 Thread Richard Biener
On Mon, Nov 10, 2014 at 2:33 AM, Patrick Palka patr...@parcs.ath.cx
wrote:
 PR 63748 reports a false-positive uninitialized warning under the
 presence of abnormal edges.  The statements for which the uninitialized
 warnings are emitted all look like:

   buf_117(ab) = buf_317(D)(ab);

 This PR is similar to PR 57287 which also reports false-positive
 uninitialized warnings under the presence of abnormal edges.  That PR
 fixed the reported issue by allowing to propagate default definitions
 which appear in abnormal PHI nodes.  That is, it allowed propagating the
 following kinds of copies:

   buf_24 = buf_16(D)(ab);

 But it still did not allow propagating copies whose destination operand
 occurs in an abnormal PHI node.  To fix PR 63748, this patch extends the
 fix to PR 57287 to allow propagating such copies too.

Thus you allow

   buf_24(ab) = buf_16(D)(ab);

to be propagated.

This is only valid if you propagate into all uses of buf_24(ab) as otherwise
you create overlapping life-ranges with the default definition.  Which
may be a moot issue now as Marcs patch to ignore undefined SSA names
in the out-of-SSA live compute, thus ...

 Full bootstrap + regtesting on x86_64-unknown-linux-gnu is in progress.
 Is this patch OK if testing succeeds with no new regressions?

... ok.  But please watch for fallout.

Thanks,
Richard.

 2014-11-10  Patrick Palka  ppa...@gcc.gnu.org

 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 edges.

 gcc/testsuite/
 PR middle-end/63748
 * gcc.dg/pr63748.c: New testcase.
 ---
  gcc/testsuite/gcc.dg/pr63748.c | 36 
  gcc/tree-ssa-propagate.c   | 27 +++
  2 files changed, 51 insertions(+), 12 deletions(-)
  create mode 100644 gcc/testsuite/gcc.dg/pr63748.c

 diff --git a/gcc/testsuite/gcc.dg/pr63748.c b/gcc/testsuite/gcc.dg/pr63748.c
 new file mode 100644
 index 000..2e50445
 --- /dev/null
 +++ b/gcc/testsuite/gcc.dg/pr63748.c
 @@ -0,0 +1,36 @@
 +/* { dg-do compile } */
 +/* { dg-options -O2 -Wall } */
 +
 +#include setjmp.h
 +
 +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 9f4d381..9e61baf 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 regular 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.  */
 --
 2.2.0.rc0.18.ga1ad247



Re: [PATCH] Fix PR 63748

2014-11-10 Thread Eric Botcazou
  Full bootstrap + regtesting on x86_64-unknown-linux-gnu is in progress.
  Is this patch OK if testing succeeds with no new regressions?
 
 ... ok.  But please watch for fallout.

I'd do a bootstrap with Ada enabled, the Ada compiler is the only serious user 
of abnormal edges in GIMPLE on Linux platforms.

-- 
Eric Botcazou


Re: [PATCH] Fix PR 63748

2014-11-10 Thread Patrick Palka
On Mon, Nov 10, 2014 at 7:22 AM, Eric Botcazou ebotca...@adacore.com wrote:
  Full bootstrap + regtesting on x86_64-unknown-linux-gnu is in progress.
  Is this patch OK if testing succeeds with no new regressions?

 ... ok.  But please watch for fallout.

 I'd do a bootstrap with Ada enabled, the Ada compiler is the only serious user
 of abnormal edges in GIMPLE on Linux platforms.

 --
 Eric Botcazou

Bootstrap (with --enable-languages=all,ada) + regtesting has finished
with no new regressions.  I will commit this later today when I have
more free time ahead of me.  Thanks for reviewing.


[PATCH] Fix PR 63748

2014-11-09 Thread Patrick Palka
PR 63748 reports a false-positive uninitialized warning under the
presence of abnormal edges.  The statements for which the uninitialized
warnings are emitted all look like:

  buf_117(ab) = buf_317(D)(ab);

This PR is similar to PR 57287 which also reports false-positive
uninitialized warnings under the presence of abnormal edges.  That PR
fixed the reported issue by allowing to propagate default definitions
which appear in abnormal PHI nodes.  That is, it allowed propagating the
following kinds of copies:

  buf_24 = buf_16(D)(ab);

But it still did not allow propagating copies whose destination operand
occurs in an abnormal PHI node.  To fix PR 63748, this patch extends the
fix to PR 57287 to allow propagating such copies too.

Full bootstrap + regtesting on x86_64-unknown-linux-gnu is in progress.
Is this patch OK if testing succeeds with no new regressions?

2014-11-10  Patrick Palka  ppa...@gcc.gnu.org

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 edges.

gcc/testsuite/
PR middle-end/63748
* gcc.dg/pr63748.c: New testcase.
---
 gcc/testsuite/gcc.dg/pr63748.c | 36 
 gcc/tree-ssa-propagate.c   | 27 +++
 2 files changed, 51 insertions(+), 12 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr63748.c

diff --git a/gcc/testsuite/gcc.dg/pr63748.c b/gcc/testsuite/gcc.dg/pr63748.c
new file mode 100644
index 000..2e50445
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr63748.c
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options -O2 -Wall } */
+
+#include setjmp.h
+
+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 9f4d381..9e61baf 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 regular 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.  */
-- 
2.2.0.rc0.18.ga1ad247