From 87a34442667d0ecd397e141e26a64419fb71850c Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Sat, 17 May 2014 14:37:58 +0200 Subject: [PATCH] re PR tree-optimization/61140 (wrong code at -O1 and above on x86_64-linux-gnu) 2014-05-17 Marc Glisse PR tree-optimization/61140 PR tree-optimization/61150 PR tree-optimization/61197 gcc/ * tree-ssa-phiopt.c (value_replacement): Punt on multiple phis. gcc/testsuite/ * gcc.dg/tree-ssa/pr61140.c: New file. * gcc.dg/tree-ssa/pr61150.c: New file. * gcc.dg/tree-ssa/pr61197.c: New file. From-SVN: r210554 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 9 +++++++++ gcc/testsuite/gcc.dg/tree-ssa/pr61140.c | 18 +++++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/pr61150.c | 24 +++++++++++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/pr61197.c | 26 +++++++++++++++++++++++++ gcc/tree-ssa-phiopt.c | 4 ++++ 6 files changed, 88 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr61140.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr61150.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr61197.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 84345c08bc76..daf6e1a11371 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 c4007679cd3e..3c7ff36e95fa 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 000000000000..2f175cb7e2dc --- /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 000000000000..c11798cace4e --- /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 000000000000..919578b7ff7f --- /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 d4aaf42b2a5f..e3b6f1dd6a37 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. */ -- 2.47.3