Hi! When working on the previous patch, I've noticed that all cl_optimization fields appart from strings are streamed with bp_pack_value (..., 64); so we waste quite a lot of space, given that many of the options are just booleans or char options and there are 450-ish of them.
Fixed by streaming the number of bits the corresponding fields have. While for char fields we have also range information, except for 3 it is either -128, 127 or 0, 255, so it didn't seem worth it to bother with using range-ish packing. Bootstrapped/regtested on x86_64-linux, i686-linux, armv7hl-linux-gnueabi, aarch64-linux, powerpc64le-linux and lto bootstrapped on x86_64-linux, ok for trunk? 2020-09-13 Jakub Jelinek <ja...@redhat.com> * optc-save-gen.awk: In cl_optimization_stream_out and cl_optimization_stream_in, stream int, enum, short and char variables with corresponding HOST_BITS_PER_* rather than hardcoded 64. --- gcc/optc-save-gen.awk.jj 2020-09-11 17:38:31.524230167 +0200 +++ gcc/optc-save-gen.awk 2020-09-11 22:12:59.948580827 +0200 @@ -1252,13 +1252,23 @@ print "cl_optimization_stream_out (struc print " struct bitpack_d *bp,"; print " struct cl_optimization *ptr)"; print "{"; -for (i = 0; i < n_opt_val; i++) { - name = var_opt_val[i] - otype = var_opt_val_type[i]; - if (otype ~ "^const char \\**$") - print " bp_pack_string (ob, bp, ptr->" name", true);"; - else - print " bp_pack_value (bp, ptr->" name", 64);"; +for (i = 0; i < n_opt_other; i++) { + print " bp_pack_value (bp, ptr->x_" var_opt_other[i] ", HOST_BITS_PER_WIDE_INT);"; +} +for (i = 0; i < n_opt_int; i++) { + print " bp_pack_value (bp, static_cast<unsigned int>(ptr->x_" var_opt_int[i] "), HOST_BITS_PER_INT);"; +} +for (i = 0; i < n_opt_enum; i++) { + print " bp_pack_value (bp, static_cast<unsigned int>(ptr->x_" var_opt_enum[i] "), HOST_BITS_PER_INT);"; +} +for (i = 0; i < n_opt_short; i++) { + print " bp_pack_value (bp, static_cast<unsigned short>(ptr->x_" var_opt_short[i] "), HOST_BITS_PER_SHORT);"; +} +for (i = 0; i < n_opt_char; i++) { + print " bp_pack_value (bp, static_cast<unsigned char>(ptr->x_" var_opt_char[i] "), HOST_BITS_PER_CHAR);"; +} +for (i = 0; i < n_opt_string; i++) { + print " bp_pack_string (ob, bp, ptr->x_" var_opt_string[i] ", true);"; } 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);"; @@ -1271,17 +1281,26 @@ print "cl_optimization_stream_in (struct print " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; print " struct cl_optimization *ptr ATTRIBUTE_UNUSED)"; print "{"; -for (i = 0; i < n_opt_val; i++) { - name = var_opt_val[i] - otype = var_opt_val_type[i]; - if (otype ~ "^const char \\**$") - { - print " ptr->" name" = bp_unpack_string (data_in, bp);"; - print " if (ptr->" name")"; - print " ptr->" name" = xstrdup (ptr->" name");"; - } - else - print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_value (bp, 64);"; +for (i = 0; i < n_opt_other; i++) { + print " ptr->x_" var_opt_other[i] " = bp_unpack_value (bp, HOST_BITS_PER_WIDE_INT);"; +} +for (i = 0; i < n_opt_int; i++) { + print " ptr->x_" var_opt_int[i] " = bp_unpack_value (bp, HOST_BITS_PER_INT);"; +} +for (i = 0; i < n_opt_enum; i++) { + print " ptr->x_" var_opt_enum[i] " = static_cast<" var_opt_enum_type[i] ">(bp_unpack_value (bp, HOST_BITS_PER_INT));"; +} +for (i = 0; i < n_opt_short; i++) { + print " ptr->x_" var_opt_short[i] " = bp_unpack_value (bp, HOST_BITS_PER_SHORT);"; +} +for (i = 0; i < n_opt_char; i++) { + print " ptr->x_" var_opt_char[i] " = bp_unpack_value (bp, HOST_BITS_PER_CHAR);"; +} +for (i = 0; i < n_opt_string; i++) { + name = var_opt_string[i]; + print " ptr->x_" name" = bp_unpack_string (data_in, bp);"; + print " if (ptr->x_" name")"; + print " ptr->x_" name" = xstrdup (ptr->x_" name");"; } 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);"; Jakub