From ce531b14126bf5f1dcd70224a1131198ddf58875 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 3 Oct 2020 21:22:03 +0200 Subject: [PATCH] options: Fix up opts_set saving/restoring for underlying vars of Mask/InverseMask options Seems I've missed that set_option has special treatment for CLVC_BIT_CLEAR/CLVC_BIT_SET. Which means I'll need to change the generic handling, so that for global_options_set elements mentioned in CLVC_BIT_* options are treated differently, instead of using the accumulated bitmasks they'll need to use their specific bitmask variables during the option saving/restoring. Here is a patch that implements that. 2020-10-03 Jakub Jelinek * 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/optc-save-gen.awk | 46 +++++++++++++++++++++++++++++++++++++++++++ gcc/opth-gen.awk | 17 ++++++++++++++-- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/gcc/optc-save-gen.awk b/gcc/optc-save-gen.awk index b5c27f70ece..56a5df3d33e 100644 --- a/gcc/optc-save-gen.awk +++ b/gcc/optc-save-gen.awk @@ -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 (ptr1->explicit_mask) / sizeof (ptr1->exp 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 "}"; diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk index 8fec607041e..a1ca579f24f 100644 --- a/gcc/opth-gen.awk +++ b/gcc/opth-gen.awk @@ -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 ""; -- 2.30.2