This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] lra: fix spill_hard_reg_in_range clobber check
- From: Ilya Leoshkevich <iii at linux dot ibm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: vmakarov at gcc dot gnu dot org, asolokha at gmx dot com, bergner at vnet dot ibm dot com, krebbel at linux dot ibm dot com, rdapp at linux dot ibm dot com, Ilya Leoshkevich <iii at linux dot ibm dot com>
- Date: Tue, 16 Oct 2018 11:17:27 +0200
- Subject: [PATCH] lra: fix spill_hard_reg_in_range clobber check
Bootstrap and regtest are running on x86_64-redhat-linux.
Insns in FROM..TO range might not be recognized yet, and their
corresponding entries in lra_insn_recog_data[] might be NULLs. In the
code from PR87596 the problematic insn is merely
(note 148 154 68 7 NOTE_INSN_DELETED)
however I assume that non-note insns may occur as well. So make sure
they are recognized before touching their lra_insn_recog_data_t.
gcc/ChangeLog:
2018-10-16 Ilya Leoshkevich <iii@linux.ibm.com>
PR rtl-optimization/87596
* lra-constraints.c (spill_hard_reg_in_range): Use
lra_get_insn_recog_data () instead of lra_insn_recog_data[]
for instructions in FROM..TO range.
gcc/testsuite/ChangeLog:
2018-10-16 Ilya Leoshkevich <iii@linux.ibm.com>
PR rtl-optimization/87596
* gcc.target/i386/pr87596.c: New test.
---
gcc/lra-constraints.c | 3 ++-
gcc/testsuite/gcc.target/i386/pr87596.c | 16 ++++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.target/i386/pr87596.c
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 774d1ff3aaa..0d9cac07fb2 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -5696,10 +5696,11 @@ 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)];
+ lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
struct lra_static_insn_data *static_id = id->insn_static_data;
struct lra_insn_reg *reg;
+ uid = INSN_UID (insn);
if (bitmap_bit_p (&lra_reg_info[hard_regno].insn_bitmap, uid))
break;
for (reg = static_id->hard_regs; reg != NULL; reg = reg->next)
diff --git a/gcc/testsuite/gcc.target/i386/pr87596.c b/gcc/testsuite/gcc.target/i386/pr87596.c
new file mode 100644
index 00000000000..764708b694a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr87596.c
@@ -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;
+ }
+}
--
2.19.0