> -----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.

Regards,
Tamar

> Richard
> 
> 
> >
> > So, instead of match.pd the check would need to be in vector pattern 
> > matching
> > and SSA math opts.  Or alternatively in internal-fn.cc as laid out above.
> >
> > Richard.
> >
> >>         PR target/115961
> >>
> >> gcc/ChangeLog:
> >>
> >>         * match.pd: Add type_has_mode_precision_p check for .SAT_TRUNC.
> >>
> >> gcc/testsuite/ChangeLog:
> >>
> >>         * g++.target/i386/pr115961-run-1.C: New test.
> >>         * g++.target/riscv/rvv/base/pr115961-run-1.C: New test.
> >>
> >> Signed-off-by: Pan Li <pan2...@intel.com>
> >> ---
> >>  gcc/match.pd                                  |  4 +--
> >>  .../g++.target/i386/pr115961-run-1.C          | 34 +++++++++++++++++++
> >>  .../riscv/rvv/base/pr115961-run-1.C           | 34 +++++++++++++++++++
> >>  3 files changed, 70 insertions(+), 2 deletions(-)
> >>  create mode 100644 gcc/testsuite/g++.target/i386/pr115961-run-1.C
> >>  create mode 100644 gcc/testsuite/g++.target/riscv/rvv/base/pr115961-run-
> 1.C
> >>
> >> diff --git a/gcc/match.pd b/gcc/match.pd
> >> index 24a0bbead3e..8121ec09f53 100644
> >> --- a/gcc/match.pd
> >> +++ b/gcc/match.pd
> >> @@ -3240,7 +3240,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> >>   (bit_ior:c (negate (convert (gt @0 INTEGER_CST@1)))
> >>     (convert @0))
> >>   (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
> >> -      && TYPE_UNSIGNED (TREE_TYPE (@0)))
> >> +      && TYPE_UNSIGNED (TREE_TYPE (@0)) && type_has_mode_precision_p
> (type))
> >>   (with
> >>    {
> >>     unsigned itype_precision = TYPE_PRECISION (TREE_TYPE (@0));
> >> @@ -3255,7 +3255,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> >>  (match (unsigned_integer_sat_trunc @0)
> >>   (convert (min @0 INTEGER_CST@1))
> >>   (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
> >> -      && TYPE_UNSIGNED (TREE_TYPE (@0)))
> >> +      && TYPE_UNSIGNED (TREE_TYPE (@0)) && type_has_mode_precision_p
> (type))
> >>   (with
> >>    {
> >>     unsigned itype_precision = TYPE_PRECISION (TREE_TYPE (@0));
> >> diff --git a/gcc/testsuite/g++.target/i386/pr115961-run-1.C
> b/gcc/testsuite/g++.target/i386/pr115961-run-1.C
> >> new file mode 100644
> >> index 00000000000..b8c8aef3b17
> >> --- /dev/null
> >> +++ b/gcc/testsuite/g++.target/i386/pr115961-run-1.C
> >> @@ -0,0 +1,34 @@
> >> +/* PR target/115961 */
> >> +/* { dg-do run } */
> >> +/* { dg-options "-O3 -fdump-rtl-expand-details" } */
> >> +
> >> +struct e
> >> +{
> >> +  unsigned pre : 12;
> >> +  unsigned a : 4;
> >> +};
> >> +
> >> +static unsigned min_u (unsigned a, unsigned b)
> >> +{
> >> +  return (b < a) ? b : a;
> >> +}
> >> +
> >> +__attribute__((noipa))
> >> +void bug (e * v, unsigned def, unsigned use) {
> >> +  e & defE = *v;
> >> +  defE.a = min_u (use + 1, 0xf);
> >> +}
> >> +
> >> +__attribute__((noipa, optimize(0)))
> >> +int main(void)
> >> +{
> >> +  e v = { 0xded, 3 };
> >> +
> >> +  bug(&v, 32, 33);
> >> +
> >> +  if (v.a != 0xf)
> >> +    __builtin_abort ();
> >> +
> >> +  return 0;
> >> +}
> >> +/* { dg-final { scan-rtl-dump-not ".SAT_TRUNC " "expand" } } */
> >> diff --git a/gcc/testsuite/g++.target/riscv/rvv/base/pr115961-run-1.C
> b/gcc/testsuite/g++.target/riscv/rvv/base/pr115961-run-1.C
> >> new file mode 100644
> >> index 00000000000..b8c8aef3b17
> >> --- /dev/null
> >> +++ b/gcc/testsuite/g++.target/riscv/rvv/base/pr115961-run-1.C
> >> @@ -0,0 +1,34 @@
> >> +/* PR target/115961 */
> >> +/* { dg-do run } */
> >> +/* { dg-options "-O3 -fdump-rtl-expand-details" } */
> >> +
> >> +struct e
> >> +{
> >> +  unsigned pre : 12;
> >> +  unsigned a : 4;
> >> +};
> >> +
> >> +static unsigned min_u (unsigned a, unsigned b)
> >> +{
> >> +  return (b < a) ? b : a;
> >> +}
> >> +
> >> +__attribute__((noipa))
> >> +void bug (e * v, unsigned def, unsigned use) {
> >> +  e & defE = *v;
> >> +  defE.a = min_u (use + 1, 0xf);
> >> +}
> >> +
> >> +__attribute__((noipa, optimize(0)))
> >> +int main(void)
> >> +{
> >> +  e v = { 0xded, 3 };
> >> +
> >> +  bug(&v, 32, 33);
> >> +
> >> +  if (v.a != 0xf)
> >> +    __builtin_abort ();
> >> +
> >> +  return 0;
> >> +}
> >> +/* { dg-final { scan-rtl-dump-not ".SAT_TRUNC " "expand" } } */
> >> --
> >> 2.34.1
> >>

Reply via email to