[all-commits] [llvm/llvm-project] 9544bb: [InstCombine] Fold umul.overflow(x, c1) | (x*c1 > ...

Marius Kamp via All-commits all-commits at lists.llvm.org
Fri Jul 11 01:52:37 PDT 2025


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 9544bb5c299c36d1f31cddbb5350eda6f53b6e2b
      https://github.com/llvm/llvm-project/commit/9544bb5c299c36d1f31cddbb5350eda6f53b6e2b
  Author: Marius Kamp <msk at posteo.org>
  Date:   2025-07-11 (Fri, 11 Jul 2025)

  Changed paths:
    M llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
    A llvm/test/Transforms/InstCombine/icmp_or_umul_overflow.ll

  Log Message:
  -----------
  [InstCombine] Fold umul.overflow(x, c1) | (x*c1 > c2) to x > c2/c1 (#147327)

The motivation of this pattern is to check whether the product of a
variable and a constant would be mathematically (i.e., as integer
numbers instead of bit vectors) greater than a given constant bound. The
pattern appears to occur when compiling several Rust projects (it seems
to originate from the `smallvec` crate but I have not checked this
further).

Unless `c1` is `0`, we can transform this pattern into `x > c2/c1` with
all operations working on unsigned integers. Due to undefined behavior
when an element of a non-splat vector is `0`, the transform is only
implemented for scalars and splat vectors.

Alive proof: https://alive2.llvm.org/ce/z/LawTkm

Closes #142674



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