diff mbox series

[1/n] Make BLOCK_ABSTRACT_ORIGIN "ultimate"

Message ID alpine.LSU.2.20.1809281049330.16707@zhemvz.fhfr.qr
State New
Headers show
Series [1/n] Make BLOCK_ABSTRACT_ORIGIN "ultimate" | expand

Commit Message

Richard Biener Sept. 28, 2018, 8:52 a.m. UTC
The following is step number one to make BLOCK_ABSTRACT_ORIGIN behave
similar to DECL_ABSTRACT_ORIGIN, namely point to the ultimate origin.
I've audited all uses and they all are interested in the ultimate
origin only (well, most do not bother to look at DECL_ORIGIN of the
FUNCTION_DECL they eventually run into).

Bootstrap and regtest is in progress on x86_64-unknown-linux-gnu,
if you have any objection speak up quickly ;)

Further experiment will see whether I can make it really ultimate
(it's a single place where for the inline BLOCK we have to assign
DECL_ORIGIN (fn) instead of fn).

Richard.

2018-09-28  Richard Biener  <rguenther@suse.de>

	* tree.h (BLOCK_ORIGIN): New.
	* omp-expand.c (grid_expand_target_grid_body): Assign
	BLOCK_ORIGIN to BLOCK_ABSTRACT_ORIGIN.
	* tree-inline.c (remap_block): Likewise.

	* auto-profile.c (get_function_decl_from_block): Simplify
	by eliding the BLOCK_ABSTRACT_ORIGIN chasing.
	* langhooks.c (lhd_print_error_function): Likewise.
	* optinfo-emit-json.cc (optrecord_json_writer::inlining_chain_to):
	Likewise.
	* tree-ssa-live.c (remove_unused_scope_block_p): Likewise.
	* tree.c (block_nonartificial_location): Likewise.
	(block_ultimate_origin): Likewise.
	* tree-pretty-print.c (percent_K_format): Likewise.  Remove
	no longer needed LTO case.

	cp/
	* error.c (cp_print_error_function): Simplify by eliding
	the BLOCK_ABSTRACT_ORIGIN chasing.
diff mbox series

Patch

