On Sat, Oct 11, 2025 at 8:22 AM <[email protected]> wrote:
>
> From: Pan Li <[email protected]>
>
> The build_and_insert_cast refactored to go the gimple_convert way, to
> take care of the widen_mul.  Thus, the gimple layout from uint64_t
> widen_mul to uint128_t doesn't need additional cast like other types
> (uint32_t, uint16_t, uint8_t) widen to uint128_t for mul.  Thus, add
> the simplifed pattern match for such forms of unsigned SAT_MUL.
>
> The below test suites are passed for this patch:
> 1. The rv64gcv fully regression tests.
> 2. Fix rv64gcv SAT_MUL test failure of optimized .SAT_MUL check.
> 3. The x86 bootstrap tests.
> 4. The x86 fully regression tests.
>
> gcc/ChangeLog:
>
>         * match.pd: Add simplifed pattern for widen_mul based unsigned
>         SAT_MUL.

LGTM.
Reviewed-by: Andrew Pinski <[email protected]>

>
> Signed-off-by: Pan Li <[email protected]>
> ---
>  gcc/match.pd | 30 ++++++++++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 4d0a803eaef..e81e34f1aad 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -3717,6 +3717,36 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>         bool c2_is_type_precision_p = tree_to_uhwi (@2) == prec;
>        }
>        (if (c2_is_type_precision_p && (mult_p || widen_mult_p)))))))
> + (match (unsigned_integer_sat_mul @0 @1)
> +  (convert (min (widen_mult:c@3 @0 @1) INTEGER_CST@2))
> +  (if (types_match (type, @0, @1))
> +   (with
> +    {
> +     unsigned prec = TYPE_PRECISION (type);
> +     unsigned widen_prec = TYPE_PRECISION (TREE_TYPE (@3));
> +
> +     wide_int max = wi::mask (prec, false, widen_prec);
> +     bool c2_is_max_p = wi::eq_p (wi::to_wide (@2), max);
> +     bool widen_mult_p = prec * 2 == widen_prec;
> +    }
> +    (if (c2_is_max_p && widen_mult_p)))))
> +  (match (unsigned_integer_sat_mul @0 @1)
> +   (convert1?
> +    (bit_ior
> +     (convert?
> +      (negate
> +       (convert (ne (convert2? (rshift @3 INTEGER_CST@2)) integer_zerop))))
> +     (convert (widen_mult:c@3 @0 @1))))
> +   (if (types_match (type, @0, @1))
> +    (with
> +     {
> +      unsigned prec = TYPE_PRECISION (type);
> +      unsigned widen_prec = TYPE_PRECISION (TREE_TYPE (@3));
> +
> +      bool c2_is_type_precision_p = tree_to_uhwi (@2) == prec;
> +      bool widen_mult_p = prec * 2 == widen_prec;
> +     }
> +     (if (c2_is_type_precision_p && widen_mult_p)))))
>  )
>
>  /* The boundary condition for case 10: IMM = 1:
> --
> 2.43.0
>

Reply via email to