diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/20040911-1.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.c | 12 |
4 files changed, 39 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 80d1437..57e3817 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-09-11 Jakub Jelinek <jakub@redhat.com> + + * tree-ssa-alias.c (collect_points_to_info_r): Handle + pointing to PTR + OFFSET as PTR, not as pointing to PTR or pointing + to OFFSET. + 2004-09-11 Richard Henderson <rth@redhat.com> * expr.c (expand_expr_addr_expr_1) Rename from expand_expr_addr_expr. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 07cf16e..3727d52 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-09-11 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/tree-ssa/20040911-1.c: New test. + 2004-09-11 Andreas Jaeger <aj@suse.de> * gcc.c-torture/execute/991118-1.x: Delete, PR 16437 is fixed. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040911-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20040911-1.c new file mode 100644 index 0000000..6b49570 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/20040911-1.c @@ -0,0 +1,21 @@ +/* Verify that points-to information is handled properly for PTR + OFFSET + pointer arithmetics. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-alias1-vops" } */ + +char buf[4], *q; +int foo (int i) +{ + char c, *p; + q = &c; + p = buf; + if (i) + p = p + 3; + else + p = p + 2; + *p = 6; + c = 8; + return *p; +} + +/* { dg-final { scan-tree-dump-not "VUSE <c" "alias1" } } */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index cd41fba..47f8d96 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1869,7 +1869,8 @@ collect_points_to_info_r (tree var, tree stmt, void *data) /* Both operands may be of pointer type. FIXME: Shouldn't we just expect PTR + OFFSET always? */ - if (POINTER_TYPE_P (TREE_TYPE (op0))) + if (POINTER_TYPE_P (TREE_TYPE (op0)) + && TREE_CODE (op0) != INTEGER_CST) { if (TREE_CODE (op0) == SSA_NAME) merge_pointed_to_info (ai, var, op0); @@ -1879,7 +1880,8 @@ collect_points_to_info_r (tree var, tree stmt, void *data) add_pointed_to_expr (var, op0); } - if (POINTER_TYPE_P (TREE_TYPE (op1))) + if (POINTER_TYPE_P (TREE_TYPE (op1)) + && TREE_CODE (op1) != INTEGER_CST) { if (TREE_CODE (op1) == SSA_NAME) merge_pointed_to_info (ai, var, op1); @@ -1892,8 +1894,10 @@ collect_points_to_info_r (tree var, tree stmt, void *data) /* Neither operand is a pointer? VAR can be pointing anywhere. FIXME: Is this right? If we get here, we found PTR = INT_CST + INT_CST. */ - if (!POINTER_TYPE_P (TREE_TYPE (op0)) - && !POINTER_TYPE_P (TREE_TYPE (op1))) + if (!(POINTER_TYPE_P (TREE_TYPE (op0)) + && TREE_CODE (op0) != INTEGER_CST) + && !(POINTER_TYPE_P (TREE_TYPE (op1)) + && TREE_CODE (op1) != INTEGER_CST)) add_pointed_to_expr (var, rhs); } |