Index: gcc/auto-profile.c
===================================================================
--- gcc/auto-profile.c	(revision 264686)
+++ gcc/auto-profile.c	(working copy)
@@ -354,17 +354,10 @@  get_combined_location (location_t loc, t
 static tree
 get_function_decl_from_block (tree block)
 {
-  tree decl;
-
-  if (LOCATION_LOCUS (BLOCK_SOURCE_LOCATION (block)) == UNKNOWN_LOCATION)
+  if (!inlined_function_outer_scope_p (block))
     return NULL_TREE;
 
-  for (decl = BLOCK_ABSTRACT_ORIGIN (block);
-       decl && (TREE_CODE (decl) == BLOCK);
-       decl = BLOCK_ABSTRACT_ORIGIN (decl))
-    if (TREE_CODE (decl) == FUNCTION_DECL)
-      break;
-  return decl;
+  return BLOCK_ABSTRACT_ORIGIN (block);
 }
 
 /* Store inline stack for STMT in STACK.  */
Index: gcc/cp/error.c
===================================================================
--- gcc/cp/error.c	(revision 264686)
+++ gcc/cp/error.c	(working copy)
@@ -3339,10 +3339,6 @@  cp_print_error_function (diagnostic_cont
 	  if (abstract_origin)
 	    {
 	      ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
-	      while (TREE_CODE (ao) == BLOCK
-		     && BLOCK_ABSTRACT_ORIGIN (ao)
-		     && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
-		ao = BLOCK_ABSTRACT_ORIGIN (ao);
 	      gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
 	      fndecl = ao;
 	    }
@@ -3364,12 +3360,6 @@  cp_print_error_function (diagnostic_cont
 		     && BLOCK_ABSTRACT_ORIGIN (block))
 		{
 		  ao = BLOCK_ABSTRACT_ORIGIN (block);
-
-		  while (TREE_CODE (ao) == BLOCK
-			 && BLOCK_ABSTRACT_ORIGIN (ao)
-			 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
-		    ao = BLOCK_ABSTRACT_ORIGIN (ao);
-
 		  if (TREE_CODE (ao) == FUNCTION_DECL)
 		    {
 		      fndecl = ao;
Index: gcc/langhooks.c
===================================================================
--- gcc/langhooks.c	(revision 264686)
+++ gcc/langhooks.c	(working copy)
@@ -385,10 +385,6 @@  lhd_print_error_function (diagnostic_con
 	  if (abstract_origin)
 	    {
 	      ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
-	      while (TREE_CODE (ao) == BLOCK
-		     && BLOCK_ABSTRACT_ORIGIN (ao)
-		     && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
-		ao = BLOCK_ABSTRACT_ORIGIN (ao);
 	      gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
 	      fndecl = ao;
 	    }
@@ -416,12 +412,6 @@  lhd_print_error_function (diagnostic_con
 		     && BLOCK_ABSTRACT_ORIGIN (block))
 		{
 		  ao = BLOCK_ABSTRACT_ORIGIN (block);
-
-		  while (TREE_CODE (ao) == BLOCK
-			 && BLOCK_ABSTRACT_ORIGIN (ao)
-			 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
-		    ao = BLOCK_ABSTRACT_ORIGIN (ao);
-
 		  if (TREE_CODE (ao) == FUNCTION_DECL)
 		    {
 		      fndecl = ao;
Index: gcc/omp-expand.c
===================================================================
--- gcc/omp-expand.c	(revision 264686)
+++ gcc/omp-expand.c	(working copy)
@@ -7629,7 +7629,7 @@  grid_expand_target_grid_body (struct omp
   SET_DECL_ASSEMBLER_NAME (kern_fndecl, DECL_NAME (kern_fndecl));
   tree tgtblock = gimple_block (tgt_stmt);
   tree fniniblock = make_node (BLOCK);
-  BLOCK_ABSTRACT_ORIGIN (fniniblock) = tgtblock;
+  BLOCK_ABSTRACT_ORIGIN (fniniblock) = BLOCK_ORIGIN (tgtblock);
   BLOCK_SOURCE_LOCATION (fniniblock) = BLOCK_SOURCE_LOCATION (tgtblock);
   BLOCK_SOURCE_END_LOCATION (fniniblock) = BLOCK_SOURCE_END_LOCATION (tgtblock);
   BLOCK_SUPERCONTEXT (fniniblock) = kern_fndecl;
Index: gcc/optinfo-emit-json.cc
===================================================================
--- gcc/optinfo-emit-json.cc	(revision 264686)
+++ gcc/optinfo-emit-json.cc	(working copy)
@@ -299,12 +299,6 @@  optrecord_json_writer::inlining_chain_to
 	     && BLOCK_ABSTRACT_ORIGIN (block))
 	{
 	  tree ao = BLOCK_ABSTRACT_ORIGIN (block);
-
-	  while (TREE_CODE (ao) == BLOCK
-		 && BLOCK_ABSTRACT_ORIGIN (ao)
-		 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
-	    ao = BLOCK_ABSTRACT_ORIGIN (ao);
-
 	  if (TREE_CODE (ao) == FUNCTION_DECL)
 	    {
 	      fndecl = ao;
Index: gcc/tree-inline.c
===================================================================
--- gcc/tree-inline.c	(revision 264686)
+++ gcc/tree-inline.c	(working copy)
@@ -704,7 +704,7 @@  remap_block (tree *block, copy_body_data
   old_block = *block;
   new_block = make_node (BLOCK);
   TREE_USED (new_block) = TREE_USED (old_block);
-  BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
+  BLOCK_ABSTRACT_ORIGIN (new_block) = BLOCK_ORIGIN (old_block);
   BLOCK_SOURCE_LOCATION (new_block) = BLOCK_SOURCE_LOCATION (old_block);
   BLOCK_NONLOCALIZED_VARS (new_block)
     = vec_safe_copy (BLOCK_NONLOCALIZED_VARS (old_block));
Index: gcc/tree-pretty-print.c
===================================================================
--- gcc/tree-pretty-print.c	(revision 264686)
+++ gcc/tree-pretty-print.c	(working copy)
@@ -3976,35 +3976,11 @@  percent_K_format (text_info *text, locat
   gcc_assert (pp_ti_abstract_origin (text) != NULL);
   *pp_ti_abstract_origin (text) = NULL;
 
-  if (in_lto_p)
-    {
-      /* ???  LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
-         representing the outermost block of an inlined function.
-	 So walk the BLOCK tree until we hit such a scope.  */
-      while (block
-	     && TREE_CODE (block) == BLOCK)
-	{
-	  if (inlined_function_outer_scope_p (block))
-	    {
-	      *pp_ti_abstract_origin (text) = block;
-	      break;
-	    }
-	  block = BLOCK_SUPERCONTEXT (block);
-	}
-      return;
-    }
-
   while (block
 	 && TREE_CODE (block) == BLOCK
 	 && BLOCK_ABSTRACT_ORIGIN (block))
     {
       tree ao = BLOCK_ABSTRACT_ORIGIN (block);
-
-      while (TREE_CODE (ao) == BLOCK
-	     && BLOCK_ABSTRACT_ORIGIN (ao)
-	     && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
-	ao = BLOCK_ABSTRACT_ORIGIN (ao);
-
       if (TREE_CODE (ao) == FUNCTION_DECL)
 	{
 	  *pp_ti_abstract_origin (text) = block;
Index: gcc/tree-ssa-live.c
===================================================================
--- gcc/tree-ssa-live.c	(revision 264686)
+++ gcc/tree-ssa-live.c	(working copy)
@@ -561,12 +561,7 @@  remove_unused_scope_block_p (tree scope,
 	  will not be emitted properly.  */
        if (inlined_function_outer_scope_p (scope))
 	 {
-	   tree ao = scope;
-
-	   while (ao
-		  && TREE_CODE (ao) == BLOCK
-		  && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
-	     ao = BLOCK_ABSTRACT_ORIGIN (ao);
+	   tree ao = BLOCK_ORIGIN (scope);
 	   if (ao
 	       && TREE_CODE (ao) == FUNCTION_DECL
 	       && DECL_DECLARED_INLINE_P (ao)
Index: gcc/tree.c
===================================================================
--- gcc/tree.c	(revision 264686)
+++ gcc/tree.c	(working copy)
@@ -11964,12 +11964,6 @@  block_nonartificial_location (tree block
 	 && BLOCK_ABSTRACT_ORIGIN (block))
     {
       tree ao = BLOCK_ABSTRACT_ORIGIN (block);
-
-      while (TREE_CODE (ao) == BLOCK
-	     && BLOCK_ABSTRACT_ORIGIN (ao)
-	     && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
-	ao = BLOCK_ABSTRACT_ORIGIN (ao);
-
       if (TREE_CODE (ao) == FUNCTION_DECL)
 	{
 	  /* If AO is an artificial inline, point RET to the
@@ -12150,16 +12144,7 @@  block_ultimate_origin (const_tree block)
     return NULL_TREE;
   else
     {
-      tree ret_val;
-      tree lookahead = immediate_origin;
-
-      do
-	{
-	  ret_val = lookahead;
-	  lookahead = (TREE_CODE (ret_val) == BLOCK
-		       ? BLOCK_ABSTRACT_ORIGIN (ret_val) : NULL);
-	}
-      while (lookahead != NULL && lookahead != ret_val);
+      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.
Index: gcc/tree.h
===================================================================
--- gcc/tree.h	(revision 264686)
+++ gcc/tree.h	(working copy)
@@ -1789,6 +1789,8 @@  extern tree maybe_wrap_with_location (tr
 #define BLOCK_SUPERCONTEXT(NODE) (BLOCK_CHECK (NODE)->block.supercontext)
 #define BLOCK_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.chain)
 #define BLOCK_ABSTRACT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.abstract_origin)
+#define BLOCK_ORIGIN(NODE) \
+  (BLOCK_ABSTRACT_ORIGIN(NODE) ? BLOCK_ABSTRACT_ORIGIN(NODE) : (NODE))
 #define BLOCK_ABSTRACT(NODE) (BLOCK_CHECK (NODE)->block.abstract_flag)
 #define BLOCK_DIE(NODE) (BLOCK_CHECK (NODE)->block.die)