OSDN Git Service

* gimplify.c (maybe_with_size_expr): If already have WITH_SIZE_EXPR,
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Jul 2004 02:57:25 +0000 (02:57 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Jul 2004 02:57:25 +0000 (02:57 +0000)
don't make another one.

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

gcc/ChangeLog
gcc/gimplify.c

index b1d0191..60411fa 100644 (file)
@@ -1,5 +1,8 @@
 2004-07-27  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+       * gimplify.c (maybe_with_size_expr): If already have WITH_SIZE_EXPR,
+       don't make another one.
+
        PR optimization/15077
        * function.h (struct function): Add field saved_static_chain_decl.
        Fix comment for static_chain_decl.
index fc260c8..304a20b 100644 (file)
@@ -1746,20 +1746,25 @@ gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
 static void
 maybe_with_size_expr (tree *expr_p)
 {
-  tree expr, type, size;
+  tree expr = *expr_p;
+  tree type = TREE_TYPE (expr);
+  tree size;
 
-  expr = *expr_p;
-  type = TREE_TYPE (expr);
-  if (type == error_mark_node)
+  /* If we've already wrapped this or the type is error_mark_node, we can't do
+     anything.  */
+  if (TREE_CODE (expr) == WITH_SIZE_EXPR
+      || type == error_mark_node)
     return;
 
+  /* If the size isn't known or is a constant, we have nothing to do.  */
   size = TYPE_SIZE_UNIT (type);
-  if (size && TREE_CODE (size) != INTEGER_CST)
-    {
-      size = unshare_expr (size);
-      size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
-      *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
-    }
+  if (!size || TREE_CODE (size) == INTEGER_CST)
+    return;
+
+  /* Otherwise, make a WITH_SIZE_EXPR.  */
+  size = unshare_expr (size);
+  size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
+  *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
 }
 
 /* Subroutine of gimplify_call_expr:  Gimplify a single argument.  */