From: Richard Guenther Date: Thu, 29 Jul 2010 12:30:09 +0000 (+0000) Subject: re PR tree-optimization/45120 (-fipa-pta causes FAIL: gcc.c-torture/execute/pta-field... X-Git-Tag: releases/gcc-4.6.0~5339 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1c09321ca033a4094193fe9ce4e54e3344ac5360;p=thirdparty%2Fgcc.git re PR tree-optimization/45120 (-fipa-pta causes FAIL: gcc.c-torture/execute/pta-field-2.c execution) 2010-07-29 Richard Guenther PR tree-optimization/45120 * tree-ssa-structalias.c (get_constraint_for_component_ref): Handle offset in DEREFs properly. (get_constraint_for_1): Handle MEM_REF offset properly. * gcc.dg/ipa/ipa-pta-15.c: New testcase. From-SVN: r162676 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c066b524b4c..45155e417f5a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-07-29 Richard Guenther + + PR tree-optimization/45120 + * tree-ssa-structalias.c (get_constraint_for_component_ref): + Handle offset in DEREFs properly. + (get_constraint_for_1): Handle MEM_REF offset properly. + 2010-07-29 Richard Guenther PR middle-end/45034 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fdb52bd338ce..35415a3d55f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-07-29 Richard Guenther + + PR tree-optimization/45120 + * gcc.dg/ipa/ipa-pta-15.c: New testcase. + 2010-07-29 Mikael Morin PR fortran/42051 diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-pta-15.c b/gcc/testsuite/gcc.dg/ipa/ipa-pta-15.c new file mode 100644 index 000000000000..77701ebd5ad6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/ipa-pta-15.c @@ -0,0 +1,32 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fipa-pta" } */ + +struct Foo { + int *p; + int *q; +}; + +void __attribute__((noinline)) +bar (int **x) +{ + struct Foo *f = (struct Foo *)(x - 1); + *(f->p) = 0; +} + +int foo(void) +{ + struct Foo f; + int i = 1, j = 2; + f.p = &i; + f.q = &j; + bar(&f.q); + return i; +} + +extern void abort (void); +int main() +{ + if (foo () != 0) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index cf5815f67e50..37fc6f83a38b 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -3208,10 +3208,11 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results, at most one subfiled of any variable. */ if (bitpos == -1 || bitsize != bitmaxsize - || AGGREGATE_TYPE_P (TREE_TYPE (orig_t))) + || AGGREGATE_TYPE_P (TREE_TYPE (orig_t)) + || result->offset == UNKNOWN_OFFSET) result->offset = UNKNOWN_OFFSET; else - result->offset = bitpos; + result->offset += bitpos; } else if (result->type == ADDRESSOF) { @@ -3345,8 +3346,8 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p) { case MEM_REF: { - get_constraint_for_ptr_offset (TREE_OPERAND (t, 0), - TREE_OPERAND (t, 1), results); + tree off = double_int_to_tree (sizetype, mem_ref_offset (t)); + get_constraint_for_ptr_offset (TREE_OPERAND (t, 0), off, results); do_deref (results); return; }