diff options
author | Richard Guenther <rguenther@suse.de> | 2012-02-21 12:37:33 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-02-21 12:37:33 +0000 |
commit | 01718e96e798e62564e8aa3e4496e78441811c71 (patch) | |
tree | a608d53ad0ae105cb54069a711fc6c63a367c516 /gcc | |
parent | 305406d3e1e585ec8dc1eedbaf757148f6034119 (diff) | |
download | gcc-01718e96e798e62564e8aa3e4496e78441811c71.zip gcc-01718e96e798e62564e8aa3e4496e78441811c71.tar.gz gcc-01718e96e798e62564e8aa3e4496e78441811c71.tar.bz2 |
re PR tree-optimization/52324 (Store motion no longer performed)
2012-02-21 Richard Guenther <rguenther@suse.de>
PR tree-optimization/52324
* gimplify.c (gimplify_expr): When re-gimplifying expressions
do not gimplify a MEM_REF address operand if it is already
in suitable form.
* gcc.dg/tree-ssa/ssa-lim-10.c: New testcase.
From-SVN: r184435
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gimplify.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-10.c | 31 |
4 files changed, 56 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 87dac53..4388b68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-02-21 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/52324 + * gimplify.c (gimplify_expr): When re-gimplifying expressions + do not gimplify a MEM_REF address operand if it is already + in suitable form. + 2012-02-21 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * config/s390/s390.md ("fixuns_trunc<mode>si2"): Replace diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 782adc3..a214134 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -7061,15 +7061,23 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ret = GS_OK; break; } - ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p, - is_gimple_mem_ref_addr, fb_rvalue); - if (ret == GS_ERROR) - break; + /* Avoid re-gimplifying the address operand if it is already + in suitable form. Re-gimplifying would mark the address + operand addressable. Always gimplify when not in SSA form + as we still may have to gimplify decls with value-exprs. */ + if (!gimplify_ctxp || !gimplify_ctxp->into_ssa + || !is_gimple_mem_ref_addr (TREE_OPERAND (*expr_p, 0))) + { + ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p, + is_gimple_mem_ref_addr, fb_rvalue); + if (ret == GS_ERROR) + break; + } recalculate_side_effects (*expr_p); ret = GS_ALL_DONE; break; - /* Constants need not be gimplified. */ + /* Constants need not be gimplified. */ case INTEGER_CST: case REAL_CST: case FIXED_CST: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0fe2f69..5592364 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-02-21 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/52324 + * gcc.dg/tree-ssa/ssa-lim-10.c: New testcase. + 2012-02-21 Georg-Johann Lay <avr@gjlay.de> PR middle-end/51782 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-10.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-10.c new file mode 100644 index 0000000..bc14926 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-10.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-lim1-details" } */ + +int *l, *r; +int test_func(void) +{ + int i; + int direction; + static int pos; + + pos = 0; + direction = 1; + + for ( i = 0; i <= 400; i++ ) + { + if ( direction == 0 ) + pos = l[pos]; + else + pos = r[pos]; + + if ( pos == -1 ) + { + pos = 0; + direction = !direction; + } + } + return i; +} + +/* { dg-final { scan-tree-dump "Executing store motion of pos" "lim1" } } */ +/* { dg-final { cleanup-tree-dump "lim1" } } */ |