Re: [PATCH] match.pd: extend the MIN/MAX narrowing through a cast to vectors

Jeffrey Law <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>

On 8/4/2026 3:58 AM, [email protected] wrote:
> From: Kyrylo Tkachov <[email protected]>
>
> The rule folding (type) minmax ((wide_type) a, (wide_type) b) to
> minmax (a, b) is restricted to scalars.  Extension is monotone, so it
> commutes with the comparison and the outer truncation is exact, and the
> argument is lanewise, so it holds for vectors unchanged.
>
> The vector case additionally needs the narrow operation to be available,
> otherwise vector lowering would scalarise what used to be a single wide
> instruction.
>
>    typedef int  v2si __attribute__((vector_size (8)));
>    typedef long v2di __attribute__((vector_size (16)));
>    v2si h (v2si a, v2si b)
>    {
>      v2di x = __builtin_convertvector (a, v2di);
>      v2di y = __builtin_convertvector (b, v2di);
>      return __builtin_convertvector (x < y ? x : y, v2si);
>    }
>
> aarch64 -O3 before:
>
> 	sshll	v0.2d, v0.2s, 0
> 	sshll	v1.2d, v1.2s, 0
> 	cmgt	v2.2d, v1.2d, v0.2d
> 	bsl	v2.16b, v0.16b, v1.16b
> 	xtn	v0.2s, v2.2d
>
> after:
>
> 	smin	v0.2s, v0.2s, v1.2s
>
> Require the wide vector MIN or MAX to have one use.  A shared wide
> result would otherwise gain a second narrow operation.
>
> Bootstrapped and tested on aarch64-none-linux-gnu.
> Ok for trunk?
> Thanks,
> Kyrill
>
> gcc/ChangeLog:
>
> 	* match.pd ((type) minmax ((wide_type) a, (wide_type) b)): Accept
> 	vector types, using element_precision and requiring the narrow
> 	operation to be supported.
>
> gcc/testsuite/ChangeLog:
>
> 	* g++.dg/tree-ssa/vec-narrow-1.C: New test.
> 	* g++.dg/tree-ssa/vec-narrow-minmax-2.C: New test.
OK
jeff
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.