stor-layout.c (self_referential_component_ref_p): New predicate.
* 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
This commit is contained in:
parent
e5115cf9bc
commit
232f1f97ad
|
@ -1,3 +1,11 @@
|
|||
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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue