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
This commit is contained in:
parent
d814595c2c
commit
ea6431202d
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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" } } */
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue