[all-commits] [llvm/llvm-project] a4cad3: [KnownBits] Use X < Y identity and umin(MaxX, MaxY...

Joel Walker via All-commits all-commits at lists.llvm.org
Fri Jul 17 03:49:53 PDT 2026


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: a4cad33430cf5d2d03eb91ce5e41ed1b9ef7cc4d
      https://github.com/llvm/llvm-project/commit/a4cad33430cf5d2d03eb91ce5e41ed1b9ef7cc4d
  Author: Joel Walker <theagingboy05 at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M llvm/lib/Support/KnownBits.cpp
    M llvm/test/CodeGen/AArch64/GlobalISel/knownbits-urem.mir
    M llvm/test/Transforms/InstCombine/known-bits.ll

  Log Message:
  -----------
  [KnownBits] Use X < Y identity and umin(MaxX, MaxY - 1) bound in urem (#210262)

Tightens `KnownBits::urem` with the two facts `ConstantRange::urem`
already uses:

- `L % R == L` when `MaxL < MinR`: return the LHS bits unchanged. This
can propagate known one bits, which the current leading-zeros-only
reasoning never produces.
- `L % R <= umin(MaxL, MaxR - 1)`, since a zero divisor is UB: keep that
bound's leading zeros. This is one bit stronger than the per-operand
leading-zero count when `MaxR` is a power of two, and together with
`remGetLowBits` it subsumes the power-of-two-constant special case,
which is removed.

Soundness is covered by the existing exhaustive unit test (widths 1 and
4; additionally brute-forced at width 5). Across all 6480 valid width-4
KnownBits pairs, non-optimal results drop from 3332 to 2090. The
residual is number-theoretic (e.g. the exact value of `10 % 3`), out of
reach of leading-bit/range reasoning, so `CheckOptimality` stays off for
urem, as for udiv (#209360).

Assisted by Claude (Anthropic).



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list