[mid-end] Add notes to dataflow insn info when re-emitting (PR92410)
authorMatthew Malcomson <matthew.malcomson@arm.com>
Mon, 9 Dec 2019 12:03:53 +0000 (12:03 +0000)
committerMatthew Malcomson <matmal01@gcc.gnu.org>
Mon, 9 Dec 2019 12:03:53 +0000 (12:03 +0000)
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, and these labels not having 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:
  Ran regression tests on aarch64-none-linux-gnu cross compiler.
  Bootstrapped and ran tests on aarch64-none-linux-gnu native.

gcc/ChangeLog:

2019-12-09  Matthew Malcomson  <matthew.malcomson@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-12-09  Matthew Malcomson  <matthew.malcomson@arm.com>

PR middle-end/92410
* gcc.dg/torture/pr92410.c: New test.

From-SVN: r279124

gcc/ChangeLog
gcc/bb-reorder.c
gcc/haifa-sched.c
gcc/regstat.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr92410.c [new file with mode: 0644]

index 58ffe7629e3bbf6ba184c2452150fe0486f5815d..43e838cd9bb3515a8204da7bc4afd71d66a78a40 100644 (file)
@@ -1,3 +1,13 @@
+2019-12-09  Matthew Malcomson  <matthew.malcomson@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.
+
 2019-12-09  Hongtao Liu  <hongtao.liu@intel.com>
 
     * gcc/common/config/i386/i386-common.c
index d1a2f1e1115c5ae4b4557aac1c795d1a4f1d12cb..1cdeac155e303656203a97647438517923d5f977 100644 (file)
@@ -2662,6 +2662,8 @@ pass_reorder_blocks::execute (function *fun)
       bb->aux = bb->next_bb;
   cfg_layout_finalize ();
 
+  FOR_EACH_BB_FN (bb, fun)
+    df_recompute_luids (bb);
   return 0;
 }
 
index 54fb03435cb5568c381ee1a7a258d82271d529e1..d56c40581df4c1cc89af235eda67dfa8a3e66195 100644 (file)
@@ -5432,6 +5432,7 @@ reemit_notes (rtx_insn *insn)
 
          last = emit_note_before (note_type, last);
          remove_note (insn, note);
+         df_insn_create_insn_record (last);
        }
     }
 }
index 4da9b7cc523cde113df931226ea56310b659e619..c6cefb117d7330cc1b9787c37083e05e2acda2d2 100644 (file)
@@ -324,6 +324,7 @@ regstat_bb_compute_calls_crossed (unsigned int bb_index, bitmap live)
 
   FOR_BB_INSNS_REVERSE (bb, insn)
     {
+      gcc_assert (INSN_UID (insn) < DF_INSN_SIZE ());
       struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
       unsigned int regno;
 
index 272a83ec755f55ec09c906938cde71b46b9dd7b4..8361b7837283a2da1d4c4d0b7bac80113a784c44 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-09  Matthew Malcomson  <matthew.malcomson@arm.com>
+
+       PR middle-end/92410
+       * gcc.dg/torture/pr92410.c: New test.
+
 2019-12-09  Sudakshina Das  <sudi.das@arm.com>
 
        * gcc.dg/vect/vect-shift-5.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr92410.c b/gcc/testsuite/gcc.dg/torture/pr92410.c
new file mode 100644 (file)
index 0000000..628e329
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR middle-end/92410  */
+/* { dg-do compile } */
+int v;
+
+int a() {
+  ;
+  return v;
+}