phiopt: Optimize x ? __builtin_clz (x) : 32 in GIMPLE fallout [PR97503]

> this broke sparc-sun-solaris2.11 bootstrap
>
> /vol/gcc/src/hg/master/local/gcc/tree-ssa-phiopt.c: In function 'bool cond_removal_in_popcount_clz_ctz_pattern(basic_block, basic_block, edge, edge, gimple*, tree, tree)':
> /vol/gcc/src/hg/master/local/gcc/tree-ssa-phiopt.c:1858:27: error: variable 'mode' set but not used [-Werror=unused-but-set-variable]
>  1858 |           scalar_int_mode mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg));
>       |                           ^~~~
>
>
> and doubtlessly several other targets that use the defaults.h definition of
>
> #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE)  0

Ugh, seems many of those macros do not evaluate the first argument.
This got broken by the change to direct_internal_fn_supported_p, previously
it used mode also in the optab test.

2020-10-22  Jakub Jelinek  <jakub@redhat.com>

	* tree-ssa-phiopt.c (cond_removal_in_popcount_clz_ctz_pattern):
	For CLZ and CTZ tests, use type temporary instead of mode.
This commit is contained in:
Jakub Jelinek 2020-10-22 09:34:28 +02:00
parent 17c5b7e1dc
commit ef2d3ec325

View File

@ -1842,10 +1842,10 @@ cond_removal_in_popcount_clz_ctz_pattern (basic_block cond_bb,
CASE_CFN_CLZ:
if (INTEGRAL_TYPE_P (TREE_TYPE (arg)))
{
scalar_int_mode mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg));
if (direct_internal_fn_supported_p (IFN_CLZ, TREE_TYPE (arg),
OPTIMIZE_FOR_BOTH)
&& CLZ_DEFINED_VALUE_AT_ZERO (mode, val) == 2)
tree type = TREE_TYPE (arg);
if (direct_internal_fn_supported_p (IFN_CLZ, type, OPTIMIZE_FOR_BOTH)
&& CLZ_DEFINED_VALUE_AT_ZERO (SCALAR_INT_TYPE_MODE (type),
val) == 2)
{
ifn = IFN_CLZ;
break;
@ -1855,10 +1855,10 @@ cond_removal_in_popcount_clz_ctz_pattern (basic_block cond_bb,
CASE_CFN_CTZ:
if (INTEGRAL_TYPE_P (TREE_TYPE (arg)))
{
scalar_int_mode mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg));
if (direct_internal_fn_supported_p (IFN_CTZ, TREE_TYPE (arg),
OPTIMIZE_FOR_BOTH)
&& CTZ_DEFINED_VALUE_AT_ZERO (mode, val) == 2)
tree type = TREE_TYPE (arg);
if (direct_internal_fn_supported_p (IFN_CTZ, type, OPTIMIZE_FOR_BOTH)
&& CTZ_DEFINED_VALUE_AT_ZERO (SCALAR_INT_TYPE_MODE (type),
val) == 2)
{
ifn = IFN_CTZ;
break;