lra: fix spill_hard_reg_in_range clobber check
authorIlya Leoshkevich <iii@linux.ibm.com>
Fri, 19 Oct 2018 08:33:52 +0000 (08:33 +0000)
committerIlya Leoshkevich <iii@gcc.gnu.org>
Fri, 19 Oct 2018 08:33:52 +0000 (08:33 +0000)
FROM..TO range might contain NOTE_INSN_DELETED insns, for which the
corresponding entries in lra_insn_recog_data[] are NULLs.  Example from
the problematic code from PR87596:

    (note 148 154 68 7 NOTE_INSN_DELETED)

lra_insn_recog_data[] is used directly only when the insn in question
is taken from insn_bitmap, which is not the case here.  In other
situations lra_get_insn_recog_data () guarded by INSN_P () or other
stricter predicate are used.  So we need to do this here as well.

A tiny detail worth noting: I put the INSN_P () check before the
insn_bitmap check, because I believe that insn_bitmap can contain only
real insns anyway.

gcc/ChangeLog:

2018-10-19  Ilya Leoshkevich  <iii@linux.ibm.com>

PR rtl-optimization/87596
* lra-constraints.c (spill_hard_reg_in_range): Use INSN_P () +
lra_get_insn_recog_data () instead of lra_insn_recog_data[]
for instructions in FROM..TO range.

gcc/testsuite/ChangeLog:

2018-10-19  Ilya Leoshkevich  <iii@linux.ibm.com>

PR rtl-optimization/87596
* gcc.target/i386/pr87596.c: New test.

From-SVN: r265306

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr87596.c [new file with mode: 0644]

index 88ec686..1b91d7d 100644 (file)
@@ -1,3 +1,10 @@
+2018-10-19  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       PR rtl-optimization/87596
+       * lra-constraints.c (spill_hard_reg_in_range): Use INSN_P () +
+       lra_get_insn_recog_data () instead of lra_insn_recog_data[]
+       for instructions in FROM..TO range.
+
 2018-10-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * cfgexpand.c (expand_one_var): Use specific wording in error message
index 774d1ff..3cbe046 100644 (file)
@@ -5696,12 +5696,15 @@ spill_hard_reg_in_range (int regno, enum reg_class rclass, rtx_insn *from, rtx_i
        continue;
       for (insn = from; insn != NEXT_INSN (to); insn = NEXT_INSN (insn))
        {
-         lra_insn_recog_data_t id = lra_insn_recog_data[uid = INSN_UID (insn)];
-         struct lra_static_insn_data *static_id = id->insn_static_data;
+         struct lra_static_insn_data *static_id;
          struct lra_insn_reg *reg;
 
-         if (bitmap_bit_p (&lra_reg_info[hard_regno].insn_bitmap, uid))
+         if (!INSN_P (insn))
+             continue;
+         if (bitmap_bit_p (&lra_reg_info[hard_regno].insn_bitmap,
+                           INSN_UID (insn)))
            break;
+         static_id = lra_get_insn_recog_data (insn)->insn_static_data;
          for (reg = static_id->hard_regs; reg != NULL; reg = reg->next)
            if (reg->regno == hard_regno)
              break;
index edceccd..705d745 100644 (file)
@@ -1,3 +1,8 @@
+2018-10-19  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       PR rtl-optimization/87596
+       * gcc.target/i386/pr87596.c: New test.
+
 2018-10-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/frame_overflow2.adb: New test.
diff --git a/gcc/testsuite/gcc.target/i386/pr87596.c b/gcc/testsuite/gcc.target/i386/pr87596.c
new file mode 100644 (file)
index 0000000..764708b
--- /dev/null
@@ -0,0 +1,16 @@
+/* LRA corner case which triggered a segfault.  */
+/* Reduced testcase by Arseny Solokha.  */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O1 -fschedule-insns -ftrapv -funroll-all-loops -fno-tree-dominator-opts -fno-tree-loop-im" } */
+    
+void
+wh (__int128 *ku)
+{
+  unsigned int *dp;
+
+  while (*ku < 1)
+    {
+      *dp <<= 32;  /* { dg-warning "left shift count >= width of type" } */
+      ++*ku;
+    }
+}