[llvm] [Support] Adding fast-path for KnownBits's udiv when RHS is contant (PR #189779)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 1 02:10:04 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-support
@llvm/pr-subscribers-llvm-globalisel
Author: Max Graey (MaxGraey)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/189779.diff
3 Files Affected:
- (modified) llvm/lib/Support/KnownBits.cpp (+20)
- (modified) llvm/test/CodeGen/AArch64/GlobalISel/knownbits-sdiv.mir (+2-2)
- (modified) llvm/test/CodeGen/AArch64/GlobalISel/knownbits-udiv.mir (+2-2)
``````````diff
diff --git a/llvm/lib/Support/KnownBits.cpp b/llvm/lib/Support/KnownBits.cpp
index 07e7781d0839d..56ec9de6af77e 100644
--- a/llvm/lib/Support/KnownBits.cpp
+++ b/llvm/lib/Support/KnownBits.cpp
@@ -1209,6 +1209,26 @@ KnownBits KnownBits::udiv(const KnownBits &LHS, const KnownBits &RHS,
return Known;
}
+ if (RHS.isConstant()) {
+ const APInt Divisor = RHS.getConstant();
+ if (Divisor.isOne())
+ return LHS;
+
+ if (Divisor.isPowerOf2()) {
+ unsigned Shift = Divisor.logBase2();
+
+ APInt MaxRes = LHS.getMaxValue().lshr(Shift);
+ unsigned LeadZ = MaxRes.countLeadingZeros();
+
+ Known = LHS;
+ Known.One.lshrInPlace(Shift);
+ Known.Zero.lshrInPlace(Shift);
+ Known.Zero.setHighBits(LeadZ);
+
+ return Known;
+ }
+ }
+
// We can figure out the minimum number of upper zero bits by doing
// MaxNumerator / MinDenominator. If the Numerator gets smaller or Denominator
// gets larger, the number of upper zero bits increases.
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-sdiv.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-sdiv.mir
index 7b315205bc2e8..ae56e9097c99f 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-sdiv.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-sdiv.mir
@@ -8,7 +8,7 @@ body: |
; CHECK-LABEL: name: @Cst
; CHECK-NEXT: %0:_ KnownBits:01100100 SignBits:1
; CHECK-NEXT: %1:_ KnownBits:00000100 SignBits:5
- ; CHECK-NEXT: %2:_ KnownBits:000????? SignBits:3
+ ; CHECK-NEXT: %2:_ KnownBits:00011001 SignBits:3
%0:_(s8) = G_CONSTANT i8 100
%1:_(s8) = G_CONSTANT i8 4
%2:_(s8) = G_SDIV %0, %1
@@ -36,7 +36,7 @@ body: |
; CHECK-LABEL: name: @Exact
; CHECK-NEXT: %0:_ KnownBits:00001100 SignBits:4
; CHECK-NEXT: %1:_ KnownBits:00000100 SignBits:5
- ; CHECK-NEXT: %2:_ KnownBits:000000?1 SignBits:6
+ ; CHECK-NEXT: %2:_ KnownBits:00000011 SignBits:6
%0:_(s8) = G_CONSTANT i8 12
%1:_(s8) = G_CONSTANT i8 4
%2:_(s8) = exact G_SDIV %0, %1
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-udiv.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-udiv.mir
index dfbcd3f3c6188..0a0a00ce456ae 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-udiv.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-udiv.mir
@@ -8,7 +8,7 @@ body: |
; CHECK-LABEL: name: @Cst
; CHECK-NEXT: %0:_ KnownBits:01100100 SignBits:1
; CHECK-NEXT: %1:_ KnownBits:00000100 SignBits:5
- ; CHECK-NEXT: %2:_ KnownBits:000????? SignBits:3
+ ; CHECK-NEXT: %2:_ KnownBits:00011001 SignBits:3
%0:_(s8) = G_CONSTANT i8 100
%1:_(s8) = G_CONSTANT i8 4
%2:_(s8) = G_UDIV %0, %1
@@ -36,7 +36,7 @@ body: |
; CHECK-LABEL: name: @Exact
; CHECK-NEXT: %0:_ KnownBits:00001100 SignBits:4
; CHECK-NEXT: %1:_ KnownBits:00000100 SignBits:5
- ; CHECK-NEXT: %2:_ KnownBits:000000?1 SignBits:6
+ ; CHECK-NEXT: %2:_ KnownBits:00000011 SignBits:6
%0:_(s8) = G_CONSTANT i8 12
%1:_(s8) = G_CONSTANT i8 4
%2:_(s8) = exact G_UDIV %0, %1
``````````
</details>
https://github.com/llvm/llvm-project/pull/189779
More information about the llvm-commits
mailing list