diff --git a/gcc/testsuite/gcc.dg/pr112536.c b/gcc/testsuite/gcc.dg/pr112536.c new file mode 100644 index 0000000000000000000000000000000000000000..633e1312063ad2e6e4182b03978859b3d956ca5e --- /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 33c4d1308f61f416e0d510e0a787288a4aec28eb..4a09b3c2aca4ea7da67db77c91050b45a8368b4f 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; }