aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2013-11-21 12:45:16 -0700
committerJeff Law <law@gcc.gnu.org>2013-11-21 12:45:16 -0700
commita6094705724d05fc2286c4541c97b8093b77bf05 (patch)
treeecd22acba8a1cb9ccadacc18271aa7b140edb5f7
parent3c8e8595edb357b7ff80c86c46f79823ed1ecce1 (diff)
downloadgcc-a6094705724d05fc2286c4541c97b8093b77bf05.zip
gcc-a6094705724d05fc2286c4541c97b8093b77bf05.tar.gz
gcc-a6094705724d05fc2286c4541c97b8093b77bf05.tar.bz2
re PR tree-optimization/59221 (wrong code at -O2 and -O3 on x86_64-linux-gnu)
PR tree-optimization/59221 * tree-ssa-threadedge.c (thread_across_edge): Properly manage temporary equivalences when threading through joiner blocks. PR tree-optimization/59221 * gcc.c-torture/execute/pr59221.c: New test. From-SVN: r205229
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr59221.c19
-rw-r--r--gcc/tree-ssa-threadedge.c7
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a16ae68..e632558 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-11-21 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/59221
+ * tree-ssa-threadedge.c (thread_across_edge): Properly manage
+ temporary equivalences when threading through joiner blocks.
+
2013-11-21 Joseph Myers <joseph@codesourcery.com>
PR rtl-optimization/55950
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b29070f..0b3f8ba 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-11-21 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/59221
+ * gcc.c-torture/execute/pr59221.c: New test.
+
2013-11-21 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR libfortran/59227
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr59221.c b/gcc/testsuite/gcc.c-torture/execute/pr59221.c
new file mode 100644
index 0000000..0cd4259
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr59221.c
@@ -0,0 +1,19 @@
+
+
+int a = 1, b, d;
+short e;
+
+int
+main ()
+{
+ for (; b; b++)
+ ;
+ short f = a;
+ int g = 15;
+ e = f ? f : 1 << g;
+ int h = e;
+ d = h == 83647 ? 0 : h;
+ if (d != 1)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index 7bb8829..a144875 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -1072,6 +1072,10 @@ thread_across_edge (gimple dummy_cond,
/* Look at each successor of E->dest to see if we can thread through it. */
FOR_EACH_EDGE (taken_edge, ei, e->dest->succs)
{
+ /* Push a fresh marker so we can unwind the equivalences created
+ for each of E->dest's successors. */
+ stack->safe_push (NULL_TREE);
+
/* Avoid threading to any block we have already visited. */
bitmap_clear (visited);
bitmap_set_bit (visited, taken_edge->dest->index);
@@ -1118,6 +1122,9 @@ thread_across_edge (gimple dummy_cond,
{
delete_jump_thread_path (path);
}
+
+ /* And unwind the equivalence table. */
+ remove_temporary_equivalences (stack);
}
BITMAP_FREE (visited);
}