> Am 17.07.2024 um 23:13 schrieb Richard Sandiford <richard.sandif...@arm.com>:
>
> Andrew Pinski <pins...@gmail.com> writes:
>>> On Wed, Jul 17, 2024 at 1:03 PM Tamar Christina <tamar.christ...@arm.com>
>>> wrote:
>>>
>>>> -----Original Message-----
>>>> From: Richard Sandiford <richard.sandif...@arm.com>
>>>> Sent: Wednesday, July 17, 2024 8:55 PM
>>>> To: Richard Biener <richard.guent...@gmail.com>
>>>> Cc: pan2...@intel.com; gcc-patches@gcc.gnu.org; juzhe.zh...@rivai.ai;
>>>> kito.ch...@gmail.com; Tamar Christina <tamar.christ...@arm.com>;
>>>> jeffreya...@gmail.com; rdapp....@gmail.com; hongtao....@intel.com
>>>> Subject: Re: [PATCH v1] Match: Bugfix .SAT_TRUNC honor types has no mode
>>>> precision [PR115961]
>>>>
>>>> Richard Biener <richard.guent...@gmail.com> writes:
>>>>> On Wed, Jul 17, 2024 at 11:48 AM <pan2...@intel.com> wrote:
>>>>>>
>>>>>> From: Pan Li <pan2...@intel.com>
>>>>>>
>>>>>> The .SAT_TRUNC matching doesn't check the type has mode precision. Thus
>>>>>> when bitfield like below will be recog as .SAT_TRUNC.
>>>>>>
>>>>>> struct e
>>>>>> {
>>>>>> unsigned pre : 12;
>>>>>> unsigned a : 4;
>>>>>> };
>>>>>>
>>>>>> __attribute__((noipa))
>>>>>> void bug (e * v, unsigned def, unsigned use) {
>>>>>> e & defE = *v;
>>>>>> defE.a = min_u (use + 1, 0xf);
>>>>>> }
>>>>>>
>>>>>> This patch would like to add type_has_mode_precision_p for the
>>>>>> .SAT_TRUNC matching to get rid of this.
>>>>>>
>>>>>> The below test suites are passed for this patch:
>>>>>> 1. The rv64gcv fully regression tests.
>>>>>> 2. The x86 bootstrap tests.
>>>>>> 3. The x86 fully regression tests.
>>>>>
>>>>> Hmm, rather than restricting the matching the issue is the optab query or
>>>>> in this case how *_optab_supported_p blindly uses TYPE_MODE without
>>>>> either asserting the type has mode precision or failing the query in this
>>>>> case.
>>>>>
>>>>> I think it would be simplest to adjust direct_optab_supported_p
>>>>> (and convert_optab_supported_p) to reject such operations? Richard, do
>>>>> you agree or should callers check this instead?
>>>>
>>>> Sounds good to me, although I suppose it should go:
>>>>
>>>> bool
>>>> direct_internal_fn_supported_p (internal_fn fn, tree_pair types,
>>>> optimization_type opt_type)
>>>> {
>>>> // <--- Here
>>>> switch (fn)
>>>> {
>>>>
>>>> }
>>>> }
>>>>
>>>> until we know of a specific case where that's wrong.
>>>>
>>>> Is type_has_mode_precision_p meaningful for all types?
>>>>
>>>
>>> I was wondering about that, wouldn't VECTOR_BOOLEAN_TYPE_P types fail?
>>> e.g. on AVX where the type precision is 1 but the mode precision QImode?
>>>
>>> Unless I misunderstood the predicate.
>>
>> So type_has_mode_precision_p only works with scalar integral types
>> (maybe scalar real types too) since it uses TYPE_PRECISION directly
>> and not element_precision (the precision field is overloaded for
>> vectors for the number of elements and TYPE_PRECISION on a vector type
>> will cause an ICE since r14-2150-gfe48f2651334bc).
>> So I suspect you need to check !VECTOR_TYPE_P (type) before calling
>> type_has_mode_precision_p .
>
> I think for VECTOR_TYPE_P it would be worth checking VECTOR_MODE_P instead,
> if we're not requiring callers to check this kind of thing.
>
> So something like:
>
> bool
> mode_describes_type_p (const_tree type)
> {
> if (VECTOR_TYPE_P (type))
> return VECTOR_MODE_P (TREE_TYPE (type));
That’s a good point and another mistake that keeps popping up. I hope the
generic vector support passes in a scalar type when checking for support on the
underlying integer mode…
>
> if (INTEGRAL_TYPE_P (type))
> return type_has_mode_precision_p (type);
>
> if (SCALAR_FLOAT_TYPE_P (type))
> return true;
>
> return false;
> }
>
> ? Possibly also with complex handling if we need that.
>
> Richard