https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97445

--- Comment #46 from Segher Boessenkool <segher at gcc dot gnu.org> ---
(In reply to Christophe Leroy from comment #43)
> int g(int x)
> {
>       return __builtin_clz(0);
> }
> 
> Gives
> 
> 00000018 <g>:
>   18: 38 60 00 20     li      r3,32
>   1c: 4e 80 00 20     blr

That is because rs6000 has

/* The cntlzw and cntlzd instructions return 32 and 64 for input of zero.  */
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
  ((VALUE) = GET_MODE_BITSIZE (MODE), 2)

This says that at RTL level and in the optabs, clz of 0 *is* defined,
for rs6000.  But the builtin is not valid with an arg of 0!

Reply via email to