[PATCH] lto: Cache location_ts including BLOCKs in GIMPLE streaming [PR94311]
Richard Biener
rguenther@suse.de
Thu Sep 3 10:07:36 GMT 2020
On Thu, 3 Sep 2020, Jakub Jelinek wrote:
> Hi!
>
> As mentioned in the PR, when compiling valgrind even on fairly small
> testcase where in one larger function the location keeps oscillating
> between a small line number and 8000-ish line number in the same file
> we very quickly run out of all possible location_t numbers and because of
> that emit non-sensical line numbers in .debug_line.
> There are ways how to decrease speed of depleting location_t numbers
> in libcpp, but the main reason of this is that we use
> stream_input_location_now for streaming in location_t for gimple_location
> and phi arg locations. libcpp strongly prefers that the locations
> it is given are sorted by the different files and by line numbers in
> ascending order, otherwise it depletes quickly no matter what and is much
> more costly (many extra file changes etc.).
> The reason for not caching those were the BLOCKs that were streamed
> immediately after the location and encoded into the locations (and for PHIs
> we failed to stream the BLOCKs altogether).
> This patch enhances the location cache to handle also BLOCKs (but not for
> everything, only for the spots we care about the BLOCKs) and also optimizes
> the size of the LTO stream by emitting a single bit into a pack whether the
> BLOCK changed from last case and only streaming the BLOCK tree if it
> changed.
>
> Bootstapped/regtested on x86_64-linux with
> ../configure --enable-languages=default,ada,obj-c++,lto,go,brig,d --with-build-config=bootstrap-lto --enable-checking=yes,rtl,extra && make -j16 bootstrap > LOG 2>&1 && GXX_TESTSUITE_STDS=98,11,14,17,2a make -j32 -k check > LOGC 2>&1; ../contrib/test_summary > LOGT 2>&1
> as well as normally bootstrapped/regtested on x86_64-linux and i686-linux,
> ok for trunk?
LGTM.
Can we now remove stream_input_location_now?
> BTW, I wonder about one preexisting issue (but that can be done
> incrementally). On the streamer out side, we call clear_line_info
> in multiple spots which resets the current_* values to something, but on the
> reader side, we don't have corresponding resets in the same location, just have
> the stream_* static variables that keep the current values through the
> entire stream in (so across all the clear_line_info spots in a single LTO
> object but also across jumping from one LTO object to another one).
> Now, in an earlier version of my patch it actually broke LTO bootstrap
> (and a lot of LTO testcases), so for the BLOCK case I've solved it by
> clear_line_info setting current_block to something that should never appear,
> which means that in the LTO stream after the clear_line_info spots including
> the start of the LTO stream we force the block change bit to be set and thus
> BLOCK to be streamed and therefore stream_block from earlier to be
> ignored. But for the rest I think that is not the case, so I wonder if we
> don't sometimes end up with wrong line/column info because of that, or
> please tell me what prevents that.
> clear_line_info does:
> ob->current_file = NULL;
> ob->current_line = 0;
> ob->current_col = 0;
> ob->current_sysp = false;
> while I think NULL current_file is something that should likely be different
> from expanded_location (...).file (UNKNOWN_LOCATION/BUILTINS_LOCATION are
> handled separately and not go through the caching), I think line number 0
> can sometimes occur and especially column 0 occurs frequently if we ran out
> of location_t with columns info. But then we do:
> bp_pack_value (bp, ob->current_file != xloc.file, 1);
> bp_pack_value (bp, ob->current_line != xloc.line, 1);
> bp_pack_value (bp, ob->current_col != xloc.column, 1);
> and stream the details only if the != is true. If that happens immediately
> after clear_line_info and e.g. xloc.column is 0, we would stream 0 bit and
> not stream the actual value, so on read-in it would reuse whatever
> stream_col etc. were before. Shouldn't we set some ob->current_* new bit
> that would signal we are immediately past clear_line_info which would force
> all these != checks to non-zero? Either by oring something into those
> tests, or perhaps:
> if (ob->current_reset)
> {
> if (xloc.file == NULL)
> ob->current_file = "";
> if (xloc.line == 0)
> ob->current_line = 1;
> if (xloc.column == 0)
> ob->current_column = 1;
> ob->current_reset = false;
> }
> before doing those bp_pack_value calls with a comment, effectively forcing
> all 6 != comparisons to be true?
Yeah, guess that would be cleanest. How does UNKNOWN_LOCATION
expand btw? Using that as "reset" value also might work?
Thanks,
Richard.
> 2020-09-03 Jakub Jelinek <jakub@redhat.com>
>
> PR lto/94311
> * gimple.h (gimple_location_ptr, gimple_phi_arg_location_ptr): New
> functions.
> * streamer-hooks.h (struct streamer_hooks): Add
> output_location_and_block callback. Fix up formatting for
> output_location.
> (stream_output_location_and_block): Define.
> * lto-streamer.h (class lto_location_cache): Fix comment typo. Add
> current_block member.
> (lto_location_cache::input_location_and_block): New method.
> (lto_location_cache::lto_location_cache): Initialize current_block.
> (lto_location_cache::cached_location): Add block member.
> (struct output_block): Add current_block member.
> (lto_output_location): Formatting fix.
> (lto_output_location_and_block): Declare.
> * lto-streamer.c (lto_streamer_hooks_init): Initialize
> streamer_hooks.output_location_and_block.
> * lto-streamer-in.c (lto_location_cache::cmp_loc): Also compare
> block members.
> (lto_location_cache::apply_location_cache): Handle blocks.
> (lto_location_cache::accept_location_cache,
> lto_location_cache::revert_location_cache): Fix up function comments.
> (lto_location_cache::input_location_and_block): New method.
> (lto_location_cache::input_location): Implement using
> input_location_and_block.
> (input_function): Invoke apply_location_cache after streaming in all
> bbs.
> * lto-streamer-out.c (clear_line_info): Set current_block.
> (lto_output_location_1): New function, moved from lto_output_location,
> added block handling.
> (lto_output_location): Implement using lto_output_location_1.
> (lto_output_location_and_block): New function.
> * gimple-streamer-in.c (input_phi): Use input_location_and_block
> to input and cache both location and block.
> (input_gimple_stmt): Likewise.
> * gimple-streamer-out.c (output_phi): Use
> stream_output_location_and_block.
> (output_gimple_stmt): Likewise.
>
> --- gcc/gimple.h.jj 2020-08-03 22:54:51.426531549 +0200
> +++ gcc/gimple.h 2020-09-02 13:51:38.841642793 +0200
> @@ -1879,6 +1879,14 @@ gimple_set_location (gimple *g, location
> g->location = location;
> }
>
> +/* Return address of the location information for statement G. */
> +
> +static inline location_t *
> +gimple_location_ptr (gimple *g)
> +{
> + return &g->location;
> +}
> +
>
> /* Return true if G contains location information. */
>
> @@ -4581,6 +4589,14 @@ gimple_phi_arg_set_location (gphi *phi,
> gimple_phi_arg (phi, i)->locus = loc;
> }
>
> +/* Return address of source location of gimple argument I of phi node PHI. */
> +
> +static inline location_t *
> +gimple_phi_arg_location_ptr (gphi *phi, size_t i)
> +{
> + return &gimple_phi_arg (phi, i)->locus;
> +}
> +
> /* Return TRUE if argument I of phi node PHI has a location record. */
>
> static inline bool
> --- gcc/streamer-hooks.h.jj 2020-01-12 11:54:36.936405518 +0100
> +++ gcc/streamer-hooks.h 2020-09-02 14:18:03.304429642 +0200
> @@ -54,8 +54,15 @@ struct streamer_hooks {
> /* [REQ] Called by every streaming routine that needs to read a location. */
> void (*input_location) (location_t *, struct bitpack_d *, class data_in *);
>
> - /* [REQ] Called by every streaming routine that needs to write a location. */
> - void (*output_location) (struct output_block *, struct bitpack_d *, location_t);
> + /* [REQ] Called by every streaming routine that needs to write a
> + location. */
> + void (*output_location) (struct output_block *, struct bitpack_d *,
> + location_t);
> +
> + /* [REQ] Called by every streaming routine that needs to write a
> + location, both LOCATION_LOCUS and LOCATION_BLOCK. */
> + void (*output_location_and_block) (struct output_block *, struct bitpack_d *,
> + location_t);
> };
>
> #define stream_write_tree(OB, EXPR, REF_P) \
> @@ -73,6 +80,9 @@ struct streamer_hooks {
> #define stream_output_location(OB, BP, LOC) \
> streamer_hooks.output_location (OB, BP, LOC)
>
> +#define stream_output_location_and_block(OB, BP, LOC) \
> + streamer_hooks.output_location_and_block (OB, BP, LOC)
> +
> /* Streamer hooks. */
> extern struct streamer_hooks streamer_hooks;
>
> --- gcc/lto-streamer.h.jj 2020-08-03 22:54:51.429531506 +0200
> +++ gcc/lto-streamer.h 2020-09-02 14:21:13.829639521 +0200
> @@ -262,7 +262,7 @@ typedef void (lto_free_section_data_f) (
>
> /* The location cache holds expanded locations for streamed in trees.
> This is done to reduce memory usage of libcpp linemap that strongly prefers
> - locations to be inserted in the soruce order. */
> + locations to be inserted in the source order. */
>
> class lto_location_cache
> {
> @@ -276,9 +276,13 @@ public:
> void revert_location_cache ();
> void input_location (location_t *loc, struct bitpack_d *bp,
> class data_in *data_in);
> + void input_location_and_block (location_t *loc, struct bitpack_d *bp,
> + class lto_input_block *ib,
> + class data_in *data_in);
> lto_location_cache ()
> : loc_cache (), accepted_length (0), current_file (NULL), current_line (0),
> - current_col (0), current_sysp (false), current_loc (UNKNOWN_LOCATION)
> + current_col (0), current_sysp (false), current_loc (UNKNOWN_LOCATION),
> + current_block (NULL_TREE)
> {
> gcc_assert (!current_cache);
> current_cache = this;
> @@ -304,6 +308,7 @@ private:
> location_t *loc;
> int line, col;
> bool sysp;
> + tree block;
> };
>
> /* The location cache. */
> @@ -325,6 +330,7 @@ private:
> int current_col;
> bool current_sysp;
> location_t current_loc;
> + tree current_block;
> };
>
> /* Structure used as buffer for reading an LTO file. */
> @@ -711,6 +717,7 @@ struct output_block
> int current_line;
> int current_col;
> bool current_sysp;
> + tree current_block;
>
> /* Cache of nodes written in this section. */
> struct streamer_tree_cache_d *writer_cache;
> @@ -881,7 +888,10 @@ void lto_output_decl_state_streams (stru
> void lto_output_decl_state_refs (struct output_block *,
> struct lto_output_stream *,
> struct lto_out_decl_state *);
> -void lto_output_location (struct output_block *, struct bitpack_d *, location_t);
> +void lto_output_location (struct output_block *, struct bitpack_d *,
> + location_t);
> +void lto_output_location_and_block (struct output_block *, struct bitpack_d *,
> + location_t);
> void lto_output_init_mode_table (void);
> void lto_prepare_function_for_streaming (cgraph_node *);
>
> --- gcc/lto-streamer.c.jj 2020-07-28 15:39:09.963756846 +0200
> +++ gcc/lto-streamer.c 2020-09-02 14:19:23.624253409 +0200
> @@ -272,4 +272,5 @@ lto_streamer_hooks_init (void)
> streamer_hooks.read_tree = lto_input_tree;
> streamer_hooks.input_location = lto_input_location;
> streamer_hooks.output_location = lto_output_location;
> + streamer_hooks.output_location_and_block = lto_output_location_and_block;
> }
> --- gcc/lto-streamer-in.c.jj 2020-08-27 18:42:35.604712155 +0200
> +++ gcc/lto-streamer-in.c 2020-09-02 15:23:12.454221865 +0200
> @@ -156,7 +156,18 @@ lto_location_cache::cmp_loc (const void
> return a->sysp ? 1 : -1;
> if (a->line != b->line)
> return a->line - b->line;
> - return a->col - b->col;
> + if (a->col != b->col)
> + return a->col - b->col;
> + if ((a->block == NULL_TREE) != (b->block == NULL_TREE))
> + return a->block ? 1 : -1;
> + if (a->block)
> + {
> + if (BLOCK_NUMBER (a->block) < BLOCK_NUMBER (b->block))
> + return -1;
> + if (BLOCK_NUMBER (a->block) > BLOCK_NUMBER (b->block))
> + return 1;
> + }
> + return 0;
> }
>
> /* Apply all changes in location cache. Add locations into linemap and patch
> @@ -191,22 +202,33 @@ lto_location_cache::apply_location_cache
> linemap_line_start (line_table, loc.line, max + 1);
> }
> gcc_assert (*loc.loc == BUILTINS_LOCATION + 1);
> - if (current_file == loc.file && current_line == loc.line
> - && current_col == loc.col)
> - *loc.loc = current_loc;
> - else
> - current_loc = *loc.loc = linemap_position_for_column (line_table,
> - loc.col);
> + if (current_file != loc.file
> + || current_line != loc.line
> + || current_col != loc.col)
> + {
> + current_loc = linemap_position_for_column (line_table, loc.col);
> + if (loc.block)
> + current_loc = set_block (current_loc, loc.block);
> + }
> + else if (current_block != loc.block)
> + {
> + if (loc.block)
> + current_loc = set_block (current_loc, loc.block);
> + else
> + current_loc = LOCATION_LOCUS (current_loc);
> + }
> + *loc.loc = current_loc;
> current_line = loc.line;
> prev_file = current_file = loc.file;
> current_col = loc.col;
> + current_block = loc.block;
> }
> loc_cache.truncate (0);
> accepted_length = 0;
> return true;
> }
>
> -/* Tree merging did not suceed; mark all changes in the cache as accepted. */
> +/* Tree merging did not succeed; mark all changes in the cache as accepted. */
>
> void
> lto_location_cache::accept_location_cache ()
> @@ -215,7 +237,7 @@ lto_location_cache::accept_location_cach
> accepted_length = loc_cache.length ();
> }
>
> -/* Tree merging did suceed; throw away recent changes. */
> +/* Tree merging did succeed; throw away recent changes. */
>
> void
> lto_location_cache::revert_location_cache ()
> @@ -223,33 +245,46 @@ lto_location_cache::revert_location_cach
> loc_cache.truncate (accepted_length);
> }
>
> -/* Read a location bitpack from input block IB and either update *LOC directly
> - or add it to the location cache.
> +/* Read a location bitpack from bit pack BP and either update *LOC directly
> + or add it to the location cache. If IB is non-NULL, stream in a block
> + afterwards.
> It is neccesary to call apply_location_cache to get *LOC updated. */
>
> void
> -lto_location_cache::input_location (location_t *loc, struct bitpack_d *bp,
> - class data_in *data_in)
> +lto_location_cache::input_location_and_block (location_t *loc,
> + struct bitpack_d *bp,
> + class lto_input_block *ib,
> + class data_in *data_in)
> {
> static const char *stream_file;
> static int stream_line;
> static int stream_col;
> static bool stream_sysp;
> - bool file_change, line_change, column_change;
> + static tree stream_block;
>
> gcc_assert (current_cache == this);
>
> *loc = bp_unpack_int_in_range (bp, "location", 0, RESERVED_LOCATION_COUNT);
>
> if (*loc < RESERVED_LOCATION_COUNT)
> - return;
> + {
> + if (ib)
> + {
> + bool block_change = bp_unpack_value (bp, 1);
> + if (block_change)
> + stream_block = stream_read_tree (ib, data_in);
> + if (stream_block)
> + *loc = set_block (*loc, stream_block);
> + }
> + return;
> + }
>
> /* Keep value RESERVED_LOCATION_COUNT in *loc as linemap lookups will
> ICE on it. */
>
> - file_change = bp_unpack_value (bp, 1);
> - line_change = bp_unpack_value (bp, 1);
> - column_change = bp_unpack_value (bp, 1);
> + bool file_change = bp_unpack_value (bp, 1);
> + bool line_change = bp_unpack_value (bp, 1);
> + bool column_change = bp_unpack_value (bp, 1);
>
> if (file_change)
> {
> @@ -263,21 +298,48 @@ lto_location_cache::input_location (loca
> if (column_change)
> stream_col = bp_unpack_var_len_unsigned (bp);
>
> - /* This optimization saves location cache operations druing gimple
> + tree block = NULL_TREE;
> + if (ib)
> + {
> + bool block_change = bp_unpack_value (bp, 1);
> + if (block_change)
> + stream_block = stream_read_tree (ib, data_in);
> + block = stream_block;
> + }
> +
> + /* This optimization saves location cache operations during gimple
> streaming. */
>
> - if (current_file == stream_file && current_line == stream_line
> - && current_col == stream_col && current_sysp == stream_sysp)
> - {
> - *loc = current_loc;
> + if (current_file == stream_file
> + && current_line == stream_line
> + && current_col == stream_col
> + && current_sysp == stream_sysp)
> + {
> + if (current_block == block)
> + *loc = current_loc;
> + else if (block)
> + *loc = set_block (current_loc, block);
> + else
> + *loc = LOCATION_LOCUS (current_loc);
> return;
> }
>
> struct cached_location entry
> - = {stream_file, loc, stream_line, stream_col, stream_sysp};
> + = {stream_file, loc, stream_line, stream_col, stream_sysp, block};
> loc_cache.safe_push (entry);
> }
>
> +/* Read a location bitpack from bit pack BP and either update *LOC directly
> + or add it to the location cache.
> + It is neccesary to call apply_location_cache to get *LOC updated. */
> +
> +void
> +lto_location_cache::input_location (location_t *loc, struct bitpack_d *bp,
> + class data_in *data_in)
> +{
> + return input_location_and_block (loc, bp, NULL, data_in);
> +}
> +
> /* Read a location bitpack from input block IB and either update *LOC directly
> or add it to the location cache.
> It is neccesary to call apply_location_cache to get *LOC updated. */
> @@ -1101,6 +1163,9 @@ input_function (tree fn_decl, class data
> tag = streamer_read_record_start (ib);
> }
>
> + /* Finalize gimple_location/gimple_block of stmts and phis. */
> + data_in->location_cache.apply_location_cache ();
> +
> /* Fix up the call statements that are mentioned in the callgraph
> edges. */
> set_gimple_stmt_max_uid (cfun, 0);
> --- gcc/lto-streamer-out.c.jj 2020-07-28 15:39:09.963756846 +0200
> +++ gcc/lto-streamer-out.c 2020-09-02 15:16:27.634141378 +0200
> @@ -60,6 +60,10 @@ clear_line_info (struct output_block *ob
> ob->current_line = 0;
> ob->current_col = 0;
> ob->current_sysp = false;
> + /* Initialize to something that will never appear as block,
> + so that the first location with block in a function etc.
> + always streams a change_block bit and the first block. */
> + ob->current_block = void_node;
> }
>
>
> @@ -178,40 +182,72 @@ tree_is_indexable (tree t)
> After outputting bitpack, lto_output_location_data has
> to be done to output actual data. */
>
> -void
> -lto_output_location (struct output_block *ob, struct bitpack_d *bp,
> - location_t loc)
> +static void
> +lto_output_location_1 (struct output_block *ob, struct bitpack_d *bp,
> + location_t orig_loc, bool block_p)
> {
> - expanded_location xloc;
> + location_t loc = LOCATION_LOCUS (orig_loc);
>
> - loc = LOCATION_LOCUS (loc);
> bp_pack_int_in_range (bp, 0, RESERVED_LOCATION_COUNT,
> loc < RESERVED_LOCATION_COUNT
> ? loc : RESERVED_LOCATION_COUNT);
> - if (loc < RESERVED_LOCATION_COUNT)
> - return;
> -
> - xloc = expand_location (loc);
> + if (loc >= RESERVED_LOCATION_COUNT)
> + {
> + expanded_location xloc = expand_location (loc);
>
> - bp_pack_value (bp, ob->current_file != xloc.file, 1);
> - bp_pack_value (bp, ob->current_line != xloc.line, 1);
> - bp_pack_value (bp, ob->current_col != xloc.column, 1);
> + bp_pack_value (bp, ob->current_file != xloc.file, 1);
> + bp_pack_value (bp, ob->current_line != xloc.line, 1);
> + bp_pack_value (bp, ob->current_col != xloc.column, 1);
> +
> + if (ob->current_file != xloc.file)
> + {
> + bp_pack_string (ob, bp, remap_debug_filename (xloc.file), true);
> + bp_pack_value (bp, xloc.sysp, 1);
> + }
> + ob->current_file = xloc.file;
> + ob->current_sysp = xloc.sysp;
> +
> + if (ob->current_line != xloc.line)
> + bp_pack_var_len_unsigned (bp, xloc.line);
> + ob->current_line = xloc.line;
> +
> + if (ob->current_col != xloc.column)
> + bp_pack_var_len_unsigned (bp, xloc.column);
> + ob->current_col = xloc.column;
> + }
>
> - if (ob->current_file != xloc.file)
> + if (block_p)
> {
> - bp_pack_string (ob, bp, remap_debug_filename (xloc.file), true);
> - bp_pack_value (bp, xloc.sysp, 1);
> + tree block = LOCATION_BLOCK (orig_loc);
> + bp_pack_value (bp, ob->current_block != block, 1);
> + streamer_write_bitpack (bp);
> + if (ob->current_block != block)
> + lto_output_tree (ob, block, true, true);
> + ob->current_block = block;
> }
> - ob->current_file = xloc.file;
> - ob->current_sysp = xloc.sysp;
> +}
> +
> +/* Output info about new location into bitpack BP.
> + After outputting bitpack, lto_output_location_data has
> + to be done to output actual data. */
>
> - if (ob->current_line != xloc.line)
> - bp_pack_var_len_unsigned (bp, xloc.line);
> - ob->current_line = xloc.line;
> -
> - if (ob->current_col != xloc.column)
> - bp_pack_var_len_unsigned (bp, xloc.column);
> - ob->current_col = xloc.column;
> +void
> +lto_output_location (struct output_block *ob, struct bitpack_d *bp,
> + location_t loc)
> +{
> + lto_output_location_1 (ob, bp, loc, false);
> +}
> +
> +/* Output info about new location into bitpack BP.
> + After outputting bitpack, lto_output_location_data has
> + to be done to output actual data. Like lto_output_location, but
> + additionally output LOCATION_BLOCK info too and write the BP bitpack. */
> +
> +void
> +lto_output_location_and_block (struct output_block *ob, struct bitpack_d *bp,
> + location_t loc)
> +{
> + lto_output_location_1 (ob, bp, loc, true);
> }
>
>
> --- gcc/gimple-streamer-in.c.jj 2020-01-12 11:54:36.625410210 +0100
> +++ gcc/gimple-streamer-in.c 2020-09-02 13:53:39.716871790 +0200
> @@ -57,11 +57,7 @@ input_phi (class lto_input_block *ib, ba
> tree def = stream_read_tree (ib, data_in);
> int src_index = streamer_read_uhwi (ib);
> bitpack_d bp = streamer_read_bitpack (ib);
> - /* Do not cache a location - we do not have API to get pointer to the
> - location in PHI statement and we may trigger reallocation. */
> - location_t arg_loc = stream_input_location_now (&bp, data_in);
> basic_block sbb = BASIC_BLOCK_FOR_FN (fn, src_index);
> -
> edge e = NULL;
> int j;
>
> @@ -72,7 +68,11 @@ input_phi (class lto_input_block *ib, ba
> break;
> }
>
> - add_phi_arg (result, def, e, arg_loc);
> + add_phi_arg (result, def, e, UNKNOWN_LOCATION);
> + /* Read location and lexical block information. */
> + location_t *arg_locp = gimple_phi_arg_location_ptr (result, e->dest_idx);
> + data_in->location_cache.input_location_and_block (arg_locp, &bp, ib,
> + data_in);
> }
>
> return result;
> @@ -106,12 +106,9 @@ input_gimple_stmt (class lto_input_block
> has_hist = bp_unpack_value (&bp, 1);
> stmt->subcode = bp_unpack_var_len_unsigned (&bp);
>
> - /* Read location information. Caching here makes no sense until streamer
> - cache can handle the following gimple_set_block. */
> - gimple_set_location (stmt, stream_input_location_now (&bp, data_in));
> -
> - /* Read lexical block reference. */
> - gimple_set_block (stmt, stream_read_tree (ib, data_in));
> + /* Read location and lexical block information. */
> + data_in->location_cache.input_location_and_block (gimple_location_ptr (stmt),
> + &bp, ib, data_in);
>
> /* Read in all the operands. */
> switch (code)
> --- gcc/gimple-streamer-out.c.jj 2020-01-12 11:54:36.625410210 +0100
> +++ gcc/gimple-streamer-out.c 2020-09-02 14:34:20.360123419 +0200
> @@ -48,8 +48,8 @@ output_phi (struct output_block *ob, gph
> stream_write_tree (ob, gimple_phi_arg_def (phi, i), true);
> streamer_write_uhwi (ob, gimple_phi_arg_edge (phi, i)->src->index);
> bitpack_d bp = bitpack_create (ob->main_stream);
> - stream_output_location (ob, &bp, gimple_phi_arg_location (phi, i));
> - streamer_write_bitpack (&bp);
> + location_t loc = gimple_phi_arg_location (phi, i);
> + stream_output_location_and_block (ob, &bp, loc);
> }
> }
>
> @@ -84,12 +84,8 @@ output_gimple_stmt (struct output_block
> bp_pack_value (&bp, hist != NULL, 1);
> bp_pack_var_len_unsigned (&bp, stmt->subcode);
>
> - /* Emit location information for the statement. */
> - stream_output_location (ob, &bp, LOCATION_LOCUS (gimple_location (stmt)));
> - streamer_write_bitpack (&bp);
> -
> - /* Emit the lexical block holding STMT. */
> - stream_write_tree (ob, gimple_block (stmt), true);
> + /* Emit location information for the statement, including gimple_block. */
> + stream_output_location_and_block (ob, &bp, gimple_location (stmt));
>
> /* Emit the operands. */
> switch (gimple_code (stmt))
>
> Jakub
>
>
--
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)
More information about the Gcc-patches
mailing list