[llvm] [LLVM] Improve the DemandedBits Analysis (PR #148853)
Panagiotis K via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 16 00:39:33 PDT 2025
================
@@ -0,0 +1,282 @@
+; RUN: opt -S -disable-output -passes="print<demanded-bits>" < %s 2>&1 | FileCheck %s
+
+define i8 @test_sdiv_const_amount_4(i32 %a) {
+; CHECK-LABEL: 'test_sdiv_const_amount_4'
+; CHECK-DAG: DemandedBits: 0xff for %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div in %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div = sdiv i32 %a, 4
+; CHECK-DAG: DemandedBits: 0x3fc for %a in %div = sdiv i32 %a, 4
+; CHECK-DAG: DemandedBits: 0xffffffff for 4 in %div = sdiv i32 %a, 4
+;
+ %div = sdiv i32 %a, 4
+ %div.t = trunc i32 %div to i8
+ ret i8 %div.t
+}
+
+define i8 @test_sdiv_const_amount_5(i32 %a) {
+; CHECK-LABEL: 'test_sdiv_const_amount_5'
+; CHECK-DAG: DemandedBits: 0xff for %div = sdiv i32 %a, 5
+; CHECK-DAG: DemandedBits: 0xfff for %a in %div = sdiv i32 %a, 5
+; CHECK-DAG: DemandedBits: 0xffffffff for 5 in %div = sdiv i32 %a, 5
+; CHECK-DAG: DemandedBits: 0xff for %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div in %div.t = trunc i32 %div to i8
+;
+ %div = sdiv i32 %a, 5
+ %div.t = trunc i32 %div to i8
+ ret i8 %div.t
+}
+
+define i8 @test_sdiv_const_amount_8(i32 %a) {
+; CHECK-LABEL: 'test_sdiv_const_amount_8'
+; CHECK-DAG: DemandedBits: 0xff for %div = sdiv i32 %a, 8
+; CHECK-DAG: DemandedBits: 0x7f8 for %a in %div = sdiv i32 %a, 8
+; CHECK-DAG: DemandedBits: 0xffffffff for 8 in %div = sdiv i32 %a, 8
+; CHECK-DAG: DemandedBits: 0xff for %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div in %div.t = trunc i32 %div to i8
+;
+ %div = sdiv i32 %a, 8
+ %div.t = trunc i32 %div to i8
+ ret i8 %div.t
+}
+
+define i8 @test_sdiv_const_amount_9(i32 %a) {
+; CHECK-LABEL: 'test_sdiv_const_amount_9'
+; CHECK-DAG: DemandedBits: 0xff for %div = udiv i32 %a, 9
+; CHECK-DAG: DemandedBits: 0xfff for %a in %div = udiv i32 %a, 9
+; CHECK-DAG: DemandedBits: 0xffffffff for 9 in %div = udiv i32 %a, 9
+; CHECK-DAG: DemandedBits: 0xff for %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div in %div.t = trunc i32 %div to i8
+;
+ %div = udiv i32 %a, 9
+ %div.t = trunc i32 %div to i8
+ ret i8 %div.t
+}
+
+define i8 @test_sdiv(i32 %a, i32 %b) {
+; CHECK-LABEL: 'test_sdiv'
+; CHECK-DAG: DemandedBits: 0xff for %div = sdiv i32 %a, %b
+; CHECK-DAG: DemandedBits: 0xffffffff for %a in %div = sdiv i32 %a, %b
+; CHECK-DAG: DemandedBits: 0xffffffff for %b in %div = sdiv i32 %a, %b
+; CHECK-DAG: DemandedBits: 0xff for %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div in %div.t = trunc i32 %div to i8
+;
+ %div = sdiv i32 %a, %b
+ %div.t = trunc i32 %div to i8
+ ret i8 %div.t
+}
+
+define i8 @test_udiv_const_amount_4(i32 %a) {
+; CHECK-LABEL: 'test_udiv_const_amount_4'
+; CHECK-DAG: DemandedBits: 0xff for %div = udiv i32 %a, 4
+; CHECK-DAG: DemandedBits: 0x3fc for %a in %div = udiv i32 %a, 4
+; CHECK-DAG: DemandedBits: 0xffffffff for 4 in %div = udiv i32 %a, 4
+; CHECK-DAG: DemandedBits: 0xff for %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div in %div.t = trunc i32 %div to i8
+;
+ %div = udiv i32 %a, 4
+ %div.t = trunc i32 %div to i8
+ ret i8 %div.t
+}
+
+define i8 @test_udiv_const_amount_5(i32 %a) {
+; CHECK-LABEL: 'test_udiv_const_amount_5'
+; CHECK-DAG: DemandedBits: 0xff for %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div in %div.t = trunc i32 %div to i8
+; CHECK-DAG: DemandedBits: 0xff for %div = udiv i32 %a, 5
+; CHECK-DAG: DemandedBits: 0x7ff for %a in %div = udiv i32 %a, 5
----------------
karouzakisp wrote:
That's correct, when developing the algorithm, I assumed Knuth-like division, which isn't exactly accurate, and bit-by-bit recurrence. Real division isn't exactly like this.
https://github.com/llvm/llvm-project/pull/148853
More information about the llvm-commits
mailing list