> Am 16.10.2018 um 16:20 schrieb Jeff Law <l...@redhat.com>:
> 
> On 10/16/18 3:17 AM, Ilya Leoshkevich wrote:
>> 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.
> I think this is just papering over the problem.
> 
> AFAICT for something like a deleted note lra_get_insn_recog_data is
> going to call lra_set_insn_recog_data.  Given that INSN will be a NOTE I
> think icode will end up being -1 and we'll eventually get into this clause:
> 
>  if (icode < 0)
>    {
>      int nop, nalt;
>      machine_mode operand_mode[MAX_RECOG_OPERANDS];
>      const char *constraints[MAX_RECOG_OPERANDS];
> 
>      nop = asm_noperands (PATTERN (insn));
> 
> And I don't think we should be trying to extract the PATTERN of a note.
> 
> I think you need to either filter out the non-insn thingies in
> spill_hard_reg_in_range, or go with your patch plus beefing up the
> checks in lra_set_insn_recog_data.
> 
> jeff
> 

Thanks, you’re absolutely right!

I re-ran the test with --enable-checking=all, and it crashed in another
branch of that if statement:

  else
    {
      insn_extract (insn);  /* Also uses PATTERN ().  */
      data->insn_static_data = insn_static_data

I looked at the usage patterns of lra_insn_recog_data[] and
lra_get_insn_recog_data (), and noticed that we use the former directly
only when the insn in question is taken from insn_bitmap, and the latter
in all other cases.  Furthermore, lra_get_insn_recog_data () is normally
guarded by INSN_P () or something similar.

So I plan to keep using lra_get_insn_recog_data (), but with an extra
INSN_P () check.

Reply via email to