Kyrylo Tkachov <[email protected]> writes:
>> diff --git a/gcc/config/aarch64/aarch64-sve2.md 
>> b/gcc/config/aarch64/aarch64-sve2.md
>> index a3cbbce8b31..d82dc41df3e 100644
>> --- a/gcc/config/aarch64/aarch64-sve2.md
>> +++ b/gcc/config/aarch64/aarch64-sve2.md
>> @@ -1124,6 +1124,42 @@
>>   [(set_attr "movprfx" "yes")]
>> )
>> 
>> +;; Predicated binary operations with no reverse form, merging with
>> +;; the second input.
>> +(define_insn_and_rewrite "*cond_<sve_int_op><mode>_3"
>> +  [(set (match_operand:SVE_FULL_I 0 "register_operand")
>> + (unspec:SVE_FULL_I
>> +   [(match_operand:<VPRED> 1 "register_operand")
>> +    (unspec:SVE_FULL_I
>> +      [(match_operand 5)
>> +       (unspec:SVE_FULL_I
>> + [(match_operand:SVE_FULL_I 2 "register_operand")
>> +  (match_operand:SVE_FULL_I 3 "register_operand")]
>> + SVE2_COND_INT_BINARY_NOREV)]
>> +      UNSPEC_PRED_X)
>> +    (match_operand:SVE_FULL_I 4 "register_operand")]
>> +   UNSPEC_SEL))]
>> +  "TARGET_SVE2
>
>
> The define_insn-related constructs should really have constraints for the 
> operands.
> I know they will be likely be split before reload when it matters, but
> it’s not impossible that they can reach RA, and so the pattern should
> have information for which constraints to use.

Also, this is a define_insn_and_rewrite, so any "split" is from this
define_insn to itself.  Once the define_insn is matched, it will be used
by the RA in some form.

(For avoidance of doubt, operand 5 can stay as-is.  Only the
register_operands need constraints.)

Thanks,
Richard

> Ok with constraints added to the operands.
> Sorry for the long delay.
> Thanks,
> Kyrill 
>
>> +   && rtx_equal_p (operands[3], operands[4])"
>> +  "#"
>> +  "&& 1"
>> +  {
>> +    if (reload_completed
>> +        && register_operand (operands[4], <MODE>mode)
>> +        && !rtx_equal_p (operands[0], operands[4]))
>> +      {
>> + emit_insn (gen_vcond_mask_<mode><vpred> (operands[0], operands[2],
>> +  operands[4], operands[1]));
>> + operands[4] = operands[2] = operands[0];
>> +      }
>> +    else if (!CONSTANT_P (operands[5]))
>> +      operands[5] = CONSTM1_RTX (<VPRED>mode);
>> +    else
>> +      FAIL;
>> +  }
>> +  [(set_attr "movprfx" "yes")]
>> +)
>> +
>> ;; Predicated binary operations with no reverse form, merging with zero.
>> ;; At present we don't generate these patterns via a cond_* optab,
>> ;; so there's no correctness requirement to handle merging with an
>> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/pr121599.c 
>> b/gcc/testsuite/gcc.target/aarch64/sve2/pr121599.c
>> new file mode 100644
>> index 00000000000..dbfa613649d
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/pr121599.c
>> @@ -0,0 +1,31 @@
>> +/* PR target/121599.  */
>> +/* { dg-do compile } */
>> +/* { dg-options "-O2" } */
>> +/* { dg-final { check-function-bodies "**" "" "" } } */
>> +
>> +#include <arm_sve.h>
>> +
>> +/*
>> +** foo:
>> +** movi d([0-9]+), #0
>> +** sel z0\.b, p0, z0\.b, z\1\.b
>> +** usqadd z0\.b, p0/m, z0\.b, z\1\.b
>> +** ret
>> +*/
>> +svuint8_t foo (svbool_t pg, svuint8_t op1)
>> +{
>> +    return svsqadd_u8_z (pg, op1, svdup_s8 (0));
>> +}
>> +
>> +/*
>> +** bar:
>> +** movi d([0-9]+), #0
>> +** sel z0\.b, p0, z0\.b, z\1\.b
>> +** suqadd z0\.b, p0/m, z0\.b, z\1\.b
>> +** ret
>> +*/
>> +svint8_t bar (svbool_t pg, svint8_t op1)
>> +{
>> +    return svuqadd_n_s8_z (pg, op1, 0);
>> +}
>> +
>> -- 
>> 2.34.1
>>> 
>>> Thanks,
>>> Kyrill
>>> 
>>>> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/pr121599.c 
>>>> b/gcc/testsuite/gcc.target/aarch64/sve2/pr121599.c
>>>> new file mode 100644
>>>> index 00000000000..cd80ef9115c
>>>> --- /dev/null
>>>> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/pr121599.c
>>>> @@ -0,0 +1,31 @@
>>>> +/* PR target/121599.  */
>>>> +/* { dg-do compile } */
>>>> +/* { dg-options "-O2" } */
>>>> +/* { dg-final { check-function-bodies "**" "" "" } } */
>>>> +
>>>> +#include <arm_sve.h>
>>>> +
>>>> +/*
>>>> +** foo:
>>>> +** movi d([0-9]+), #0
>>>> +** movprfx z0\.b, p0/z, z0\.b
>>>> +** usqadd z0\.b, p0/m, z0\.b, z\1\.b
>>>> +** ret
>>>> +*/
>>>> +svuint8_t foo (svbool_t pg, svuint8_t op1)
>>>> +{
>>>> +    return svsqadd_u8_z (pg, op1, svdup_s8 (0));
>>>> +}
>>>> +
>>>> +/*
>>>> +** bar:
>>>> +** movi d([0-9]+), #0
>>>> +** movprfx z0\.b, p0/z, z0\.b
>>>> +** suqadd z0\.b, p0/m, z0\.b, z\1\.b
>>>> +** ret
>>>> +*/
>>>> +svint8_t bar (svbool_t pg, svint8_t op1)
>>>> +{
>>>> +    return svuqadd_n_s8_z (pg, op1, 0);
>>>> +}
>>>> +
>>>> -- 
>>>> 2.34.1

Reply via email to