On 6/6/19 6:33 AM, Richard Sandiford wrote:
> Kugan Vivekanandarajah <kugan.vivekanandara...@linaro.org> writes:
>> Hi Richard,
>>
>> On Thu, 6 Jun 2019 at 22:07, Richard Sandiford
>> <richard.sandif...@arm.com> wrote:
>>>
>>> Kugan Vivekanandarajah <kugan.vivekanandara...@linaro.org> writes:
>>>> Hi Richard,
>>>>
>>>> On Thu, 6 Jun 2019 at 19:35, Richard Sandiford
>>>> <richard.sandif...@arm.com> wrote:
>>>>>
>>>>> Kugan Vivekanandarajah <kugan.vivekanandara...@linaro.org> writes:
>>>>>> Hi Richard,
>>>>>>
>>>>>> Thanks for the review. Attached is the latest patch.
>>>>>>
>>>>>> For testcase like cond_arith_1.c, with the patch, gcc ICE in fwprop. I
>>>>>> am limiting fwprop in cases like this. Is there a better fix for this?
>>>>>> index cf2c9de..2c99285 100644
>>>>>> --- a/gcc/fwprop.c
>>>>>> +++ b/gcc/fwprop.c
>>>>>> @@ -1358,6 +1358,15 @@ forward_propagate_and_simplify (df_ref use,
>>>>>> rtx_insn *def_insn, rtx def_set)
>>>>>>    else
>>>>>>      mode = GET_MODE (*loc);
>>>>>>
>>>>>> +  /* TODO. We can't get the mode for
>>>>>> +     (set (reg:VNx16BI 109)
>>>>>> +          (unspec:VNx16BI [
>>>>>> +        (reg:SI 131)
>>>>>> +        (reg:SI 106)
>>>>>> +           ] UNSPEC_WHILE_LO))
>>>>>> +     Thus, bailout when it is UNSPEC and MODEs are not compatible.  */
>>>>>> +  if (GET_MODE_CLASS (mode) != GET_MODE_CLASS (GET_MODE (reg)))
>>>>>> +    return false;
>>>>>>    new_rtx = propagate_rtx (*loc, mode, reg, src,
>>>>>>                   optimize_bb_for_speed_p (BLOCK_FOR_INSN (use_insn)));
>>>>>
>>>>> What specifically goes wrong?  The unspec above isn't that unusual --
>>>>> many unspecs have different modes from their inputs.
>>>>
>>>> cond_arith_1.c:38:1: internal compiler error: in paradoxical_subreg_p,
>>>> at rtl.h:3130
>>>> 0x135f1d3 paradoxical_subreg_p(machine_mode, machine_mode)
>>>>         ../../88838/gcc/rtl.h:3130
>>>> 0x135f1d3 propagate_rtx
>>>>         ../../88838/gcc/fwprop.c:683
>>>> 0x135f4a3 forward_propagate_and_simplify
>>>>         ../../88838/gcc/fwprop.c:1371
>>>> 0x135f4a3 forward_propagate_into
>>>>         ../../88838/gcc/fwprop.c:1430
>>>> 0x135fdcb fwprop
>>>>         ../../88838/gcc/fwprop.c:1519
>>>> 0x135fdcb execute
>>>>         ../../88838/gcc/fwprop.c:1550
>>>> Please submit a full bug report,
>>>> with preprocessed source if appropriate.
>>>>
>>>>
>>>> in forward_propagate_and_simplify
>>>>
>>>> use_set:
>>>> (set (reg:VNx16BI 96 [ loop_mask_52 ])
>>>>     (unspec:VNx16BI [
>>>>             (reg:SI 92 [ _3 ])
>>>>             (reg:SI 95 [ niters.36 ])
>>>>         ] UNSPEC_WHILE_LO))
>>>>
>>>> reg:
>>>> (reg:SI 92 [ _3 ])
>>>>
>>>> *loc:
>>>> (unspec:VNx16BI [
>>>>         (reg:SI 92 [ _3 ])
>>>>         (reg:SI 95 [ niters.36 ])
>>>>     ] UNSPEC_WHILE_LO)
>>>>
>>>> src:
>>>> (subreg:SI (reg:DI 136 [ ivtmp_101 ]) 0)
>>>>
>>>> use_insn:
>>>> (insn 87 86 88 4 (parallel [
>>>>             (set (reg:VNx16BI 96 [ loop_mask_52 ])
>>>>                 (unspec:VNx16BI [
>>>>                         (reg:SI 92 [ _3 ])
>>>>                         (reg:SI 95 [ niters.36 ])
>>>>                     ] UNSPEC_WHILE_LO))
>>>>             (clobber (reg:CC 66 cc))
>>>>         ]) 4255 {while_ultsivnx16bi}
>>>>      (expr_list:REG_UNUSED (reg:CC 66 cc)
>>>>         (nil)))
>>>>
>>>> I think we calculate the mode to be VNx16BI which is wrong?
>>>> because of which in propgate_rtx,   !paradoxical_subreg_p (mode,
>>>> GET_MODE (SUBREG_REG (new_rtx)))))  ICE
>>>
>>> Looks like something I hit on the ACLE branch, but didn't have a
>>> non-ACLE reproducer for (see 065881acf0de35ff7818c1fc92769e1c106e1028).
>>>
>>> Does the attached work?  The current call is wrong because "mode"
>>> is the mode of "x", not the mode of "new_rtx".
>>
>> Yes, attached patch works for this testcase. Are you planning to
>> commit it to trunk. I will wait for this.
> 
> Needs approval first. :-)
> 
> The patch was originally bootstrapped & regtested on aarch64-linux-gnu,
> but I'll repeat that for trunk and test x86_64-linux-gnu too.
Assuming that passes this is fine.
jeff

Reply via email to