diff mbox

Fix PR76783

Message ID alpine.LSU.2.11.1608161318200.26629@t29.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Aug. 16, 2016, 11:18 a.m. UTC
On Tue, 16 Aug 2016, Richard Biener wrote:

> 
> This patch fixes PR76783 by not just using any PRE order but RPO order
> for the SSA propagator.  This makes sure to visit PHI args from
> non-backedges before the PHI node itself.
> 
> It also fixes the assumption that BB_VISITED is well-defined on
> pass entry (but still keeps clearing it at the end because not
> doing so ICEs IRA later which assumes that BB_VISITED is cleared)
> 
> Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Applied as follows.

Richard.

2016-08-16  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/76783
	* tree-ssa-propagate.c (ssa_prop_init): Use RPO order.  Clear
	BB visited flags at start.

	* gcc.dg/pr76783.c: New testcase.
	* gcc.dg/tree-ssa/pr69270-2.c: Adjust.

Index: gcc/tree-ssa-propagate.c
===================================================================
*** gcc/tree-ssa-propagate.c	(revision 239473)
--- gcc/tree-ssa-propagate.c	(working copy)
*************** ssa_prop_init (void)
*** 422,429 ****
    /* Worklist of basic-blocks.  */
    bb_to_cfg_order = XNEWVEC (int, last_basic_block_for_fn (cfun) + 1);
    cfg_order_to_bb = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
!   int n = pre_and_rev_post_order_compute_fn (cfun, cfg_order_to_bb,
! 					     NULL, false);
    for (int i = 0; i < n; ++i)
      bb_to_cfg_order[cfg_order_to_bb[i]] = i;
    cfg_blocks = BITMAP_ALLOC (NULL);
--- 422,429 ----
    /* Worklist of basic-blocks.  */
    bb_to_cfg_order = XNEWVEC (int, last_basic_block_for_fn (cfun) + 1);
    cfg_order_to_bb = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
!   int n = pre_and_rev_post_order_compute_fn (cfun, NULL,
! 					     cfg_order_to_bb, false);
    for (int i = 0; i < n; ++i)
      bb_to_cfg_order[cfg_order_to_bb[i]] = i;
    cfg_blocks = BITMAP_ALLOC (NULL);
*************** ssa_prop_init (void)
*** 453,459 ****
  	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
  	}
  
!       gcc_assert (! (bb->flags & BB_VISITED));
        FOR_EACH_EDGE (e, ei, bb->succs)
  	e->flags &= ~EDGE_EXECUTABLE;
      }
--- 453,459 ----
  	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
  	}
  
!       bb->flags &= ~BB_VISITED;
        FOR_EACH_EDGE (e, ei, bb->succs)
  	e->flags &= ~EDGE_EXECUTABLE;
      }
Index: gcc/testsuite/gcc.dg/pr76783.c
===================================================================
*** gcc/testsuite/gcc.dg/pr76783.c	(revision 0)
--- gcc/testsuite/gcc.dg/pr76783.c	(working copy)
***************
*** 0 ****
--- 1,28 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target int128 } */
+ /* { dg-options "-Og -w -Wno-psabi" } */
+ 
+ typedef unsigned __int128 u128;
+ typedef unsigned __int128 v64u128 __attribute__ ((vector_size (64)));
+ 
+ u128 __attribute__ ((noinline, noclone))
+ foo (unsigned c, v64u128 v)
+ {
+   v64u128 u;
+   if (c) {
+     u = (v64u128){(u128)0, (u128)0};
+   } else {
+     u = (v64u128){(u128)0, (u128)1};
+   }
+   u += v;
+   return u[1];
+ }
+ 
+ int
+ main ()
+ {
+   u128 x = foo (0, (v64u128){ });
+   if (x != 1)
+     __builtin_abort();
+   return 0;
+ }
diff mbox

Patch

Index: gcc/testsuite/gcc.dg/tree-ssa/pr69270-2.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr69270-2.c	(revision 239473)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr69270-2.c	(working copy)
@@ -1,16 +1,8 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom3-details -w" } */
+/* { dg-options "-O2 -fdump-tree-dce2 -w" } */
 
-/* There should be a reference to usecount that turn into
-   constants.  */
-/* { dg-final { scan-tree-dump-times "Replaced .usecount_\[0-9\]+. with constant .1." 1 "dom3"} } */
-
-/* And an assignment using usecount ought to fold down to constants.  */
-/* { dg-final { scan-tree-dump-times "Folded to: usecount_\[0-9\]+ = 2;" 1 "dom3"} } */
-
-/* The arithmetic using usecount should be gone, except for the one in the
-   details debugging.  */
-/* { dg-final { scan-tree-dump-times "usecount_\[0-9\]+ = usecount_\[0-9\]+ . 1;" 1 "dom3"} } */
+/* The arithmetic using usecount should be gone.  */
+/* { dg-final { scan-tree-dump-times "usecount_\[0-9\]+ = usecount_\[0-9\]+ . 1;" 0 "dce2"} } */
 
 typedef union tree_node *tree;
 typedef union gimple_statement_d *gimple;