"H.J. Lu" <hjl.to...@gmail.com> writes:
> On Tue, Dec 10, 2013 at 10:26 AM, Richard Sandiford
> <rdsandif...@googlemail.com> wrote:
>> "H.J. Lu" <hjl.to...@gmail.com> writes:
>>> On Tue, Dec 10, 2013 at 9:57 AM, Richard Sandiford
>>> <rdsandif...@googlemail.com> wrote:
>>>> "H.J. Lu" <hjl.to...@gmail.com> writes:
>>>>> On Tue, Dec 10, 2013 at 8:05 AM, Kirill Yukhin
>>>>> <kirill.yuk...@gmail.com> wrote:
>>>>>> On 09 Dec 14:08, H.J. Lu wrote:
>>>>>>>
>>>>>>> There are no regressions on Linux/x86-64 with -m32 and -m64.
>>>>>>> Can you check if it improves code quality on x886?
>>>>>>
>>>>>> As second thought. If Tejas and Richard are right and it is simply
>>>>>> incorrect
>>>>>> to check any offsets in this hook, may be we can end up with patch in the
>>>>>> bottom?
>>>>>
>>>>> What is wrong to pass the correct offset to
>>>>> CANNOT_CHANGE_MODE_CLASS?  Backends are free to
>>>>> ignore it.
>>>>
>>>> The point is that:
>>>>
>>>>>> - /* Vector registers do not support subreg with nonzero offsets,
>>>>>> which
>>>>>> -        are otherwise valid for integer registers.  Since we can't see
>>>>>> -        whether we have a nonzero offset from here, prohibit all
>>>>>> -         nonparadoxical subregs changing size.  */
>>>>>> -      if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
>>>>>> -       return true;
>>>>
>>>> seems to be trying to reject things like (subreg:SF (reg:V4SF X) 1),
>>>> which is always invalid for a single-register V4SF.  See:
>>>
>>> That is correct.
>>
>> Sorry, what I mean is: that subreg is always invalid for single-
>> register V4SFs regardless of the target.  This isn't something that
>> CANNOT_CHANGE_MODE_CLASS should be expected to check.
>>
>
> Why is
>
> (define_insn "*movv4sfdi_subreg"
>  [(set (match_operand:DI 0 "nonimmediate_operand"           "=rxm")
>        (subreg:DI (match_operand:V4SF 1 "register_operand" "x") 0))]
>
> invalid?

Sorry, I don't understand.  I never said it was invalid.  I said
(subreg:SF (reg:V4SF X) 1) was invalid if (reg:V4SF X) represents
a single register.  On a little-endian target, the offset cannot be
anything other than 0 in that case.

So the CANNOT_CHANGE_MODE_CLASS code above seems to be checking for
something that is always invalid, regardless of the target.  That kind
of situation should be rejected by target-independent code instead.

In other words I'm arguing against the idea of passing the offset to
CANNOT_CHANGE_MODE_CLASS (which you seemed to be supporting in the
quote above).  I think Kirill's patch to remove the i386.c check was
the right way to go.

There's no need for a separate insn though.  Once you allow the subregs
(as per Kirill's patch), the normal move patterns will handle them.

Thanks,
Richard

Reply via email to