This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][3/n] Make BLOCK_ABSTRACT_ORIGIN _really_ "ultimate"
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 28 Sep 2018 13:38:23 +0200 (CEST)
- Subject: [PATCH][3/n] Make BLOCK_ABSTRACT_ORIGIN _really_ "ultimate"
This completes [1/n] and uses DECL_ORIGIN when assigning a decl to
BLOCK_ABSTRACT_ORIGIN.
It also simplifies block_ultimate_origin further and puts some checking
inside it (that already passed bootstrap).
Bootstrap and regtest ongoing on x86_64-unknown-linux-gnu.
Richard.
2018-09-28 Richard Biener <rguenther@suse.de>
* tree-inline.c (expand_call_inline): Store origin of fn
in BLOCK_ABSTRACT_ORIGIN for the inline BLOCK.
* tree.c (block_ultimate_origin): Simplify and do some
checking.
Index: gcc/tree-inline.c
===================================================================
--- gcc/tree-inline.c (revision 264689)
+++ gcc/tree-inline.c (working copy)
@@ -4535,7 +4535,7 @@ expand_call_inline (basic_block bb, gimp
if (loc == UNKNOWN_LOCATION)
loc = BUILTINS_LOCATION;
id->block = make_node (BLOCK);
- BLOCK_ABSTRACT_ORIGIN (id->block) = fn;
+ BLOCK_ABSTRACT_ORIGIN (id->block) = DECL_ORIGIN (fn);
BLOCK_SOURCE_LOCATION (id->block) = loc;
prepend_lexical_block (gimple_block (stmt), id->block);
}
Index: gcc/tree.c
===================================================================
--- gcc/tree.c (revision 264689)
+++ gcc/tree.c (working copy)
@@ -12124,38 +12124,26 @@ prepare_target_option_nodes_for_pch (voi
TREE_TARGET_GLOBALS (*iter) = NULL;
}
-/* Determine the "ultimate origin" of a block. The block may be an inlined
- instance of an inlined instance of a block which is local to an inline
- function, so we have to trace all of the way back through the origin chain
- to find out what sort of node actually served as the original seed for the
- given block. */
+/* Determine the "ultimate origin" of a block. */
tree
block_ultimate_origin (const_tree block)
{
- tree immediate_origin = BLOCK_ABSTRACT_ORIGIN (block);
+ tree origin = BLOCK_ABSTRACT_ORIGIN (block);
/* BLOCK_ABSTRACT_ORIGIN can point to itself; ignore that if
we're trying to output the abstract instance of this function. */
- if (BLOCK_ABSTRACT (block) && immediate_origin == block)
+ if (BLOCK_ABSTRACT (block) && origin == block)
return NULL_TREE;
- if (immediate_origin == NULL_TREE)
+ if (origin == NULL_TREE)
return NULL_TREE;
else
{
- tree ret_val = immediate_origin;
-
- /* The block's abstract origin chain may not be the *ultimate* origin of
- the block. It could lead to a DECL that has an abstract origin set.
- If so, we want that DECL's abstract origin (which is what DECL_ORIGIN
- will give us if it has one). Note that DECL's abstract origins are
- supposed to be the most distant ancestor (or so decl_ultimate_origin
- claims), so we don't need to loop following the DECL origins. */
- if (DECL_P (ret_val))
- return DECL_ORIGIN (ret_val);
-
- return ret_val;
+ gcc_checking_assert ((DECL_P (origin)
+ && DECL_ORIGIN (origin) == origin)
+ || BLOCK_ORIGIN (origin) == origin);
+ return origin;
}
}