diff options
author | Jakub Jelinek <jakub@redhat.com> | 2023-11-16 08:32:24 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2023-11-16 08:32:24 +0100 |
commit | 9f35d8cd767155e9c24f5ef0944168711d38bc6b (patch) | |
tree | 84233632480a7dd5241fe2a60cbf4b44283ceb76 /gcc | |
parent | 31bf21c78029434b7515a94477ce3565bff0743f (diff) | |
download | gcc-9f35d8cd767155e9c24f5ef0944168711d38bc6b.zip gcc-9f35d8cd767155e9c24f5ef0944168711d38bc6b.tar.gz gcc-9f35d8cd767155e9c24f5ef0944168711d38bc6b.tar.bz2 |
slp: Fix handling of IFN_CLZ/CTZ [PR112536]
We ICE on the following testcase now that IFN_C[LT]Z calls can have one or
two arguments (where 2 mean it is well defined at zero).
The following patch makes us create child node only for the first argument
and compatible_calls_p ensures the other argument is the same, which
at least according to the testcase seems sufficient because of vect
patterns.
2023-11-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/112536
* tree-vect-slp.cc (arg0_map): New variable.
(vect_get_operand_map): For IFN_CLZ or IFN_CTZ, return arg0_map.
* gcc.dg/pr112536.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr112536.c | 58 | ||||
-rw-r--r-- | gcc/tree-vect-slp.cc | 5 |
2 files changed, 63 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr112536.c b/gcc/testsuite/gcc.dg/pr112536.c new file mode 100644 index 0000000..633e131 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr112536.c @@ -0,0 +1,58 @@ +/* PR tree-optimization/112536 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-ipa-icf" } */ +/* { dg-additional-options "-mlzcnt -mavx512cd -mavx512vl" { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-final { scan-assembler-times "\tvplzcntd\t" 3 { target { i?86-*-* x86_64-*-* } } } } */ + +unsigned a[12]; + +void +foo (void) +{ + int i = a[0]; + int j = a[1]; + int k = a[2]; + int l = a[3]; + int e = i ? __builtin_clz (i) : __SIZEOF_INT__ * __CHAR_BIT__; + int f = j ? __builtin_clz (j) : __SIZEOF_INT__ * __CHAR_BIT__; + int g = k ? __builtin_clz (k) : __SIZEOF_INT__ * __CHAR_BIT__; + int h = l ? __builtin_clz (l) : __SIZEOF_INT__ * __CHAR_BIT__; + a[0] = e; + a[1] = f; + a[2] = g; + a[3] = h; +} + +void +bar (void) +{ + int i = a[4]; + int j = a[5]; + int k = a[6]; + int l = a[7]; + int e = i ? __builtin_clz (i) : __SIZEOF_INT__ * __CHAR_BIT__; + int f = __builtin_clz (j); + int g = __builtin_clz (k); + int h = l ? __builtin_clz (l) : __SIZEOF_INT__ * __CHAR_BIT__; + a[4] = e; + a[5] = f; + a[6] = g; + a[7] = h; +} + +void +baz (void) +{ + int i = a[8]; + int j = a[9]; + int k = a[10]; + int l = a[11]; + int e = __builtin_clz (i); + int f = j ? __builtin_clz (j) : __SIZEOF_INT__ * __CHAR_BIT__; + int g = __builtin_clz (k); + int h = l ? __builtin_clz (l) : __SIZEOF_INT__ * __CHAR_BIT__; + a[8] = e; + a[9] = f; + a[10] = g; + a[11] = h; +} diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 33c4d13..4a09b3c 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -505,6 +505,7 @@ static const int cond_expr_maps[3][5] = { { 4, -2, -1, 1, 2 }, { 4, -1, -2, 2, 1 } }; +static const int arg0_map[] = { 1, 0 }; static const int arg1_map[] = { 1, 1 }; static const int arg2_map[] = { 1, 2 }; static const int arg1_arg4_map[] = { 2, 1, 4 }; @@ -580,6 +581,10 @@ vect_get_operand_map (const gimple *stmt, bool gather_scatter_p = false, return nullptr; } + case IFN_CLZ: + case IFN_CTZ: + return arg0_map; + default: break; } |