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 <i...@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 <i...@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