Re: [PATCH] Improve target pass registration

2016-10-09 Thread Jakub Jelinek
On Sun, Oct 09, 2016 at 10:51:10PM +0200, Eric Botcazou wrote:
> > This breaks bootstrap on Solaris with nawk:
> > 
> > nawk -f /homes/botcazou/gcc-head/src/gcc/gen-pass-instances.awk \
> >   /homes/botcazou/gcc-head/src/gcc/passes.def  > pass-instances.def
> > nawk: you can only delete array[element] at source line 196
> >  context is
> >   delete >>>  pass_counts; <<<
> > nawk: syntax error at source line 196
> > nawk: illegal statement at source line 196
> > make[3]: *** [pass-instances.def] Error 2
> 
> Here's what I have installed as obvious after testing on Linux and Solaris.
> 
> 
> 2016-10-09  Eric Botcazou  
> 
>   * gen-pass-instances.awk: Remove GNUism.

Thanks.

Jakub


Re: [PATCH] Improve target pass registration

2016-10-09 Thread Eric Botcazou
> This breaks bootstrap on Solaris with nawk:
> 
> nawk -f /homes/botcazou/gcc-head/src/gcc/gen-pass-instances.awk \
>   /homes/botcazou/gcc-head/src/gcc/passes.def  > pass-instances.def
> nawk: you can only delete array[element] at source line 196
>  context is
>   delete >>>  pass_counts; <<<
> nawk: syntax error at source line 196
> nawk: illegal statement at source line 196
> make[3]: *** [pass-instances.def] Error 2

Here's what I have installed as obvious after testing on Linux and Solaris.


2016-10-09  Eric Botcazou  

* gen-pass-instances.awk: Remove GNUism.

