Hi! On 2020-11-18T10:36:35+0100, Jakub Jelinek via Gcc-patches wrote: > Honza mentioned that especially for the new param machinery, most of > streamed values are probably going to be the default values. Perhaps > somehow we could stream them more effectively. > > This patch implements it and brings further savings, the size > goes down from 574 bytes to 273 bytes, i.e. less than half. Neat idea about the XOR-encoding! > Not trying to handle enums because the code doesn't know if (enum ...) 10 > is even valid, similarly non-parameters because those really generally > don't have large initializers, and params without Init (those are 0 > initialized and thus don't need to be handled). Given this only looks at 'Init', I understand this may actually mis-optimize in the case that there is an 'Init' present, but that value is then "by default" overridden via 'LANG_HOOKS_INIT_OPTIONS_STRUCT', or 'TARGET_OPTION_OVERRIDE', for example. (I'm however not claiming that's an actual problem to be worried about -- just for my understanding.) Either way: > * optc-save-gen.awk: Initialize var_opt_init. In > cl_optimization_stream_out for params with default values larger than > 10, xor the default value with the actual parameter value. In > cl_optimization_stream_in repeat the above xor. > --- gcc/optc-save-gen.awk.jj 2020-09-14 10:51:54.493740942 +0200 > +++ gcc/optc-save-gen.awk 2020-09-14 11:39:39.441602594 +0200 > @@ -1186,6 +1186,7 @@ for (i = 0; i < n_opts; i++) { > var_opt_val_type[n_opt_val] = otype; > var_opt_val[n_opt_val] = "x_" name; > var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]); > + var_opt_init[n_opt_val] = opt_args("Init", flags[i]); > n_opt_val++; > } > } Reading through the options handling, I was confused why 'Init' needs to be handled in 'gcc/optc-save-gen.awk'. To help the next person -- like, me in a few weeks ;-) -- wondering about this, OK to push the attached "options: Clarify 'Init' option property usage for streaming optimization"? Grüße Thomas > @@ -1257,10 +1258,21 @@ for (i = 0; i < n_opt_val; i++) { > otype = var_opt_val_type[i]; > if (otype ~ "^const char \\**$") > print " bp_pack_string (ob, bp, ptr->" name", true);"; > - else if (otype ~ "^unsigned") > - print " bp_pack_var_len_unsigned (bp, ptr->" name");"; > - else > - print " bp_pack_var_len_int (bp, ptr->" name");"; > + else { > + if (otype ~ "^unsigned") { > + sgn = "unsigned"; > + } else { > + sgn = "int"; > + } > + if (name ~ "^x_param" && !(otype ~ "^enum ") && var_opt_init[i]) { > + print " if (" var_opt_init[i] " > (" var_opt_val_type[i] ") 10)"; > + print " bp_pack_var_len_" sgn " (bp, ptr->" name" ^ " var_opt_init[i] ");"; > + print " else"; > + print " bp_pack_var_len_" sgn " (bp, ptr->" name");"; > + } else { > + print " bp_pack_var_len_" sgn " (bp, ptr->" name");"; > + } > + } > } > print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)"; > print " bp_pack_value (bp, ptr->explicit_mask[i], 64);"; > @@ -1281,10 +1293,18 @@ for (i = 0; i < n_opt_val; i++) { > print " if (ptr->" name")"; > print " ptr->" name" = xstrdup (ptr->" name");"; > } > - else if (otype ~ "^unsigned") > - print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_var_len_unsigned (bp);"; > - else > - print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_var_len_int (bp);"; > + else { > + if (otype ~ "^unsigned") { > + sgn = "unsigned"; > + } else { > + sgn = "int"; > + } > + print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_var_len_" sgn " (bp);"; > + if (name ~ "^x_param" && !(otype ~ "^enum ") && var_opt_init[i]) { > + print " if (" var_opt_init[i] " > (" var_opt_val_type[i] ") 10)"; > + print " ptr->" name" ^= " var_opt_init[i] ";"; > + } > + } > } > print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)"; > print " ptr->explicit_mask[i] = bp_unpack_value (bp, 64);"; ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955