diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 84345c08bc7..daf6e1a1137 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-05-17 Marc Glisse + + PR tree-optimization/61140 + PR tree-optimization/61150 + PR tree-optimization/61197 + * tree-ssa-phiopt.c (value_replacement): Punt on multiple phis. + 2014-05-17 Uros Bizjak * doc/invoke.texi (free): Mention Alpha. Also enabled at -Os. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c4007679cd3..3c7ff36e95f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2014-05-17 Marc Glisse + + PR tree-optimization/61140 + PR tree-optimization/61150 + PR tree-optimization/61197 + * gcc.dg/tree-ssa/pr61140.c: New file. + * gcc.dg/tree-ssa/pr61150.c: New file. + * gcc.dg/tree-ssa/pr61197.c: New file. + 2014-05-17 Uros Bizjak * g++.dg/pr60969.C: Compile for all ilp32 x86 targets. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61140.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61140.c new file mode 100644 index 00000000000..2f175cb7e2d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61140.c @@ -0,0 +1,18 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +int a[1] = { 1 }, b = 1, c; + +int +main () +{ + for (; c < 1; c++) + if (a[0]) + { + a[0] &= 1; + b = 0; + } + if (b) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61150.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61150.c new file mode 100644 index 00000000000..c11798cace4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61150.c @@ -0,0 +1,24 @@ +/* { dg-do run } */ +/* { dg-options "-O3" } */ + +int a, b, c, d = 1; + +int +main () +{ + int e = d; + for (b = 0; b < 5; b++) + { + for (a = 0; a < 1; a++) + { + if (e) + break; + for (c = 0; c < 1; c++) + ; + } + e |= 1; + } + if (c) + __builtin_abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61197.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61197.c new file mode 100644 index 00000000000..919578b7ff7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61197.c @@ -0,0 +1,26 @@ +/* { dg-do run } */ +/* { dg-options "-O3" } */ + +int a, b = 1, *c = &a; + +int +foo () +{ + if (b) + b |= 1; + else + { + b = 1; + return 0; + } + return 1; +} + +int +main () +{ + *c = foo (); + if (a != 1) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index d4aaf42b2a5..e3b6f1dd6a3 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -849,6 +849,10 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, && !POINTER_TYPE_P (TREE_TYPE (arg0)))) return 0; + /* Only transform if it removes the condition. */ + if (!single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)), e0, e1)) + return 0; + /* Size-wise, this is always profitable. */ if (optimize_bb_for_speed_p (cond_bb) /* The special case is useless if it has a low probability. */