aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr24117.c24
-rw-r--r--gcc/tree-ssa-structalias.c6
3 files changed, 34 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ebedfca..2242dcd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-09-29 Daniel Berlin <dberlin@dberlin.org>
+
+ Fix PR tree-optimization/24117
+ * tree-ssa-structalias.c (find_func_aliases): Strip nops
+ before considering whether to use anyoffset.
+
2005-09-29 Paolo Bonzini <bonzini@gnu.org>
Revert this patch:
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr24117.c b/gcc/testsuite/gcc.dg/tree-ssa/pr24117.c
new file mode 100644
index 0000000..ffa5dd0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr24117.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+typedef struct {
+ int x;
+ int z;
+} Foo_t;
+
+char *xm;
+void bar(void);
+
+void foo(void)
+{
+ Foo_t x;
+ x.x = 1;
+ x.z = 2;
+ xm = (char *)&x;
+ bar();
+ /* We can't propagate x.z past bar, so this link_error should still be there. */
+ if (x.z != 2)
+ link_error ();
+}
+/* { dg-final { scan-tree-dump-times "link_error" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index c41519c..890006a 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -2817,16 +2817,18 @@ find_func_aliases (tree t, struct alias_info *ai)
case tcc_expression:
case tcc_unary:
{
+ tree anyoffsetrhs = rhsop;
bool need_anyoffset = false;
rhs = get_constraint_for (rhsop, &need_anyoffset);
process_constraint (new_constraint (lhs, rhs));
-
+
+ STRIP_NOPS (anyoffsetrhs);
/* When taking the address of an aggregate
type, from the LHS we can access any field
of the RHS. */
if (need_anyoffset || (rhs.type == ADDRESSOF
&& !(get_varinfo (rhs.var)->is_special_var)
- && AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (rhsop)))))
+ && AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (anyoffsetrhs)))))
{
rhs.var = anyoffset_id;
rhs.type = ADDRESSOF;