re PR tree-optimization/10528 (Unexpected loop un-optimization when removing a field...
authorRichard Henderson <rth@redhat.com>
Mon, 13 Sep 2004 02:28:19 +0000 (19:28 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 13 Sep 2004 02:28:19 +0000 (19:28 -0700)
        PR tree-opt/10528
        * tree-inline.c (copy_body_r): Recompute bits for ADDR_EXPR,
        after copying its argument.

From-SVN: r87423

gcc/ChangeLog
gcc/tree-inline.c

index 5a704a16dbe88201fccab80e5e35853da4389ad8..ce26d86ad264598e088e1c933add1a5373ae24de 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-13  Richard Henderson  <rth@redhat.com>
+
+       PR tree-opt/10528
+       * tree-inline.c (copy_body_r): Recompute bits for ADDR_EXPR,
+       after copying its argument.
+
 2004-09-13  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * c-common.c, c-decl.c, c-lex.c, c-objc-common.c, c-opts.c,
index 6286f8ab380a52a0c81ab329ebb9ff032f834afa..82b7857cb1b256fff04fa7bd62842caea9f1f2d6 100644 (file)
@@ -619,6 +619,16 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
          TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
          TREE_OPERAND (*tp, 3) = NULL_TREE;
        }
+
+      /* Variable substitution need not be simple.  In particular, the
+        INDIRECT_REF substitution above.  Make sure that TREE_CONSTANT
+        and friends are up-to-date.  */
+      else if (TREE_CODE (*tp) == ADDR_EXPR)
+       {
+         walk_tree (&TREE_OPERAND (*tp, 0), copy_body_r, id, NULL);
+         recompute_tree_invarant_for_addr_expr (*tp);
+         *walk_subtrees = 0;
+       }
     }
 
   /* Keep iterating.  */