Help with clz(0) and optimization
Jeff Law
jeffreyalaw@gmail.com
Tue Oct 31 15:22:06 GMT 2023
On 10/31/23 08:26, Enrico via Gcc wrote:
> I am working on GCC for a target architecture where clz(0) is defined and
> is 32 (TriCore).
> The code under test is the following:
>
> #include <stdio.h>
> int f(unsigned int a) {
> unsigned int res = 32 - __builtin_clz(a);
> if(res > 0) printf("test");
> return res;
> }
>
> From GCC version greater and equal to 11, the Tree SSA optimization
> discards the if condition completely, and always executes the printf. This
> is the optimized gimplified code at the end of the optimization for GCC12:
>
> int f (unsigned int a)
> {
> int _1;
> int _2;
>
> <bb 2> [local count: 1073741824]:
> _1 = __builtin_clz (a_4(D));
> _2 = 32 - _1;
> __printf_chk (1, "test");
> return _2;
> }
>
> where GCC10 produces:
> f (unsigned int a)
> {
> int _1;
> int _2;
>
> <bb 2> [local count: 1073741824]:
> _1 = __builtin_clz (a_4(D));
> _2 = 32 - _1;
> if (_2 != 0)
> goto <bb 3>; [33.00%]
> else
> goto <bb 4>; [67.00%]
>
> <bb 3> [local count: 354334800]:
> __printf_chk (1, "test");
>
> <bb 4> [local count: 1073741824]:
> return _2;
> }
>
> I tried to rebuild defining CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE)
> ((VALUE) = 32, 2) but this doesn't seem to have any effect.
I would look to see the first pass where the condition gets removed
using -fdump-tree-all-details. That should give you strong hints about
what to look at next.
Conceptually something has determined that _2 never has the value 0
which through backwards propagation would indicate that __builtin_clz
never returns the value 32.
Jeff
More information about the Gcc
mailing list