aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-11-23 14:25:48 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-11-23 14:25:48 +0000
commitcbb88345e10ffb70e289408303c58aa01b1a059c (patch)
tree3ca6d267955784f9df891b67f002317e654d40c1 /gcc
parentabe405742f6e61756e3e8b08a8bcbc28b482a5ef (diff)
downloadgcc-cbb88345e10ffb70e289408303c58aa01b1a059c.zip
gcc-cbb88345e10ffb70e289408303c58aa01b1a059c.tar.gz
gcc-cbb88345e10ffb70e289408303c58aa01b1a059c.tar.bz2
re PR tree-optimization/78482 (wrong code at -O3 in both 32-bit and 64-bit modes on x86_64-linux-gnu)
2016-11-23 Richard Biener <rguenther@suse.de> PR tree-optimization/78482 * tree-cfgcleanup.c: Include tree-ssa-loop-niter.h. (remove_forwarder_block_with_phi): When merging with a loop header creates a new latch reset number of iteration information of the loop. * gcc.dg/torture/pr78482.c: New testcase. From-SVN: r242754
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr78482.c37
-rw-r--r--gcc/tree-cfgcleanup.c14
4 files changed, 64 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 09724e3..bafdafb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-11-23 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/78482
+ * tree-cfgcleanup.c: Include tree-ssa-loop-niter.h.
+ (remove_forwarder_block_with_phi): When merging with a loop
+ header creates a new latch reset number of iteration information
+ of the loop.
+
2016-11-23 Eric Botcazou <ebotcazou@adacore.com>
* config/sparc/sparc.md (*ashrsi3_extend): Rename to...
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 604c591..db8b897 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-23 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/78482
+ * gcc.dg/torture/pr78482.c: New testcase.
+
2016-11-23 Bin Cheng <bin.cheng@arm.com>
* gcc.dg/fold-cond_expr-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr78482.c b/gcc/testsuite/gcc.dg/torture/pr78482.c
new file mode 100644
index 0000000..ef68bdf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr78482.c
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+
+int printf(const char*, ...);
+short a = 65531;
+int b = 3, f;
+char c, d;
+static void fn1(int p1)
+{
+ short e;
+ b = f;
+ if (f > p1 && p1)
+ L:
+ for (e = 0; 0;)
+ ;
+ else if (d) b = 0 >= b;
+ for (; e <= 3; e++)
+ {
+ if (b)
+ continue;
+ b = 3;
+ goto L;
+ }
+}
+
+int main()
+{
+ for (; c >= 0; c--)
+ {
+ if (!b)
+ {
+ printf("%d\n", 2);
+ continue;
+ }
+ fn1(a);
+ }
+ return 0;
+}
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index fe22ed3..1f17d9a 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -42,6 +42,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-scalar-evolution.h"
#include "gimple-match.h"
#include "gimple-fold.h"
+#include "tree-ssa-loop-niter.h"
/* The set of blocks in that at least one of the following changes happened:
@@ -885,6 +886,19 @@ remove_forwarder_block_with_phi (basic_block bb)
DEST. */
e = single_succ_edge (split_edge (e));
}
+ else
+ {
+ /* If we merge the forwarder into a loop header verify if we
+ are creating another loop latch edge. If so, reset
+ number of iteration information of the loop. */
+ if (dest->loop_father->header == dest
+ && dominated_by_p (CDI_DOMINATORS, e->src, dest))
+ {
+ dest->loop_father->any_upper_bound = false;
+ dest->loop_father->any_likely_upper_bound = false;
+ free_numbers_of_iterations_estimates_loop (dest->loop_father);
+ }
+ }
s = redirect_edge_and_branch (e, dest);