OSDN Git Service

* gimplify.c (gimplify_compound_lval): Reset TREE_SIDE_EFFECTS
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Jun 2004 18:31:56 +0000 (18:31 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Jun 2004 18:31:56 +0000 (18:31 +0000)
        after gimplifying the innermost component.

In

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@83670 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimplify.c

index 93329f9..8866356 100644 (file)
@@ -1,3 +1,8 @@
+2004-06-24  Jeff Law  <law@redhat.com>
+
+       * gimplify.c (gimplify_compound_lval): Reset TREE_SIDE_EFFECTS
+       after gimplifying the innermost component.
+
 2004-06-25  Richard Sandiford  <rsandifo@redhat.com>
 
        PR target/16176
index a7960fd..d34de91 100644 (file)
@@ -1942,6 +1942,22 @@ gimplify_compound_lval (tree *expr_p, tree *pre_p,
                        want_lvalue ? fb_lvalue : fb_rvalue);
   ret = MIN (ret, tret);
 
+  /* The innermost expression P may have originally had TREE_SIDE_EFFECTS
+     set which would have caused all the outer expressions in EXPR_P leading
+     to P to also have had TREE_SIDE_EFFECTS set.
+     Gimplification of P may have cleared TREE_SIDE_EFFECTS on P, which should
+     be propagated to P's parents, innermost to outermost.  */
+  for (p = expr_p; handled_component_p (*p); p = &TREE_OPERAND (*p, 0))
+    VARRAY_PUSH_TREE (stack, *p);
+
+  for (; VARRAY_ACTIVE_SIZE (stack) > 0; )
+    {
+      tree t = VARRAY_TOP_TREE (stack);
+      recalculate_side_effects (t);
+      VARRAY_POP (stack);
+    }
+
   /* If the outermost expression is a COMPONENT_REF, canonicalize its type.  */
   if (!want_lvalue && TREE_CODE (*expr_p) == COMPONENT_REF)
     {