On 02/01/2016 05:58 PM, Ulrich Weigand wrote:
> Andreas Krebbel wrote:
>> On 02/01/2016 02:30 PM, Ulrich Weigand wrote:
>>> This seems to add just a single alternative.  Is that OK if it gets
>>> substituted into a pattern that used multiple alternatives otherwise?
>> Yes.  This is supposed to work.  The new constraint will be duplicated until 
>> it matches the number
>> of alternatives in the original insn.
> 
> OK, that makes sense.   But now I'm wondering about this bit of
> the ashiftrt patch:
> 
> +; FIXME: The number of alternatives is doubled here to match the fix
> +; number of 4 in the subst pattern for the (clobber (match_scratch...
> +; The right fix should be to support match_scratch in the output
> +; pattern of a define_subst.
> 
> +(define_subst "cconly_subst"
> +  [(set (match_operand:DSI 0 ""           "")
> +        (match_operand:DSI 1 "" ""))
> +   (clobber (reg:CC CC_REGNUM))]
> +  "s390_match_ccmode(insn, CCSmode)"
> +  [(set (reg CC_REGNUM)
> +     (compare (match_dup 1) (const_int 0)))
> +   (clobber (match_scratch:DSI 0 "=d,d,d,d"))])
> 
> I guess this is where the number 4 comes from?  But if the alternatives
> are duplicated, shouldn't it then work to simply use:
>    (clobber (match_scratch:DSI 0 "=d"))])

As the comment tries (and fails) to say the duplication of constraints 
currently does not seem to
work for match_scratch - only for match_operand.  This is just an ugly way to 
work around this for
now. The real fix is to enable match_scratch as well.

>>>> +; In the subst pattern we have to disable the alternative where op2 is
>>>> +; already a constant.  This attribute is supposed to be used in the
>>>> +; "disabled" insn attribute to achieve this.
>>>> +(define_subst_attr "addr_style_op_disable" "addr_style_op_subst" "0" "1")
>>>
>>> Is this necessary given that the subst adds a REG_P (operands[2])
>>> condition?
>> I wasn't sure about this.  How does reload/lra behave when the constraints 
>> allow more than the insn
>> condition? I expected that reload might remember that one of the 
>> alternatives might take a constant
>> as well and then tries as part of reload inheritance and such things to 
>> actually exploit this?! Just
>> disabling the alternative in order to prevent reload from recording stuff 
>> for that alternative
>> appeared safer to me.
>>
>> On the other hand it is not ideal to have an operands[x] check in the insn 
>> condition in the first
>> place. Especially when using define_substs where the operands get renumbered 
>> this might add hard to
>> find bugs. Perhaps I should try replacing the insn predicate with a 
>> subst_attr instead? Is having a
>> constraint which allows more than a predicate any better than having the 
>> same with the insn condition?
> 
> Hmm.  In theory reload should always respect both constraints and predicates.
> But I guess it can't hurt to disable the alternative just to be safe; it is
> indeed an uncommon case to have the constraint accept more than the predicate.
> (Also a PLUS with two CONST_INT operands is not canonical RTL anyway.)

Does this mean you would prefer to convert the insn condition into a predicate 
and change it with
subst_attr or should I leave it in the insn condition?

-Andreas-

> 
> Bye,
> Ulrich
> 

Reply via email to