-- 
Eric BotcazouIndex: gen-pass-instances.awk
===
--- gen-pass-instances.awk	(revision 240888)
+++ gen-pass-instances.awk	(working copy)
@@ -193,7 +193,6 @@ function replace_pass(line, fnname,			nu
 }
 
 END {
-  delete pass_counts;
   for (i = 1; i < lineno; i++)
 {
   ret = parse_line(lines[i], "NEXT_PASS");
@@ -203,13 +202,13 @@ END {
 	  pass_name = args[1];
 	  with_arg = args[2];
 
-	  # Set pass_counts
-	  if (pass_name in pass_counts)
-	pass_counts[pass_name]++;
+	  # Set pass_final_counts
+	  if (pass_name in pass_final_counts)
+	pass_final_counts[pass_name]++;
 	  else
-	pass_counts[pass_name] = 1;
+	pass_final_counts[pass_name] = 1;
 
-	  pass_num = pass_counts[pass_name];
+	  pass_num = pass_final_counts[pass_name];
 
 	  # Print call expression with extra pass_num argument
 	  printf "%s", prefix;


Re: [PATCH] Improve target pass registration

2016-10-09 Thread Eric Botcazou
> Here is updated patch, bootstrapped/regtested on x86_64-linux and
> i686-linux.  I'll still wait a few days before committing to see if somebody
> likes to comment on the awk implementation of the script.
> 
> 2016-10-05  Jakub Jelinek  
> 
>   * gen-pass-instances.awk: Rewritten.

This breaks bootstrap on Solaris with nawk:

nawk -f /homes/botcazou/gcc-head/src/gcc/gen-pass-instances.awk \
  /homes/botcazou/gcc-head/src/gcc/passes.def  > pass-instances.def
nawk: you can only delete array[element] at source line 196
 context is
  delete >>>  pass_counts; <<< 
nawk: syntax error at source line 196
nawk: illegal statement at source line 196
make[3]: *** [pass-instances.def] Error 2

-- 
Eric Botcazou


Re: [PATCH] Improve target pass registration

2016-10-05 Thread Jakub Jelinek
On Tue, Oct 04, 2016 at 04:54:34PM +0200, Jakub Jelinek wrote:
> > Typo in the comment: duplicated 'after'.
> 
> Will fix.

...

Here is updated patch, bootstrapped/regtested on x86_64-linux and
i686-linux.  I'll still wait a few days before committing to see if somebody
likes to comment on the awk implementation of the script.

2016-10-05  Jakub Jelinek  

* gen-pass-instances.awk: Rewritten.
* Makefile.in (pass-instances.def): Depend on $(PASSES_EXTRA), pass
$(PASSES_EXTRA) after passes.def to the script.
* config/i386/t-i386 (PASSES_EXTRA): Add i386-passes.def.
* config/i386/i386-passes.def: New file.
* config/i386/i386-protos.h (make_pass_insert_vzeroupper,
make_pass_stv): Declare.
* config/i386/i386.c (pass_stv::pass_stv): Initialize timode_p to
false.
(pass_stv::gate): Depending on timode_p member require TARGET_64BIT
or !TARGET_64BIT.
(pass_stv::clone, pass_stv::set_pass_param): New methods.
(pass_stv::timode_p): New non-static data member.
(ix86_option_override): Don't register passes here.

--- gcc/gen-pass-instances.awk.jj   2016-09-29 22:53:10.264776158 +0200
+++ gcc/gen-pass-instances.awk  2016-09-30 13:22:53.745373889 +0200
@@ -17,6 +17,8 @@
 # This Awk script takes passes.def and writes pass-instances.def,
 # counting the instances of each kind of pass, adding an instance number
 # to everywhere that NEXT_PASS is used.
+# Also handle INSERT_PASS_AFTER, INSERT_PASS_BEFORE and REPLACE_PASS
+# directives.
 #
 # For example, the single-instanced pass:
 # NEXT_PASS (pass_warn_unused_result);
@@ -30,81 +32,201 @@
 # through:
 #   NEXT_PASS (pass_copy_prop, 8);
 # (currently there are 8 instances of that pass)
+#
+# INSERT_PASS_AFTER (pass_copy_prop, 1, pass_stv);
+# will insert
+# NEXT_PASS (pass_stv, 1);
+# immediately after the NEXT_PASS (pass_copy_prop, 1) line,
+# similarly INSERT_PASS_BEFORE inserts immediately before that line.
+# REPLACE_PASS (pass_copy_prop, 1, pass_stv, true);
+# will replace NEXT_PASS (pass_copy_prop, 1) line with
+# NEXT_PASS (pass_stv, 1, true);
+# line and renumber all higher pass_copy_prop instances if any.
 
 # Usage: awk -f gen-pass-instances.awk passes.def
 
 BEGIN {
-   print "/* This file is auto-generated by gen-pass-instances.awk";
-   print "   from passes.def.  */";
+  print "/* This file is auto-generated by gen-pass-instances.awk";
+  print "   from passes.def.  */";
+  lineno = 1;
 }
 
-function handle_line()
+function parse_line(line, fnname,  len_of_call, len_of_start,
+   len_of_open, len_of_close,
+   len_of_args, args_start_at,
+   args_str, len_of_prefix,
+   call_starts_at,
+   postfix_starts_at)
 {
-   line = $0;
+  # Find call expression.
+  call_starts_at = match(line, fnname " \\(.+\\)");
+  if (call_starts_at == 0)
+return 0;
+
+  # Length of the call expression.
+  len_of_call = RLENGTH;
+
+  len_of_start = length(fnname " (");
+  len_of_open = length("(");
+  len_of_close = length(")");
+
+  # Find arguments
+  len_of_args = len_of_call - (len_of_start + len_of_close);
+  args_start_at = call_starts_at + len_of_start;
+  args_str = substr(line, args_start_at, len_of_args);
+  split(args_str, args, ",");
+
+  # Find call expression prefix
+  len_of_prefix = call_starts_at - 1;
+  prefix = substr(line, 1, len_of_prefix);
+
+  # Find call expression postfix
+  postfix_starts_at = call_starts_at + len_of_call;
+  postfix = substr(line, postfix_starts_at);
+  return 1;
+}
 
-   # Find call expression.
-   call_starts_at = match(line, /NEXT_PASS \(.+\)/);
-   if (call_starts_at == 0)
-   {
-   print line;
-   return;
-   }
+function adjust_linenos(above, increment,  p, i)
+{
+  for (p in pass_lines)
+if (pass_lines[p] >= above)
+  pass_lines[p] += pass_lines[p];
+  if (increment > 0)
+for (i = lineno - 1; i >= above; i--)
+  lines[i + increment] = lines[i];
+  else
+for (i = above; i < lineno; i++)
+  lines[i + increment] = lines[i];
+  lineno += increment;
+}
 
-   # Length of the call expression.
-   len_of_call = RLENGTH;
+function insert_remove_pass(line, fnname)
+{
+  parse_line($0, fnname);
+  pass_name = args[1];
+  if (pass_name == "PASS")
+return 1;
+  pass_num = args[2] + 0;
+  new_line = prefix "NEXT_PASS (" args[3];
+  if (args[4])
+new_line = new_line ", " args[4];
+  new_line = new_line ")" postfix;
+  if (!pass_lines[pass_name, pass_num])
+{
+  print "ERROR: Can't locate instance of the pass mentioned in " fnname;
+  return 1;
+}
+  return 0;
+}
 
-   len_of_start = length("NEXT_PASS (");
-   len_of_open = length("(");
-   len_of_close = length(")");
-
-   # Find 

Re: [PATCH] Improve target pass registration

2016-10-04 Thread Jakub Jelinek
On Tue, Oct 04, 2016 at 05:48:15PM +0300, Alexander Monakov wrote:
> On Fri, 30 Sep 2016, Jakub Jelinek wrote:
> > This patch allows backends to provide their *-passes.def file with
> > instructions how to ammend passes.def, which then can be inspected in
> > pass-instances.def the script generates.
> 
> A few minor comments:
> 
> > --- gcc/gen-pass-instances.awk.jj   2016-09-29 22:53:10.264776158 +0200
> > +++ gcc/gen-pass-instances.awk  2016-09-30 13:22:53.745373889 +0200
> > @@ -30,81 +32,201 @@
> >  # through:
> >  #   NEXT_PASS (pass_copy_prop, 8);
> >  # (currently there are 8 instances of that pass)
> > +#
> > +# INSERT_PASS_AFTER (pass_copy_prop, 1, pass_stv);
> 
> I think it would be nice to mention that a 4th argument can be supplied and if
> so, it will be passed to the pass at run time (although I see the existing
> comment doesn't mention that either).

Yeah, I've followed the earlier comments.  The 4th argument is quite rare
thing.

> > +# will insert
> > +# NEXT_PASS (pass_stv, 1);
> > +# after immediately after the NEXT_PASS (pass_copy_prop, 1) line,
> 
> Typo in the comment: duplicated 'after'.

Will fix.

> > --- gcc/config/i386/i386-passes.def.jj  2016-09-30 12:54:29.959793738 
> > +0200
> > +++ gcc/config/i386/i386-passes.def 2016-09-30 14:01:31.237200032 +0200
> > @@ -0,0 +1,31 @@
> [snip]
> > +
> > +/*
> > + Macros that should be defined used in this file:
> > +   INSERT_PASS_AFTER (PASS, INSTANCE, TGT_PASS)
> > +   INSERT_PASS_BEFORE (PASS, INSTANCE, TGT_PASS)
> > +   REPLACE_PASS (PASS, INSTANCE, TGT_PASS)
> > + */
> 
> REPLACE_PASS isn't actually used in this file.

I guess it should be
  Macros that can be used in this file:

> > --- gcc/config/i386/i386-protos.h.jj2016-06-24 12:59:29.0 
> > +0200
> > +++ gcc/config/i386/i386-protos.h   2016-09-30 14:00:54.759659671 +0200
> 
> > @@ -4105,13 +4105,15 @@ class pass_stv : public rtl_opt_pass
> [snip]
> >  
> >/* opt_pass methods: */
> >virtual bool gate (function *)
> >  {
> > -  return TARGET_STV && TARGET_SSE2 && optimize > 1;
> > +  return (timode_p ^ (TARGET_64BIT == 0))
> > +&& TARGET_STV && TARGET_SSE2 && optimize > 1;
> 
> The first line could also be 'timode_p == !!TARGET_64BIT'.

Yeah, that is probably more readable.

> Also I believe this needs parens around the whole expression.

Ok, will do.

Jakub


Re: [PATCH] Improve target pass registration

2016-10-04 Thread Alexander Monakov
On Fri, 30 Sep 2016, Jakub Jelinek wrote:
> This patch allows backends to provide their *-passes.def file with
> instructions how to ammend passes.def, which then can be inspected in
> pass-instances.def the script generates.

A few minor comments:

> --- gcc/gen-pass-instances.awk.jj 2016-09-29 22:53:10.264776158 +0200
> +++ gcc/gen-pass-instances.awk2016-09-30 13:22:53.745373889 +0200
> @@ -30,81 +32,201 @@
>  # through:
>  #   NEXT_PASS (pass_copy_prop, 8);
>  # (currently there are 8 instances of that pass)
> +#
> +# INSERT_PASS_AFTER (pass_copy_prop, 1, pass_stv);

I think it would be nice to mention that a 4th argument can be supplied and if
so, it will be passed to the pass at run time (although I see the existing
comment doesn't mention that either).

> +# will insert
> +# NEXT_PASS (pass_stv, 1);
> +# after immediately after the NEXT_PASS (pass_copy_prop, 1) line,

Typo in the comment: duplicated 'after'.

> --- gcc/config/i386/i386-passes.def.jj2016-09-30 12:54:29.959793738 
> +0200
> +++ gcc/config/i386/i386-passes.def   2016-09-30 14:01:31.237200032 +0200
> @@ -0,0 +1,31 @@
[snip]
> +
> +/*
> + Macros that should be defined used in this file:
> +   INSERT_PASS_AFTER (PASS, INSTANCE, TGT_PASS)
> +   INSERT_PASS_BEFORE (PASS, INSTANCE, TGT_PASS)
> +   REPLACE_PASS (PASS, INSTANCE, TGT_PASS)
> + */

REPLACE_PASS isn't actually used in this file.

> --- gcc/config/i386/i386-protos.h.jj  2016-06-24 12:59:29.0 +0200
> +++ gcc/config/i386/i386-protos.h 2016-09-30 14:00:54.759659671 +0200

> @@ -4105,13 +4105,15 @@ class pass_stv : public rtl_opt_pass
[snip]
>  
>/* opt_pass methods: */
>virtual bool gate (function *)
>  {
> -  return TARGET_STV && TARGET_SSE2 && optimize > 1;
> +  return (timode_p ^ (TARGET_64BIT == 0))
> +  && TARGET_STV && TARGET_SSE2 && optimize > 1;

The first line could also be 'timode_p == !!TARGET_64BIT'.
Also I believe this needs parens around the whole expression.

Alexander


Re: [PATCH] Improve target pass registration

2016-10-04 Thread Uros Bizjak
On Tue, Oct 4, 2016 at 10:53 AM, Richard Biener  wrote:
> On Fri, 30 Sep 2016, Jakub Jelinek wrote:
>
>> Hi!
>>
>> As discussed earlier on IRC, the current way of registering target specific
>> passes has various issues:
>> 1) for -da, the target specific dump files appear last, regardless on where
>>exactly they appear in the pass queue, so one has to look up the sources
>>or remember where the pass is invoked if e.g. looking for when certain
>>change in the IL first appears
>> 2) -fdump-rtl-stv-details and similar options don't work, the option
>>processing happens before the passes are registered
>>
>> This patch allows backends to provide their *-passes.def file with
>> instructions how to ammend passes.def, which then can be inspected in
>> pass-instances.def the script generates.
>>
>> I've only converted the i386 backend so far, other maintainers can easily
>> convert their backends later on.
>>
>> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> I'm fine with the approach but I can't really review the awk parts
> so I'd appreciate a second eye on them.
>
> Thus, ok from the overall view, leaving to Uros and maybe some awk
> expert (if none appears within a reasonable amount of time consider
> this as approval anyway).

I thought I have already approved what little is of x86 changes. But
as you said, most of the changes are target-independent awk scripts.

That said, the change is surely beneficial, I've been annoyed by dump
file order for quite some time...

Thanks,
Uros.

>
> Thanks,
> Richard.
>
>> 2016-09-30  Jakub Jelinek  
>>
>>   * gen-pass-instances.awk: Rewritten.
>>   * Makefile.in (pass-instances.def): Depend on $(PASSES_EXTRA), pass
>>   $(PASSES_EXTRA) after passes.def to the script.
>>   * config/i386/t-i386 (PASSES_EXTRA): Add i386-passes.def.
>>   * config/i386/i386-passes.def: New file.
>>   * config/i386/i386-protos.h (make_pass_insert_vzeroupper,
>>   make_pass_stv): Declare.
>>   * config/i386/i386.c (pass_stv::pass_stv): Initialize timode_p to
>>   false.
>>   (pass_stv::gate): Depending on timode_p member require TARGET_64BIT
>>   or !TARGET_64BIT.
>>   (pass_stv::clone, pass_stv::set_pass_param): New methods.
>>   (pass_stv::timode_p): New non-static data member.
>>   (ix86_option_override): Don't register passes here.
>>
>> --- gcc/gen-pass-instances.awk.jj 2016-09-29 22:53:10.264776158 +0200
>> +++ gcc/gen-pass-instances.awk2016-09-30 13:22:53.745373889 +0200
>> @@ -17,6 +17,8 @@
>>  # This Awk script takes passes.def and writes pass-instances.def,
>>  # counting the instances of each kind of pass, adding an instance number
>>  # to everywhere that NEXT_PASS is used.
>> +# Also handle INSERT_PASS_AFTER, INSERT_PASS_BEFORE and REPLACE_PASS
>> +# directives.
>>  #
>>  # For example, the single-instanced pass:
>>  # NEXT_PASS (pass_warn_unused_result);
>> @@ -30,81 +32,201 @@
>>  # through:
>>  #   NEXT_PASS (pass_copy_prop, 8);
>>  # (currently there are 8 instances of that pass)
>> +#
>> +# INSERT_PASS_AFTER (pass_copy_prop, 1, pass_stv);
>> +# will insert
>> +# NEXT_PASS (pass_stv, 1);
>> +# after immediately after the NEXT_PASS (pass_copy_prop, 1) line,
>> +# similarly INSERT_PASS_BEFORE inserts immediately before that line.
>> +# REPLACE_PASS (pass_copy_prop, 1, pass_stv, true);
>> +# will replace NEXT_PASS (pass_copy_prop, 1) line with
>> +# NEXT_PASS (pass_stv, 1, true);
>> +# line and renumber all higher pass_copy_prop instances if any.
>>
>>  # Usage: awk -f gen-pass-instances.awk passes.def
>>
>>  BEGIN {
>> - print "/* This file is auto-generated by gen-pass-instances.awk";
>> - print "   from passes.def.  */";
>> +  print "/* This file is auto-generated by gen-pass-instances.awk";
>> +  print "   from passes.def.  */";
>> +  lineno = 1;
>>  }
>>
>> -function handle_line()
>> +function parse_line(line, fnname,len_of_call, len_of_start,
>> + len_of_open, len_of_close,
>> + len_of_args, args_start_at,
>> + args_str, len_of_prefix,
>> + call_starts_at,
>> + postfix_starts_at)
>>  {
>> - line = $0;
>> +  # Find call expression.
>> +  call_starts_at = match(line, fnname " \\(.+\\)");
>> +  if (call_starts_at == 0)
>> +return 0;
>> +
>> +  # Length of the call expression.
>> +  len_of_call = RLENGTH;
>> +
>> +  len_of_start = length(fnname " (");
>> +  len_of_open = length("(");
>> +  len_of_close = length(")");
>> +
>> +  # Find arguments
>> +  len_of_args = len_of_call - (len_of_start + len_of_close);
>> +  args_start_at = call_starts_at + len_of_start;
>> +  args_str = substr(line, args_start_at, len_of_args);
>> +  split(args_str, args, ",");
>> +
>> +  # Find call expression prefix
>> +  len_of_prefix = 

Re: [PATCH] Improve target pass registration

2016-10-04 Thread Richard Biener
On Fri, 30 Sep 2016, Jakub Jelinek wrote:

> Hi!
> 
> As discussed earlier on IRC, the current way of registering target specific
> passes has various issues:
> 1) for -da, the target specific dump files appear last, regardless on where
>exactly they appear in the pass queue, so one has to look up the sources
>or remember where the pass is invoked if e.g. looking for when certain
>change in the IL first appears
> 2) -fdump-rtl-stv-details and similar options don't work, the option
>processing happens before the passes are registered
> 
> This patch allows backends to provide their *-passes.def file with
> instructions how to ammend passes.def, which then can be inspected in
> pass-instances.def the script generates.
> 
> I've only converted the i386 backend so far, other maintainers can easily
> convert their backends later on.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

I'm fine with the approach but I can't really review the awk parts
so I'd appreciate a second eye on them.

Thus, ok from the overall view, leaving to Uros and maybe some awk
expert (if none appears within a reasonable amount of time consider
this as approval anyway).

Thanks,
Richard.

> 2016-09-30  Jakub Jelinek  
> 
>   * gen-pass-instances.awk: Rewritten.
>   * Makefile.in (pass-instances.def): Depend on $(PASSES_EXTRA), pass
>   $(PASSES_EXTRA) after passes.def to the script.
>   * config/i386/t-i386 (PASSES_EXTRA): Add i386-passes.def.
>   * config/i386/i386-passes.def: New file.
>   * config/i386/i386-protos.h (make_pass_insert_vzeroupper,
>   make_pass_stv): Declare.
>   * config/i386/i386.c (pass_stv::pass_stv): Initialize timode_p to
>   false.
>   (pass_stv::gate): Depending on timode_p member require TARGET_64BIT
>   or !TARGET_64BIT.
>   (pass_stv::clone, pass_stv::set_pass_param): New methods.
>   (pass_stv::timode_p): New non-static data member.
>   (ix86_option_override): Don't register passes here.
> 
> --- gcc/gen-pass-instances.awk.jj 2016-09-29 22:53:10.264776158 +0200
> +++ gcc/gen-pass-instances.awk2016-09-30 13:22:53.745373889 +0200
> @@ -17,6 +17,8 @@
>  # This Awk script takes passes.def and writes pass-instances.def,
>  # counting the instances of each kind of pass, adding an instance number
>  # to everywhere that NEXT_PASS is used.
> +# Also handle INSERT_PASS_AFTER, INSERT_PASS_BEFORE and REPLACE_PASS
> +# directives.
>  #
>  # For example, the single-instanced pass:
>  # NEXT_PASS (pass_warn_unused_result);
> @@ -30,81 +32,201 @@
>  # through:
>  #   NEXT_PASS (pass_copy_prop, 8);
>  # (currently there are 8 instances of that pass)
> +#
> +# INSERT_PASS_AFTER (pass_copy_prop, 1, pass_stv);
> +# will insert
> +# NEXT_PASS (pass_stv, 1);
> +# after immediately after the NEXT_PASS (pass_copy_prop, 1) line,
> +# similarly INSERT_PASS_BEFORE inserts immediately before that line.
> +# REPLACE_PASS (pass_copy_prop, 1, pass_stv, true);
> +# will replace NEXT_PASS (pass_copy_prop, 1) line with
> +# NEXT_PASS (pass_stv, 1, true);
> +# line and renumber all higher pass_copy_prop instances if any.
>  
>  # Usage: awk -f gen-pass-instances.awk passes.def
>  
>  BEGIN {
> - print "/* This file is auto-generated by gen-pass-instances.awk";
> - print "   from passes.def.  */";
> +  print "/* This file is auto-generated by gen-pass-instances.awk";
> +  print "   from passes.def.  */";
> +  lineno = 1;
>  }
>  
> -function handle_line()
> +function parse_line(line, fnname,len_of_call, len_of_start,
> + len_of_open, len_of_close,
> + len_of_args, args_start_at,
> + args_str, len_of_prefix,
> + call_starts_at,
> + postfix_starts_at)
>  {
> - line = $0;
> +  # Find call expression.
> +  call_starts_at = match(line, fnname " \\(.+\\)");
> +  if (call_starts_at == 0)
> +return 0;
> +
> +  # Length of the call expression.
> +  len_of_call = RLENGTH;
> +
> +  len_of_start = length(fnname " (");
> +  len_of_open = length("(");
> +  len_of_close = length(")");
> +
> +  # Find arguments
> +  len_of_args = len_of_call - (len_of_start + len_of_close);
> +  args_start_at = call_starts_at + len_of_start;
> +  args_str = substr(line, args_start_at, len_of_args);
> +  split(args_str, args, ",");
> +
> +  # Find call expression prefix
> +  len_of_prefix = call_starts_at - 1;
> +  prefix = substr(line, 1, len_of_prefix);
> +
> +  # Find call expression postfix
> +  postfix_starts_at = call_starts_at + len_of_call;
> +  postfix = substr(line, postfix_starts_at);
> +  return 1;
> +}
>  
> - # Find call expression.
> - call_starts_at = match(line, /NEXT_PASS \(.+\)/);
> - if (call_starts_at == 0)
> - {
> - print line;
> - return;
> - }
> +function 

[PATCH] Improve target pass registration

2016-09-30 Thread Jakub Jelinek
Hi!

As discussed earlier on IRC, the current way of registering target specific
passes has various issues:
1) for -da, the target specific dump files appear last, regardless on where
   exactly they appear in the pass queue, so one has to look up the sources
   or remember where the pass is invoked if e.g. looking for when certain
   change in the IL first appears
2) -fdump-rtl-stv-details and similar options don't work, the option
   processing happens before the passes are registered

This patch allows backends to provide their *-passes.def file with
instructions how to ammend passes.def, which then can be inspected in
pass-instances.def the script generates.

I've only converted the i386 backend so far, other maintainers can easily
convert their backends later on.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2016-09-30  Jakub Jelinek  

* gen-pass-instances.awk: Rewritten.
* Makefile.in (pass-instances.def): Depend on $(PASSES_EXTRA), pass
$(PASSES_EXTRA) after passes.def to the script.
* config/i386/t-i386 (PASSES_EXTRA): Add i386-passes.def.
* config/i386/i386-passes.def: New file.
* config/i386/i386-protos.h (make_pass_insert_vzeroupper,
make_pass_stv): Declare.
* config/i386/i386.c (pass_stv::pass_stv): Initialize timode_p to
false.
(pass_stv::gate): Depending on timode_p member require TARGET_64BIT
or !TARGET_64BIT.
(pass_stv::clone, pass_stv::set_pass_param): New methods.
(pass_stv::timode_p): New non-static data member.
(ix86_option_override): Don't register passes here.

--- gcc/gen-pass-instances.awk.jj   2016-09-29 22:53:10.264776158 +0200
+++ gcc/gen-pass-instances.awk  2016-09-30 13:22:53.745373889 +0200
@@ -17,6 +17,8 @@
 # This Awk script takes passes.def and writes pass-instances.def,
 # counting the instances of each kind of pass, adding an instance number
 # to everywhere that NEXT_PASS is used.
+# Also handle INSERT_PASS_AFTER, INSERT_PASS_BEFORE and REPLACE_PASS
+# directives.
 #
 # For example, the single-instanced pass:
 # NEXT_PASS (pass_warn_unused_result);
@@ -30,81 +32,201 @@
 # through:
 #   NEXT_PASS (pass_copy_prop, 8);
 # (currently there are 8 instances of that pass)
+#
+# INSERT_PASS_AFTER (pass_copy_prop, 1, pass_stv);
+# will insert
+# NEXT_PASS (pass_stv, 1);
+# after immediately after the NEXT_PASS (pass_copy_prop, 1) line,
+# similarly INSERT_PASS_BEFORE inserts immediately before that line.
+# REPLACE_PASS (pass_copy_prop, 1, pass_stv, true);
+# will replace NEXT_PASS (pass_copy_prop, 1) line with
+# NEXT_PASS (pass_stv, 1, true);
+# line and renumber all higher pass_copy_prop instances if any.
 
 # Usage: awk -f gen-pass-instances.awk passes.def
 
 BEGIN {
-   print "/* This file is auto-generated by gen-pass-instances.awk";
-   print "   from passes.def.  */";
+  print "/* This file is auto-generated by gen-pass-instances.awk";
+  print "   from passes.def.  */";
+  lineno = 1;
 }
 
-function handle_line()
+function parse_line(line, fnname,  len_of_call, len_of_start,
+   len_of_open, len_of_close,
+   len_of_args, args_start_at,
+   args_str, len_of_prefix,
+   call_starts_at,
+   postfix_starts_at)
 {
-   line = $0;
+  # Find call expression.
+  call_starts_at = match(line, fnname " \\(.+\\)");
+  if (call_starts_at == 0)
+return 0;
+
+  # Length of the call expression.
+  len_of_call = RLENGTH;
+
+  len_of_start = length(fnname " (");
+  len_of_open = length("(");
+  len_of_close = length(")");
+
+  # Find arguments
+  len_of_args = len_of_call - (len_of_start + len_of_close);
+  args_start_at = call_starts_at + len_of_start;
+  args_str = substr(line, args_start_at, len_of_args);
+  split(args_str, args, ",");
+
+  # Find call expression prefix
+  len_of_prefix = call_starts_at - 1;
+  prefix = substr(line, 1, len_of_prefix);
+
+  # Find call expression postfix
+  postfix_starts_at = call_starts_at + len_of_call;
+  postfix = substr(line, postfix_starts_at);
+  return 1;
+}
 
-   # Find call expression.
-   call_starts_at = match(line, /NEXT_PASS \(.+\)/);
-   if (call_starts_at == 0)
-   {
-   print line;
-   return;
-   }
+function adjust_linenos(above, increment,  p, i)
+{
+  for (p in pass_lines)
+if (pass_lines[p] >= above)
+  pass_lines[p] += pass_lines[p];
+  if (increment > 0)
+for (i = lineno - 1; i >= above; i--)
+  lines[i + increment] = lines[i];
+  else
+for (i = above; i < lineno; i++)
+  lines[i + increment] = lines[i];
+  lineno += increment;
+}
 
-   # Length of the call expression.
-   len_of_call = RLENGTH;
+function insert_remove_pass(line, fnname)
+{
+  parse_line($0, fnname);
+