[PATCH] options: Save and restore opts_set for Optimization and Target options

Richard Biener rguenther@suse.de
Sat Oct 3 18:02:58 GMT 2020


On October 3, 2020 10:41:26 AM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote:
>On Fri, Oct 02, 2020 at 04:21:12PM +0200, Stefan Schulze Frielinghaus
>via Gcc-patches wrote:
>> > > Sure, no problem at all.  In that case I stop to investigate
>further and
>> > > wait for you.
>> > 
>> > Here is a patch that implements that.
>> > 
>> > Can you please check if it fixes the s390x regressions that I
>couldn't
>> > reproduce in a cross?
>> 
>> Bootstrapped and regtested on S/390. Now all tattr-*.c test cases run
>> successfully with the patch. All other tests remain the same.
>
>I've now also successfully tested it on
>{x86_64,i686,armv7hl,aarch64,powerpc64le,s390x.  Ok for trunk?

OK. 

Richard. 

>> > 2020-10-02  Jakub Jelinek  <jakub@redhat.com>
>> > 
>> > 	* opth-gen.awk: For variables referenced in Mask and InverseMask,
>> > 	don't use the explicit_mask bitmask array, but add separate
>> > 	explicit_mask_* members with the same types as the variables.
>> > 	* optc-save-gen.awk: Save, restore, compare and hash the separate
>> > 	explicit_mask_* members.
>> > 
>> > --- gcc/opth-gen.awk.jj	2020-09-14 09:04:35.866854351 +0200
>> > +++ gcc/opth-gen.awk	2020-10-01 21:52:30.855122749 +0200
>> > @@ -209,6 +209,7 @@ n_target_int = 0;
>> >  n_target_enum = 0;
>> >  n_target_other = 0;
>> >  n_target_explicit = n_extra_target_vars;
>> > +n_target_explicit_mask = 0;
>> >  
>> >  for (i = 0; i < n_target_save; i++) {
>> >  	if (target_save_decl[i] ~ "^((un)?signed +)?int +[_" alnum "]+$")
>> > @@ -240,6 +241,12 @@ if (have_save) {
>> >  			var_save_seen[name]++;
>> >  			n_target_explicit++;
>> >  			otype = var_type_struct(flags[i])
>> > +
>> > +			if (opt_args("Mask", flags[i]) != "" \
>> > +			    || opt_args("InverseMask", flags[i]))
>> > +				var_target_explicit_mask[n_target_explicit_mask++] \
>> > +				    = otype "explicit_mask_" name;
>> > +
>> >  			if (otype ~ "^((un)?signed +)?int *$")
>> >  				var_target_int[n_target_int++] = otype "x_" name;
>> >  
>> > @@ -259,6 +266,8 @@ if (have_save) {
>> >  } else {
>> >  	var_target_int[n_target_int++] = "int x_target_flags";
>> >  	n_target_explicit++;
>> > +	var_target_explicit_mask[n_target_explicit_mask++] \
>> > +	    = "int explicit_mask_target_flags";
>> >  }
>> >  
>> >  for (i = 0; i < n_target_other; i++) {
>> > @@ -281,8 +290,12 @@ for (i = 0; i < n_target_char; i++) {
>> >  	print "  " var_target_char[i] ";";
>> >  }
>> >  
>> > -print "  /* " n_target_explicit " members */";
>> > -print "  unsigned HOST_WIDE_INT explicit_mask[" int
>((n_target_explicit + 63) / 64) "];";
>> > +print "  /* " n_target_explicit - n_target_explicit_mask " members
>*/";
>> > +print "  unsigned HOST_WIDE_INT explicit_mask[" int
>((n_target_explicit - n_target_explicit_mask + 63) / 64) "];";
>> > +
>> > +for (i = 0; i < n_target_explicit_mask; i++) {
>> > +	print "  " var_target_explicit_mask[i] ";";
>> > +}
>> >  
>> >  print "};";
>> >  print "";
>> > --- gcc/optc-save-gen.awk.jj	2020-09-16 10:06:23.018093486 +0200
>> > +++ gcc/optc-save-gen.awk	2020-10-01 21:48:10.933868862 +0200
>> > @@ -516,6 +516,10 @@ if (have_save) {
>> >  
>> >  			var_save_seen[name]++;
>> >  			otype = var_type_struct(flags[i])
>> > +			if (opt_args("Mask", flags[i]) != "" \
>> > +			    || opt_args("InverseMask", flags[i]))
>> > +				var_target_explicit_mask[name] = 1;
>> > +
>> >  			if (otype ~ "^((un)?signed +)?int *$")
>> >  				var_target_int[n_target_int++] = name;
>> >  
>> > @@ -545,6 +549,7 @@ if (have_save) {
>> >  	}
>> >  } else {
>> >  	var_target_int[n_target_int++] = "target_flags";
>> > +	var_target_explicit_mask["target_flags"] = 1;
>> >  }
>> >  
>> >  have_assert = 0;
>> > @@ -608,6 +613,10 @@ for (i = 0; i < n_extra_target_vars; i++
>> >  }
>> >  
>> >  for (i = 0; i < n_target_other; i++) {
>> > +	if (var_target_other[i] in var_target_explicit_mask) {
>> > +		print "  ptr->explicit_mask_" var_target_other[i] " =
>opts_set->x_" var_target_other[i] ";";
>> > +		continue;
>> > +	}
>> >  	print "  if (opts_set->x_" var_target_other[i] ") mask |=
>HOST_WIDE_INT_1U << " j ";";
>> >  	j++;
>> >  	if (j == 64) {
>> > @@ -630,6 +639,10 @@ for (i = 0; i < n_target_enum; i++) {
>> >  }
>> >  
>> >  for (i = 0; i < n_target_int; i++) {
>> > +	if (var_target_int[i] in var_target_explicit_mask) {
>> > +		print "  ptr->explicit_mask_" var_target_int[i] " =
>opts_set->x_" var_target_int[i] ";";
>> > +		continue;
>> > +	}
>> >  	print "  if (opts_set->x_" var_target_int[i] ") mask |=
>HOST_WIDE_INT_1U << " j ";";
>> >  	j++;
>> >  	if (j == 64) {
>> > @@ -739,6 +752,10 @@ for (i = 0; i < n_extra_target_vars; i++
>> >  }
>> >  
>> >  for (i = 0; i < n_target_other; i++) {
>> > +	if (var_target_other[i] in var_target_explicit_mask) {
>> > +		print "  opts_set->x_" var_target_other[i] " =
>ptr->explicit_mask_" var_target_other[i] ";";
>> > +		continue;
>> > +	}
>> >  	if (j == 64) {
>> >  		print "  mask = ptr->explicit_mask[" k "];";
>> >  		k++;
>> > @@ -761,6 +778,10 @@ for (i = 0; i < n_target_enum; i++) {
>> >  }
>> >  
>> >  for (i = 0; i < n_target_int; i++) {
>> > +	if (var_target_int[i] in var_target_explicit_mask) {
>> > +		print "  opts_set->x_" var_target_int[i] " =
>ptr->explicit_mask_" var_target_int[i] ";";
>> > +		continue;
>> > +	}
>> >  	if (j == 64) {
>> >  		print "  mask = ptr->explicit_mask[" k "];";
>> >  		k++;
>> > @@ -1058,6 +1079,20 @@ print "  for (size_t i = 0; i < sizeof (
>> >  print "    if (ptr1->explicit_mask[i] != ptr2->explicit_mask[i])";
>> >  print "      return false;"
>> >  
>> > +for (i = 0; i < n_target_other; i++) {
>> > +	if (var_target_other[i] in var_target_explicit_mask) {
>> > +		print "  if (ptr1->explicit_mask_" var_target_other[i] " !=
>ptr2->explicit_mask_" var_target_other[i] ")";
>> > +		print "    return false;";
>> > +	}
>> > +}
>> > +
>> > +for (i = 0; i < n_target_int; i++) {
>> > +	if (var_target_int[i] in var_target_explicit_mask) {
>> > +		print "  if (ptr1->explicit_mask_" var_target_int[i] " !=
>ptr2->explicit_mask_" var_target_int[i] ")";
>> > +		print "    return false;";
>> > +	}
>> > +}
>> > +
>> >  print "  return true;";
>> >  
>> >  print "}";
>> > @@ -1088,6 +1123,17 @@ for (i = 0; i < n_target_val; i++) {
>> >  }
>> >  print "  for (size_t i = 0; i < sizeof (ptr->explicit_mask) /
>sizeof (ptr->explicit_mask[0]); i++)";
>> >  print "    hstate.add_hwi (ptr->explicit_mask[i]);";
>> > +
>> > +for (i = 0; i < n_target_other; i++) {
>> > +	if (var_target_other[i] in var_target_explicit_mask)
>> > +		print "  hstate.add_hwi (ptr->explicit_mask_"
>var_target_other[i] ");";
>> > +}
>> > +
>> > +for (i = 0; i < n_target_int; i++) {
>> > +	if (var_target_int[i] in var_target_explicit_mask)
>> > +		print "  hstate.add_hwi (ptr->explicit_mask_" var_target_int[i]
>");";
>> > +}
>> > +
>> >  print "  return hstate.end ();";
>> >  print "}";
>> >  
>> > 
>
>	Jakub



More information about the Gcc-patches mailing list