diff options
author | Richard Guenther <rguenther@suse.de> | 2006-05-01 15:07:25 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-05-01 15:07:25 +0000 |
commit | ea6431202d7e3c472f6c039bbfc0c22f2e8e9a52 (patch) | |
tree | 18fe0f5c1c17a977a97040b0f6c41c4d08816eac /gcc | |
parent | d814595c2c47096eb70ff15fffadc5218806aaec (diff) | |
download | gcc-ea6431202d7e3c472f6c039bbfc0c22f2e8e9a52.zip gcc-ea6431202d7e3c472f6c039bbfc0c22f2e8e9a52.tar.gz gcc-ea6431202d7e3c472f6c039bbfc0c22f2e8e9a52.tar.bz2 |
re PR target/26726 (-fivopts producing out of bounds array refs)
2006-05-01 Richard Guenther <rguenther@suse.de>
PR tree-optimization/26726
* tree-ssa-loop-ivopts.c (idx_find_step): Mark source of the
problem ...
(find_interesting_uses_address): ... we work around here
by folding INDIRECT_REFs in the substituted base.
* g++.dg/tree-ssa/ivopts-1.C: New testcase.
From-SVN: r113414
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C | 18 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 14 |
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 99942eb..ac99122 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-05-01 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/26726 + * tree-ssa-loop-ivopts.c (idx_find_step): Mark source of the + problem ... + (find_interesting_uses_address): ... we work around here + by folding INDIRECT_REFs in the substituted base. + 2006-05-01 Diego Novillo <dnovillo@redhat.com> * omp-low.c (dump_omp_region): Add newlines. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1aeb5ac..15c7c63 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-05-01 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/26726 + * g++.dg/tree-ssa/ivopts-1.C: New testcase. + 2006-04-30 Roger Sayle <roger@eyesopen.com> * gcc.dg/Woverflow-1.c: New test case. diff --git a/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C b/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C new file mode 100644 index 0000000..b894552 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ivopts" } */ + +struct Foo { + Foo() : s(1) {} + int s; +}; +void foo(Foo&); +void bar(void) +{ + Foo x[4]; + foo(x[0]); +} + +/* { dg-final { scan-tree-dump-not "-&x" "ivopts" } } */ +/* { dg-final { scan-tree-dump-not "offset: -4B" "ivopts" { xfail i?86-*-* x86_64-*-* } } } */ +/* { dg-final { scan-tree-dump-not "&x\\\[5\\\]" "ivopts" { xfail i?86-*-* x86_64-*-* } } } */ +/* { dg-final { cleanup-tree-dump "ivopts" } } */ diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index acc8c8a..75d5407 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -1376,6 +1376,9 @@ idx_find_step (tree base, tree *idx, void *data) if (!iv) return false; + /* XXX We produce for a base of *D42 with iv->base being &x[0] + *&x[0], which is not folded and does not trigger the + ARRAY_REF path below. */ *idx = iv->base; if (!iv->step) @@ -1547,6 +1550,17 @@ find_interesting_uses_address (struct ivopts_data *data, tree stmt, tree *op_p) gcc_assert (TREE_CODE (base) != MISALIGNED_INDIRECT_REF); base = build_fold_addr_expr (base); + + /* Substituting bases of IVs into the base expression might + have caused folding opportunities. */ + if (TREE_CODE (base) == ADDR_EXPR) + { + tree *ref = &TREE_OPERAND (base, 0); + while (handled_component_p (*ref)) + ref = &TREE_OPERAND (*ref, 0); + if (TREE_CODE (*ref) == INDIRECT_REF) + *ref = fold_indirect_ref (*ref); + } } civ = alloc_iv (base, step); |