public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Alexandre Oliva <aoliva@redhat.com>
To: Jeff Law <law@redhat.com>
Cc: Richard Biener <richard.guenther@gmail.com>,
	       GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH 6/9] [LVU] Allow final_start_function to skip initial insns
Date: Wed, 01 Nov 2017 18:20:00 -0000	[thread overview]
Message-ID: <ory3np3lsf.fsf@lxoliva.fsfla.org> (raw)
In-Reply-To: <fe4b7bf9-ddd1-4f1e-ad4c-d1f133ce91a5@redhat.com> (Jeff Law's	message of "Mon, 30 Oct 2017 23:10:06 -0600")

On Oct 31, 2017, Jeff Law <law@redhat.com> wrote:

> On 09/30/2017 03:08 AM, Alexandre Oliva wrote:
>> This API change will enable final_start_function() to "consume"
>> initial insns, and choose the first insn to be passed to final().
>> 
>> Many ports call final_start_function() and final() when creating
>> thunks and whatnot, so they needed adjusting.
> So I haven't really followed the discussion until now.  What's driving
> the need to have some insns "consumed" and have more control over what
> tthe first insn passed to final will be?

We want to build debug notes that bind arguments into the initial view
in a function.  That initial view (first .loc note) is emitted in
final_start_function.  So we don't want to process the initial debug
bind insns in final_start_function, and not process them again in final.

In response to richi's objections, I reverted the API exposed by final.c
so that we process the loc notes in final_start_function, and just skip
them in final, so that no changes are required to the various backends,
at a very slight performance penalty as the leading debug insns will be
looked at twice instead of just once, when final is so used by the
backends.

As for uses within final.c, those benefit from an API change internal to
that file, that allows the leading debug insns to be processed just
once.  Here are the relevant snippets from the updated patchset (yet to
be posted):


+/* We want to emit param bindings (before the first begin_stmt) in the
+   initial view, if we are emitting views.  To that end, we may
+   consume initial notes in the function, processing them in
+   final_start_function, before signaling the beginning of the
+   prologue, rather than in final.
+
+   We don't test whether the DECLs are PARM_DECLs: the assumption is
+   that there will be a NOTE_INSN_BEGIN_STMT marker before any
+   non-parameter NOTE_INSN_VAR_LOCATION.  It's ok if the marker is not
+   there, we'll just have more variable locations bound in the initial
+   view, which is consistent with their being bound without any code
+   that would give them a value.  */
+
+static inline bool
+in_initial_view_p (rtx_insn *insn)
+{
+  return !DECL_IGNORED_P (current_function_decl)
+    && debug_variable_location_views
+    && insn && GET_CODE (insn) == NOTE
+    && NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION;
+}
+
 /* Output assembler code for the start of a function,
    and initialize some of the variables in this file
    for the new function.  The label for the function and associated
@@ -1757,12 +1819,15 @@ get_some_local_dynamic_name ()
 
    FIRST is the first insn of the rtl for the function being compiled.
    FILE is the file to write assembler code to.
+   SEEN should be initially set to zero, and it may be updated to
+   indicate we have references to the next location view, that would
+   require us to emit it at the current PC.
    OPTIMIZE_P is nonzero if we should eliminate redundant
      test and compare insns.  */
 
-void
-final_start_function (rtx_insn *first, FILE *file,
-		      int optimize_p ATTRIBUTE_UNUSED)
+static void
+final_start_function_1 (rtx_insn **firstp, FILE *file, int *seen,
+			int optimize_p ATTRIBUTE_UNUSED)
 {
   block_depth = 0;
 
@@ -1780,8 +1845,21 @@ final_start_function (rtx_insn *first, FILE *file,
   if (flag_sanitize & SANITIZE_ADDRESS)
     asan_function_start ();
 
+  rtx_insn *first = *firstp;
+  if (in_initial_view_p (first))
+    {
+      do
+	{
+	  final_scan_insn (first, file, 0, 0, seen);
+	  first = NEXT_INSN (first);
+	}
+      while (in_initial_view_p (first));
+      *firstp = first;
+    }
+
   if (!DECL_IGNORED_P (current_function_decl))
@@ -1856,6 +1934,17 @@ final_start_function (rtx_insn *first, FILE *file,
     profile_after_prologue (file);
 }
 
+/* This is an exported final_start_function_1, callable without SEEN.  */
+
+void
+final_start_function (rtx_insn *first, FILE *file,
+		      int optimize_p ATTRIBUTE_UNUSED)
+{
+  int seen = 0;
+  final_start_function_1 (&first, file, &seen, optimize_p);
+  gcc_assert (seen == 0);
+}
+
 static void
 profile_after_prologue (FILE *file ATTRIBUTE_UNUSED)
 {
@@ -1987,11 +2076,10 @@ dump_basic_block_info (FILE *file, rtx_insn *insn, basic_block *start_to_bb,
 /* Output assembler code for some insns: all or part of a function.
    For description of args, see `final_start_function', above.  */
 
-void
-final (rtx_insn *first, FILE *file, int optimize_p)
+static void
+final_1 (rtx_insn *first, FILE *file, int seen, int optimize_p)
 {
   rtx_insn *insn, *next;
-  int seen = 0;
 
   /* Used for -dA dump.  */
   basic_block *start_to_bb = NULL;
@@ -2074,6 +2164,23 @@ final (rtx_insn *first, FILE *file, int optimize_p)
 	delete_insn (insn);
     }
 }
+
+/* This is an exported final_1, callable without SEEN.  */
+
+void
+final (rtx_insn *first, FILE *file, int optimize_p)
+{
+  /* Those that use the internal final_start_function_1/final_1 API
+     skip initial debug bind notes in final_start_function_1, and pass
+     the modified FIRST to final_1.  But those that use the public
+     final_start_function/final APIs, final_start_function can't move
+     FIRST because it's not passed by reference, so if they were
+     skipped there, skip them again here.  */
+  while (in_initial_view_p (first))
+    first = NEXT_INSN (first);
+
+  final_1 (first, file, 0, optimize_p);
+}
 \f
 const char *
 get_insn_template (int code, rtx insn)


@@ -4525,8 +4650,10 @@ rest_of_handle_final (void)
     variable_tracking_main ();
 
   assemble_start_function (current_function_decl, fnname);
-  final_start_function (get_insns (), asm_out_file, optimize);
-  final (get_insns (), asm_out_file, optimize);
+  rtx_insn *first = get_insns ();
+  int seen = 0;
+  final_start_function_1 (&first, asm_out_file, &seen, optimize);
+  final_1 (first, asm_out_file, seen, optimize);
   if (flag_ipa_ra
       && !lookup_attribute ("noipa", DECL_ATTRIBUTES (current_function_decl)))
     collect_fn_hard_reg_usage ();

-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer

  reply	other threads:[~2017-11-01 18:20 UTC|newest]

Thread overview: 156+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-05 23:21 Introduce Statement Frontier Notes and Location Views Alexandre Oliva
2017-07-13 13:17 ` Alexandre Oliva
2017-08-18 22:49   ` Statement Frontier Notes, Location Views, and Inlined Entry Point Markers (was: Re: Introduce Statement Frontier Notes and Location Views) Alexandre Oliva
2017-08-21 12:35     ` Richard Biener
2017-08-22 22:44       ` Statement Frontier Notes, Location Views, and Inlined Entry Point Markers Alexandre Oliva
2017-08-23 12:33         ` Richard Biener
2017-08-25 16:41           ` Alexandre Oliva
2017-09-07 21:44             ` Joseph Myers
2017-09-21  2:24               ` Alexandre Oliva
2017-08-22 22:44       ` Alexandre Oliva
2017-08-23 12:12         ` Richard Biener
2017-08-25 15:26           ` Alexandre Oliva
2017-08-28 12:41             ` Richard Biener
2017-08-25 19:22           ` Alexandre Oliva
2017-09-01  1:07           ` Alexandre Oliva
2017-09-01  1:15             ` [PATCH 2/9] [SFN] boilerplate changes in preparation to introduce nonbind markers Alexandre Oliva
2017-09-01  1:15             ` [PATCH 5/9] [SFN] Introduce -gstatement-frontiers option, enable debug markers Alexandre Oliva
2017-09-01  1:15             ` [PATCH 1/9] [SFN] adjust RTL insn-walking API Alexandre Oliva
2017-09-01  1:16             ` [PATCH 8/9] [IEPM] Introduce debug hook for inline entry point markers Alexandre Oliva
2017-09-01  1:16             ` [PATCH 3/9] [SFN] not-quite-boilerplate changes in preparation to introduce nonbind markers Alexandre Oliva
2017-09-01  1:16             ` [PATCH 9/9] [IEPM] Introduce inline entry point markers Alexandre Oliva
2017-09-01  1:16             ` [PATCH 4/9] [SFN] introduce statement frontier notes, still disabled Alexandre Oliva
2017-09-01  1:16             ` [PATCH 7/9] [LVU] Introduce location views Alexandre Oliva
2017-09-01  1:16             ` [PATCH 6/9] [LVU] Allow final_start_function to skip initial insns Alexandre Oliva
2017-09-30  9:04             ` Statement Frontier Notes, Location Views, and Inlined Entry Point Markers Alexandre Oliva
2017-09-30  9:09               ` [PATCH 4/9] [SFN] introduce statement frontier notes, still disabled Alexandre Oliva
2017-10-09 13:11                 ` Richard Biener
2017-10-13  7:25                   ` Alexandre Oliva
2017-10-13  9:41                     ` Richard Biener
2017-10-17 22:06                       ` Alexandre Oliva
2017-10-24 18:11                 ` Jason Merrill
2017-11-01 19:14                   ` Alexandre Oliva
2017-11-01 19:49                     ` Jason Merrill
2017-09-30  9:09               ` [PATCH 5/9] [SFN] Introduce -gstatement-frontiers option, enable debug markers Alexandre Oliva
2017-10-09 13:12                 ` Richard Biener
2017-09-30  9:09               ` [PATCH 6/9] [LVU] Allow final_start_function to skip initial insns Alexandre Oliva
2017-10-19 11:07                 ` Richard Biener
2017-10-31  5:10                   ` Jeff Law
2017-10-31  5:23                 ` Jeff Law
2017-11-01 18:20                   ` Alexandre Oliva [this message]
2017-11-02 13:00                     ` Richard Biener
2017-09-30  9:09               ` [PATCH 1/9] [SFN] adjust RTL insn-walking API Alexandre Oliva
2017-10-09 13:24                 ` Richard Biener
2017-09-30  9:09               ` [PATCH 2/9] [SFN] boilerplate changes in preparation to introduce nonbind markers Alexandre Oliva
2017-10-09 13:02                 ` Richard Biener
2017-09-30  9:10               ` [PATCH 8/9] [IEPM] Introduce debug hook for inline entry point markers Alexandre Oliva
2017-10-31  5:58                 ` Jeff Law
2017-09-30  9:10               ` [PATCH 9/9] [IEPM] Introduce " Alexandre Oliva
2017-10-31  6:22                 ` Jeff Law
2017-11-01 18:36                   ` Alexandre Oliva
2017-11-09 16:30                     ` Jeff Law
2017-11-10  2:31                       ` Alexandre Oliva
2017-09-30  9:10               ` [PATCH 7/9] [LVU] Introduce location views Alexandre Oliva
2017-09-30  9:10               ` [PATCH 3/9] [SFN] not-quite-boilerplate changes in preparation to introduce nonbind markers Alexandre Oliva
2017-10-09 13:07                 ` Richard Biener
2017-11-10  2:36               ` SFN+LVU+IEPM v4 (was: Re: Statement Frontier Notes, Location Views, and Inlined Entry Point Markers) Alexandre Oliva
2017-11-10  2:36                 ` [SFN+LVU+IEPM v4 4/9] [SFN] stabilize find_bb_boundaries Alexandre Oliva
2017-12-07 22:46                   ` Jeff Law
2017-12-12  2:38                     ` Alexandre Oliva
2017-11-10  2:36                 ` [SFN+LVU+IEPM v4 3/9] [SFN] not-quite-boilerplate changes in preparation to introduce nonbind markers Alexandre Oliva
2017-12-07 22:44                   ` Jeff Law
2017-12-12  2:31                     ` Alexandre Oliva
2017-11-10  2:36                 ` [SFN+LVU+IEPM v4 6/9] [SFN] Introduce -gstatement-frontiers option, enable debug markers Alexandre Oliva
2017-12-07 22:49                   ` Jeff Law
2017-12-12  2:42                     ` Alexandre Oliva
2017-12-12  9:16                       ` Christophe Lyon
2017-12-13  4:22                         ` Alexandre Oliva
2018-01-07 17:48                       ` H.J. Lu
2017-12-27  8:00                   ` [nvptx, committed] Disable -gstatement-frontiers for nvptx Tom de Vries
2017-12-29  4:12                     ` Alexandre Oliva
2017-12-29 11:42                       ` Tom de Vries
2017-12-31 20:05                         ` Alexandre Oliva
2018-01-11 10:12                           ` Tom de Vries
2017-11-10  2:36                 ` [SFN+LVU+IEPM v4 2/9] [SFN] boilerplate changes in preparation to introduce nonbind markers Alexandre Oliva
2017-12-07 22:27                   ` Jeff Law
2017-12-12  2:55                     ` Alexandre Oliva
2017-11-10  2:36                 ` [SFN+LVU+IEPM v4 1/9] [SFN] adjust RTL insn-walking API Alexandre Oliva
2017-12-07 22:25                   ` Jeff Law
2017-12-12  3:10                     ` Alexandre Oliva
2017-12-14 11:55                       ` Alexandre Oliva
2017-12-14 12:07                         ` Jakub Jelinek
2017-12-14 18:25                           ` Alexandre Oliva
2017-11-10  2:36                 ` [SFN+LVU+IEPM v4 5/9] [SFN] introduce statement frontier notes, still disabled Alexandre Oliva
2017-12-07 23:59                   ` Jeff Law
2017-12-12  2:41                     ` Alexandre Oliva
2017-11-10  2:37                 ` [SFN+LVU+IEPM v4 8/9] [IEPM] Introduce debug hook for inline entry point markers Alexandre Oliva
2017-12-07 22:51                   ` Jeff Law
2017-12-12  2:44                     ` Alexandre Oliva
2017-11-10  5:05                 ` [SFN+LVU+IEPM v4 7/9] [LVU] Introduce location views Alexandre Oliva
2017-11-13 10:18                   ` Richard Biener
2017-11-15  3:59                     ` Alexandre Oliva
2017-12-11 23:12                   ` Jeff Law
2017-12-12  2:52                     ` Alexandre Oliva
2018-01-24 17:36                       ` Jakub Jelinek
2018-01-25 20:19                         ` Alexandre Oliva
2018-01-26 14:58                           ` Jakub Jelinek
2018-01-30 18:40                             ` Alexandre Oliva
2018-01-30 22:11                               ` Richard Sandiford
2018-02-07  4:14                                 ` Alexandre Oliva
2018-02-07  7:43                           ` Alexandre Oliva
2018-02-06 21:13                       ` Jason Merrill
2018-02-07  4:02                         ` Alexandre Oliva
2018-02-07 19:23                           ` Jason Merrill
2018-02-08 12:56                             ` Alexandre Oliva
2018-02-08 16:05                               ` Jason Merrill
2018-02-09  3:49                                 ` Alexandre Oliva
2018-02-07  7:35                         ` Alexandre Oliva
2018-02-07  7:36                         ` Alexandre Oliva
2018-02-08 19:58                           ` Jason Merrill
2018-02-09  3:20                             ` Alexandre Oliva
2018-02-11 19:04                               ` Andreas Schwab
2018-02-11 20:47                               ` Andreas Schwab
2018-02-12  7:46                                 ` Alexandre Oliva
2018-02-12  7:49                                 ` Alexandre Oliva
2018-02-12 10:11                                   ` Andreas Schwab
2018-02-13  5:47                                     ` Alexandre Oliva
2018-02-14  9:23                                       ` Andreas Schwab
2017-11-10  5:29                 ` [SFN+LVU+IEPM v4 9/9] [IEPM] Introduce inline entry point markers Alexandre Oliva
2017-12-12  2:54                   ` Alexandre Oliva
2017-12-21  5:18                     ` Jeff Law
2018-01-24  7:11                       ` Alexandre Oliva
2018-01-24 17:40                     ` Jakub Jelinek
2018-01-25 20:14                       ` Alexandre Oliva
2018-02-09  3:21                         ` Alexandre Oliva
2018-02-09  3:53                           ` Alan Modra
2018-02-09  4:13                             ` Jeff Law
2018-02-09 10:35                               ` Alexandre Oliva
2018-02-09 12:10                                 ` Alan Modra
2018-02-09 15:09                                 ` Jeff Law
2018-02-09 22:52                                   ` Joseph Myers
2018-02-10  1:36                                     ` Joseph Myers
2018-02-10 12:35                                       ` Alexandre Oliva
2018-02-10 18:19                                         ` Jeff Law
2018-02-11 15:29                                           ` Alexandre Oliva
2018-02-09 21:01                               ` Alexandre Oliva
2018-02-09 23:49                                 ` Jakub Jelinek
2018-02-10  0:56                                   ` Alexandre Oliva
2018-02-12  8:08                                     ` Alexandre Oliva
2018-02-13 13:52                                       ` Alexandre Oliva
2018-02-13 16:15                                         ` Jeff Law
2018-02-15 15:23                                         ` Szabolcs Nagy
2018-02-21 10:12                                           ` Alexandre Oliva
2018-02-21 12:08                                             ` Uros Bizjak
2018-02-22 15:22                                             ` Szabolcs Nagy
2018-02-28  6:17                                             ` Alexandre Oliva
2018-03-09  9:49                                               ` Bin.Cheng
2018-03-09  9:55                                                 ` Ramana Radhakrishnan
2018-03-09 11:35                                                 ` Jakub Jelinek
2018-03-07 19:43                                             ` Jeff Law
2018-02-10  4:39                                 ` Alexandre Oliva
2018-02-10  6:35                                   ` Jeff Law
2018-02-10 13:05                                     ` Alexandre Oliva
2018-02-10 16:36                                       ` Jeff Law
2018-02-21 10:33                       ` Alexandre Oliva
2018-02-26 12:47                         ` Richard Biener
2017-11-10 21:31                 ` SFN+LVU+IEPM v4 Alexandre Oliva

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ory3np3lsf.fsf@lxoliva.fsfla.org \
    --to=aoliva@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=law@redhat.com \
    --cc=richard.guenther@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).