From: law Date: Thu, 21 Nov 2013 19:45:16 +0000 (+0000) Subject: PR tree-optimization/59221 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1a1e103fb402a6b48689a739366b1caba03ded75;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205229 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a16ae684f914..e63255845bd3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-11-21 Jeff Law + + 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 PR rtl-optimization/55950 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b29070fb11fd..0b3f8ba9b79c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-11-21 Jeff Law + + PR tree-optimization/59221 + * gcc.c-torture/execute/pr59221.c: New test. + 2013-11-21 Francois-Xavier Coudert 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 000000000000..0cd425948fcb --- /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 7bb8829e5cc7..a1448757ead7 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); }