re PR tree-optimization/76783 (wrong code with conditional vector assignment @ -Og)

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.

From-SVN: r239496
This commit is contained in:
Richard Biener 2016-08-16 11:22:47 +00:00 committed by Richard Biener
parent 8f21990a67
commit f4eec0a3e3
5 changed files with 46 additions and 14 deletions

View File

@ -1,3 +1,9 @@
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.
2016-08-16 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/72817

View File

@ -1,3 +1,9 @@
2016-08-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/76783
* gcc.dg/pr76783.c: New testcase.
* gcc.dg/tree-ssa/pr69270-2.c: Adjust.
2016-08-16 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/72817

View File

@ -0,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;
}

View File

@ -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;

View File

@ -422,8 +422,8 @@ ssa_prop_init (void)
/* 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);
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);
@ -453,7 +453,7 @@ ssa_prop_init (void)
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
}
gcc_assert (! (bb->flags & BB_VISITED));
bb->flags &= ~BB_VISITED;
FOR_EACH_EDGE (e, ei, bb->succs)
e->flags &= ~EDGE_EXECUTABLE;
}