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