[DAGCombine] Use `IsKnownNeverZero` to see if we need zero-check in is_pow2 setcc...
authorNoah Goldstein <goldstein.w.n@gmail.com>
Mon, 12 Jun 2023 18:17:27 +0000 (13:17 -0500)
committerNoah Goldstein <goldstein.w.n@gmail.com>
Mon, 12 Jun 2023 18:52:43 +0000 (13:52 -0500)
commit5c8188c7bc524c3e4ea22762645fcbe43042aee9
tree438e58c2ac8d5eb802b4f2979f3c019520dc3834
parent4e2b532cb94150cddbc095e167a62f0b38538cc0
[DAGCombine] Use `IsKnownNeverZero` to see if we need zero-check in is_pow2 setcc patern

`ctpop(X) eq/ne 1` is checking if X is a non-zero power of 2. Power of
2 check including zero is `(X & (X-1)) eq/ne 0` and unfortunately
there is no good pattern for checking a power of 2 while excluding
zero. So, when lowering `ctpop(X) eq/ne 1`, explicitly check
`IsKnownNeverZero(X)` to maybe be able to optimize out the extra zero
check.

We need this explicitly as DAGCombiner does not re-analyze provable
setcc nodes, and the middle-end never finds it beneficially to broaden
`ctpop(X) eq/ne 1` -> `ctpop(X) ule/ugt 1` (power of 2 including
zero).

Reviewed By: RKSimon

Differential Revision: https://reviews.llvm.org/D152675
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/test/CodeGen/X86/ispow2.ll