Re: [PATCH][v2] match.pd: combine a pair of vector comparisons against zero

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

On 8/5/2026 5:45 AM, [email protected] wrote:
> From: Kyrylo Tkachov <[email protected]>
>
> A lane of A | B is zero exactly when the corresponding lanes of A and of B
> are both zero, so
>
>    (A == 0) & (B == 0)  ->  (A | B) == 0
>
> and the De Morgan dual for inequality.  The existing scalar rule already
> implements this identity.  Extend it to vector integers and use a view
> conversion when the operands differ only in element signedness.  Extend the
> related all-ones rule in the same way.
>
>    typedef int v4si __attribute__((vector_size (16)));
>    v4si f (v4si a, v4si b) { return (a == 0) & (b == 0); }
>
> aarch64 -O3 before:
>
> 	cmeq	v0.4s, v0.4s, #0
> 	cmeq	v1.4s, v1.4s, #0
> 	and	v0.16b, v0.16b, v1.16b
>
> after:
>
> 	orr	v0.16b, v0.16b, v1.16b
> 	cmeq	v0.4s, v0.4s, #0
>
> Add vector_nop_conversion_p for the element-wise property shared by these
> rules and the existing nop_convert matcher.
>
> Bootstrapped and tested on aarch64-none-linux-gnu.
> Ok for trunk?
> Thanks,
> Kyrill
>
> gcc/ChangeLog:
>
> 	* match.pd (nop_convert): Use vector_nop_conversion_p.
> 	((A == 0) & (B == 0), (A != 0) | (B != 0)): Extend the
> 	existing simplifications to vector operands.
> 	((A == -1) & (B == -1), (A != -1) | (B != -1)): Likewise.
> 	* tree.cc (vector_nop_conversion_p): New function.
> 	* tree.h (vector_nop_conversion_p): Declare.
>
> gcc/testsuite/ChangeLog:
>
> 	* gcc.dg/tree-ssa/vec-mask-zero-1.c: New test.
>
> Signed-off-by: Kyrylo Tkachov <[email protected]>
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.