stor-layout.c (self_referential_component_ref_p): New predicate.
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 27 Apr 2015 10:29:07 +0000 (10:29 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 27 Apr 2015 10:29:07 +0000 (10:29 +0000)
* stor-layout.c (self_referential_component_ref_p): New predicate.
(copy_self_referential_tree_r): Use it.
(self_referential_size): Punt for simple operations directly involving
self-referential component references.
* tree-cfg.c (dump_function_to_file): Add missing final curly bracket.

From-SVN: r222456

gcc/ChangeLog
gcc/stor-layout.c
gcc/tree-cfg.c

index 1908e46..3688fb4 100644 (file)
@@ -1,5 +1,13 @@
 2015-04-27  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * stor-layout.c (self_referential_component_ref_p): New predicate.
+       (copy_self_referential_tree_r): Use it.
+       (self_referential_size): Punt for simple operations directly involving
+       self-referential component references.
+       * tree-cfg.c (dump_function_to_file): Add missing final curly bracket.
+
+2015-04-27  Eric Botcazou  <ebotcazou@adacore.com>
+
        * ipa-icf.c (icf_handled_component_p): Remove redundant tests.
 
 2015-04-27  Richard Sandiford  <richard.sandiford@arm.com>
index f18f1ac..54bbde6 100644 (file)
@@ -127,6 +127,20 @@ variable_size (tree size)
 /* An array of functions used for self-referential size computation.  */
 static GTY(()) vec<tree, va_gc> *size_functions;
 
+/* Return true if T is a self-referential component reference.  */
+
+static bool
+self_referential_component_ref_p (tree t)
+{
+  if (TREE_CODE (t) != COMPONENT_REF)
+    return false;
+
+  while (REFERENCE_CLASS_P (t))
+    t = TREE_OPERAND (t, 0);
+
+  return (TREE_CODE (t) == PLACEHOLDER_EXPR);
+}
+
 /* Similar to copy_tree_r but do not copy component references involving
    PLACEHOLDER_EXPRs.  These nodes are spotted in find_placeholder_in_expr
    and substituted in substitute_in_expr.  */
@@ -154,19 +168,10 @@ copy_self_referential_tree_r (tree *tp, int *walk_subtrees, void *data)
     }
 
   /* Default case: the component reference.  */
-  else if (code == COMPONENT_REF)
+  else if (self_referential_component_ref_p (*tp))
     {
-      tree inner;
-      for (inner = TREE_OPERAND (*tp, 0);
-          REFERENCE_CLASS_P (inner);
-          inner = TREE_OPERAND (inner, 0))
-       ;
-
-      if (TREE_CODE (inner) == PLACEHOLDER_EXPR)
-       {
-         *walk_subtrees = 0;
-         return NULL_TREE;
-       }
+      *walk_subtrees = 0;
+      return NULL_TREE;
     }
 
   /* We're not supposed to have them in self-referential size trees
@@ -199,7 +204,7 @@ self_referential_size (tree size)
 
   /* Do not factor out simple operations.  */
   t = skip_simple_constant_arithmetic (size);
-  if (TREE_CODE (t) == CALL_EXPR)
+  if (TREE_CODE (t) == CALL_EXPR || self_referential_component_ref_p (t))
     return size;
 
   /* Collect the list of self-references in the expression.  */
index 988ab2a..99b27c7 100644 (file)
@@ -7441,7 +7441,11 @@ dump_function_to_file (tree fndecl, FILE *file, int flags)
       else
        {
          if (!ignore_topmost_bind)
-           fprintf (file, "{\n");
+           {
+             fprintf (file, "{\n");
+             /* No topmost bind, pretend it's ignored for later.  */
+             ignore_topmost_bind = true;
+           }
          indent = 2;
        }