[PATCH][GCC][Aarch64]: Fix for PR94880: Failure to recognize andn pattern

Przemyslaw Wirkus Przemyslaw.Wirkus@arm.com
Fri Jun 12 14:49:54 GMT 2020


Hi all,

Pattern "(x | y) - y" can be optimized to simple "(x & ~y)" andn pattern.

So, for the example code:

$ cat main.c
int
f_i(int x, int y)
{
	return (x | y) - y;
}

long long
f_l(long long x, long long y)
{
	return (x | y) - y;
}

typedef int v4si __attribute__ ((vector_size (16)));
typedef long long v2di __attribute__ ((vector_size (16)));

v4si
f_v4si(v4si a, v4si b) {
	return (a | b) - b;
}

v2di
f_v2di(v2di a, v2di b) {
	return (a | b) - b;
}

void
f(v4si *d, v4si *a, v4si *b) {
	for (int i=0; i<N; i++)
		d[i] = (a[i] | b[i]) - b[i];
}

Before this patch:
$ ./aarch64-none-linux-gnu-gcc -S -O2 main.c -dp

f_i:
		orr     w0, w0, w1        // 8    [c=4 l=4]  iorsi3/0
		sub     w0, w0, w1        // 14   [c=4 l=4]  subsi3
		ret       // 24       [c=0 l=4]  *do_return
f_l:
		orr     x0, x0, x1        // 8    [c=4 l=4]  iordi3/0
		sub     x0, x0, x1        // 14   [c=4 l=4]  subdi3/0
		ret       // 24       [c=0 l=4]  *do_return
f_v4si:
		orr     v0.16b, v0.16b, v1.16b    // 8    [c=8 l=4]  iorv4si3/0
		sub     v0.4s, v0.4s, v1.4s       // 14 [c=8 l=4]  subv4si3
		ret       // 24       [c=0 l=4]  *do_return
f_v2di:
		orr     v0.16b, v0.16b, v1.16b    // 8    [c=8 l=4]  iorv2di3/0
		sub     v0.2d, v0.2d, v1.2d       // 14 [c=8 l=4]  subv2di3
		ret       // 24       [c=0 l=4]  *do_return

After this patch:
$ ./aarch64-none-linux-gnu-gcc -S -O2 main.c -dp

f_i:
		bic     w0, w0, w1      // 13   [c=8 l=4]  *bic_and_not_si3
		ret             // 23   [c=0 l=4]  *do_return
f_l:
		bic     x0, x0, x1      // 13   [c=8 l=4]  *bic_and_not_di3
		ret             // 23   [c=0 l=4]  *do_return
f_v4si:
		bic     v0.16b, v0.16b, v1.16b  // 13   [c=16 l=4]  *bic_and_not_simd_v4si3
		ret             // 23   [c=0 l=4]  *do_return
f_v2di:
		bic     v0.16b, v0.16b, v1.16b  // 13   [c=16 l=4]  *bic_and_not_simd_v2di3
		ret             // 23   [c=0 l=4]  *do_return

Bootstrapped and tested on aarch64-none-linux-gnu.

OK for master ?

Cheers,
Przemyslaw

gcc/ChangeLog:

	PR tree-optimization/94880
	* config/aarch64/aarch64.md (bic_and_not_<mode>3): New define_insn.
	* config/aarch64/aarch64-simd.md (bic_and_not_simd_<mode>3): New
	define_insn.

gcc/testsuite/ChangeLog:

	PR tree-optimization/94880
	* gcc.target/aarch64/bic_and_not_di3.c: New test.
	* gcc.target/aarch64/bic_and_not_si3.c: New test.
	* gcc.target/aarch64/bic_and_not_v2di3.c: New test.
	* gcc.target/aarch64/bic_and_not_v4si3.c: New test.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.patch
Type: application/octet-stream
Size: 4465 bytes
Desc: patch.patch
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20200612/2faf43b3/attachment.obj>


More information about the Gcc-patches mailing list