From: Richard Biener Date: Fri, 27 Sep 2013 08:14:53 +0000 (+0000) Subject: re PR tree-optimization/58459 (Loop invariant is not hoisted out of loop after r202525.) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e6f1c50939a3f0eac91f343216bb5e2ba0153ed8;p=gcc.git re PR tree-optimization/58459 (Loop invariant is not hoisted out of loop after r202525.) 2013-09-27 Richard Biener PR tree-optimization/58459 * tree-ssa-forwprop.c (forward_propagate_addr_expr): Remove restriction not propagating into loops. * gcc.dg/tree-ssa/ssa-pre-31.c: New testcase. From-SVN: r202966 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 484d868b88b..5cb2a521657 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-09-27 Richard Biener + + PR tree-optimization/58459 + * tree-ssa-forwprop.c (forward_propagate_addr_expr): Remove + restriction not propagating into loops. + 2013-09-26 Florian Weimer * tree-ssa.h (walk_use_def_chains_fn, walk_use_def_chains): Delete. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b35d8b5e52b..094fafc35a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-27 Richard Biener + + PR tree-optimization/58459 + * gcc.dg/tree-ssa/ssa-pre-31.c: New testcase. + 2013-09-26 Bernd Edlinger PR fortran/58113 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c new file mode 100644 index 00000000000..2094de4ca89 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c @@ -0,0 +1,47 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-pre" } */ + +typedef struct { + unsigned int key; +} S; +typedef struct s1 { + unsigned int key; + unsigned int bits; + struct s1 *left, *right; +}S1; +extern S a[1024]; +static inline int bar( S* p, S1* n ) +{ + S1 *curr; + S1 *next; + + if ( n->left == n ) + return (int)(p->key == n->key); + + curr = n; + next = n->left; + + while (curr->bits > next->bits ) { + curr = next; + if (p->key & (1 << curr->bits)) + next = curr->right; + else + next = curr->left; + } + + return (int)(p->key == next->key); + +} + +int foo (S1 *root, int N) +{ + volatile int r; + int i,j; + for (i=0; i stmt_loop_depth - && !is_gimple_min_invariant (rhs)) + gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt); + result = forward_propagate_addr_expr_1 (name, rhs, &gsi, + single_use_p); + /* If the use has moved to a different statement adjust + the update machinery for the old statement too. */ + if (use_stmt != gsi_stmt (gsi)) { - all = false; - continue; + update_stmt (use_stmt); + use_stmt = gsi_stmt (gsi); } - - { - gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt); - result = forward_propagate_addr_expr_1 (name, rhs, &gsi, - single_use_p); - /* If the use has moved to a different statement adjust - the update machinery for the old statement too. */ - if (use_stmt != gsi_stmt (gsi)) - { - update_stmt (use_stmt); - use_stmt = gsi_stmt (gsi); - } - - update_stmt (use_stmt); - } + update_stmt (use_stmt); all &= result; /* Remove intermediate now unused copy and conversion chains. */