This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR70740
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 21 Apr 2016 12:54:52 +0200 (CEST)
- Subject: [PATCH] Fix PR70740
- Authentication-results: sourceware.org; auth=none
I am testing the following patch to fix PR70740.
Bootstrap/regtest running on x86_64-unknown-linux-gnu.
Richard.
2016-04-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/70740
* tree-ssa-phiprop.c (propagate_with_phi): Handle inserted
VDEF.
* gcc.dg/torture/pr70740.c: New testcase.
Index: gcc/tree-ssa-phiprop.c
===================================================================
*** gcc/tree-ssa-phiprop.c (revision 235305)
--- gcc/tree-ssa-phiprop.c (working copy)
*************** propagate_with_phi (basic_block bb, gphi
*** 327,339 ****
continue;
/* Check if we can move the loads. The def stmt of the virtual use
! needs to be in a different basic block dominating bb. */
vuse = gimple_vuse (use_stmt);
def_stmt = SSA_NAME_DEF_STMT (vuse);
if (!SSA_NAME_IS_DEFAULT_DEF (vuse)
&& (gimple_bb (def_stmt) == bb
! || !dominated_by_p (CDI_DOMINATORS,
! bb, gimple_bb (def_stmt))))
goto next;
/* Found a proper dereference with an aggregate copy. Just
--- 327,341 ----
continue;
/* Check if we can move the loads. The def stmt of the virtual use
! needs to be in a different basic block dominating bb. When the
! def is an edge-inserted one we know it dominates us. */
vuse = gimple_vuse (use_stmt);
def_stmt = SSA_NAME_DEF_STMT (vuse);
if (!SSA_NAME_IS_DEFAULT_DEF (vuse)
&& (gimple_bb (def_stmt) == bb
! || (gimple_bb (def_stmt)
! && !dominated_by_p (CDI_DOMINATORS,
! bb, gimple_bb (def_stmt)))))
goto next;
/* Found a proper dereference with an aggregate copy. Just
Index: gcc/testsuite/gcc.dg/torture/pr70740.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr70740.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr70740.c (working copy)
***************
*** 0 ****
--- 1,38 ----
+ /* { dg-do compile } */
+
+ extern int foo (void);
+ extern void *memcpy (void *, const void *, __SIZE_TYPE__);
+
+ struct
+ {
+ char a[6];
+ } d;
+ struct
+ {
+ int a1[0];
+ int a2[0];
+ int a3[0];
+ int a4[];
+ } a, c;
+ int b;
+
+ int *
+ bar ()
+ {
+ if (b)
+ return a.a4;
+ return a.a2;
+ }
+
+ void
+ baz ()
+ {
+ int *e, *f;
+ if (foo ())
+ e = c.a3;
+ else
+ e = c.a1;
+ memcpy (d.a, e, 6);
+ f = bar ();
+ memcpy (d.a, f, 1);
+ }