On Tue, Oct 13, 2026 at 08:33:38AM +0530, Vineet Gupta wrote:
> On x86 without BMI, fwprop (simplify_count_zeroes) can build a .CTZ,
> claiming ctx(0) = 32, although target specifies ctz(0) is undefined
> and the instruction it emits leaves zero undefined (or destination
> unchanged on AMD). A later match.pd (cond (ne x 0) (IFN_C?Z x C) C)
> can fold that 32 with user's "x ? clz (x) : 32" giving undefined
> result for the 0 input.
>
> Follow the convention documented in fold_builtin_bit_query and only pass
> the second argument when the macro returns 2; the existing COND_EXPR
> already supplies the table's value for zero.
>
> Bootstrapped and regression tested on x86_64-linux-gnu and aarch64-linux-gnu
> (Full disclosure: the testing was with combined fixes for 3 other PRs).
>
> PR tree-optimization/127853
>
> gcc/ChangeLog:
>
> * tree-ssa-forwprop.cc (simplify_count_zeroes): Only pass the
> value at zero to .CLZ/.CTZ when the target defines it.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.dg/torture/clz-table-zero-1.c: New test.
> * gcc.dg/torture/ctz-table-zero-1.c: New test.
> * gcc.target/aarch64/clz-ctz-table-zero.c: New test.
> * gcc.target/i386/clz-ctz-table-nonzero.c: New test.
> * gcc.target/i386/clz-ctz-table-zero.c: New test.
>
> Signed-off-by: Vineet Gupta <[email protected]>
LGTM.
Jakub