summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipa-pta-15.c32
-rw-r--r--gcc/tree-ssa-structalias.c9
4 files changed, 49 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5c066b524b4..45155e417f5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2010-07-29 Richard Guenther <rguenther@suse.de>
+ 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 <rguenther@suse.de>
+
PR middle-end/45034
* convert.c (convert_to_integer): Always use an unsigned
type for narrowed negate and bitwise not.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fdb52bd338c..35415a3d55f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-29 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/45120
+ * gcc.dg/ipa/ipa-pta-15.c: New testcase.
+
2010-07-29 Mikael Morin <mikael@gcc.gnu.org>
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 00000000000..77701ebd5ad
--- /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 cf5815f67e5..37fc6f83a38 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;
}