On Wed, 25 May 2011, Jan Hubicka wrote: > > > *************** lto_output_tree (struct output_block *ob > > > *** 1401,1407 **** > > > will instantiate two different nodes for the same object. */ > > > output_record_start (ob, LTO_tree_pickle_reference); > > > output_uleb128 (ob, ix); > > > ! output_uleb128 (ob, lto_tree_code_to_tag (TREE_CODE (expr))); > > > } > > > else if (lto_stream_as_builtin_p (expr)) > > > { > > > --- 1399,1405 ---- > > > will instantiate two different nodes for the same object. */ > > > output_record_start (ob, LTO_tree_pickle_reference); > > > output_uleb128 (ob, ix); > > > ! output_record_start (ob, lto_tree_code_to_tag (TREE_CODE (expr))); > > > > I'd prefer lto_output_enum here as we don't really start a new output > > record but just emit something for a sanity check. > > OK, I wondered what is cleaner, will update the patch. > > > + /* Output VAL into OBS and verify it is in range MIN...MAX that is > > > supposed > > > + to be compile time constant. > > > + Be host independent, limit range to 31bits. */ > > > + > > > + static inline void > > > + lto_output_int_in_range (struct lto_output_stream *obs, > > > + HOST_WIDE_INT min, > > > + HOST_WIDE_INT max, > > > + HOST_WIDE_INT val) > > > + { > > > + HOST_WIDE_INT range = max - min; > > > + > > > + gcc_checking_assert (val >= min && val <= max && range > 0 > > > + && range < 0x7fffffff); > > > + > > > + val -= min; > > > + lto_output_1_stream (obs, val & 255); > > > + if (range >= 0xff) > > > + lto_output_1_stream (obs, (val << 8) & 255); > > > + if (range >= 0xffff) > > > + lto_output_1_stream (obs, (val << 16) & 255); > > > + if (range >= 0xffffff) > > > + lto_output_1_stream (obs, (val << 24) & 255); > > > > so you didn't want to create a bitpack_pack_int_in_range and use > > bitpacks for enums? I suppose for some of the remaining cases > > packing them into existing bitpacks would be preferable? > > Well, in my TODO list is to have both. Where we don't bitpatck enums with > other values (that is the most common case of enums) this way we produce less > overhead and have extra sanity check that the bits unused by enum are really > 0. > > I guess final API should have both lto_output_enum and > lto_bitpack_output_enum. > I don't really care if the first have the implementation above or just > creates its > own bitpack to handle the value.
Ok. > > > + { > > > + HOST_WIDE_INT range = max - min; > > > + HOST_WIDE_INT val = lto_input_1_unsigned (ib); > > > + > > > + gcc_checking_assert (range > 0); > > > > The assert doesn't match the one during output. > > Hmm, OK, will match. Patch is ok with the changes. Thanks, Richard.