On October 3, 2020 10:41:26 AM GMT+02:00, Jakub Jelinek <ja...@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 <ja...@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