On Tue, 2019-11-12 at 09:11 +0000, Matthew Malcomson wrote:
> In scheduling passes, notes are removed with `remove_notes` before
> the
> 
> scheduling is done, and added back in with `reemit_notes` once the
> 
> scheduling has been decided.
> 
> 
> 
> This process leaves the notes in the RTL chain with different insn
> uid's
> 
> than were there before.  Having different UID's (larger than the
> 
> previous ones) means that DF_INSN_INFO_GET(insn) will access outside
> of
> 
> the allocated array.
> 
> 
> 
> This has been seen in the `regstat_bb_compute_calls_crossed`
> function.
> 
> This patch adds an assert to the `regstat_bb_compute_calls_crossed`
> 
> function so that bad accesses here are caught instead of going
> 
> unnoticed, and then avoids the problem.
> 
> 
> 
> We avoid the problem by ensuring that new notes added by
> `reemit_notes` have an
> 
> insn record given to them.  This is done by adding a call to
> 
> `df_insn_create_insn_record` on each note added in `reemit_notes`.
> 
> `df_insn_create_insn_record` leaves this new record zeroed out, which
> appears
> 
> to be fine for notes (e.g. `df_bb_refs_record` already does not set
> 
> anything except the luid for notes, and notes have no dataflow
> information to
> 
> record).
> 
> 
> 
> We add the testcase that Martin found here
> 
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92410#c2 .
> 
> This testcase fails with the "regstat.c" change, and then succeeds
> with the
> 
> "haifa-sched.c" change.
> 
> 
> 
> There is a similar problem with labels, that the `gcc_assert` catches
> 
> when running regression tests in gcc.dg/fold-eqandshift-1.c and
> 
> gcc.c-torture/compile/pr32482.c.
> 
> This is due to the `cfg_layout_finalize` call in `bb-reorder.c`
> emitting
> 
> new labels for the start of the newly created basic blocks. These
> labels are
> 
> not given a dataflow df_insn_info member.
> 
> 
> 
> We solve this by manually calling `df_recompute_luids` on each basic
> 
> block once this pass has finished.
> 
> 
> 
> Testing done:
> 
>   Bootstrapped and regression test on aarch64-none-linux-gnu native.
> 
> 
> 
> gcc/ChangeLog:
> 
> 
> 
> 2019-11-12  Matthew Malcomson  <matthew.malcom...@arm.com>
> 
> 
> 
>         PR middle-end/92410
> 
>         * bb-reorder.c (pass_reorder_blocks::execute): Recompute
> 
>         dataflow luids once basic blocks have been reordered.
> 
>         * haifa-sched.c (reemit_notes): Create df insn record for
> each
> 
>         new note.
> 
>         * regstat.c (regstat_bb_compute_calls_crossed): Assert every
> 
>         insn has an insn record before trying to use it.
> 
> 
> 
> gcc/testsuite/ChangeLog:
> 
> 
> 
> 2019-11-12  Matthew Malcomson  <matthew.malcom...@arm.com>
> 
> 
> 
>         PR middle-end/92410
> 
>         * gcc.dg/torture/pr92410.c: New test.
> 
OK
jeff

Reply via email to