[llvm] 33be799 - [DemandedBits] Track demanded bits for clmul instrinsics (#202415)

via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 4 10:16:39 PDT 2026


Author: 8051Enthusiast
Date: 2026-07-05T01:16:34+08:00
New Revision: 33be7999a363dd6a870baaebf5cd871309b668b0

URL: https://github.com/llvm/llvm-project/commit/33be7999a363dd6a870baaebf5cd871309b668b0
DIFF: https://github.com/llvm/llvm-project/commit/33be7999a363dd6a870baaebf5cd871309b668b0.diff

LOG: [DemandedBits] Track demanded bits for clmul instrinsics (#202415)

Similar to regular multiplication, carryless multiplication does not
depend on bits in positions higher than the output bits.

Added: 
    

Modified: 
    llvm/lib/Analysis/DemandedBits.cpp
    llvm/test/Analysis/DemandedBits/intrinsics.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/DemandedBits.cpp b/llvm/lib/Analysis/DemandedBits.cpp
index e0881751aef7e..35de778d9f093 100644
--- a/llvm/lib/Analysis/DemandedBits.cpp
+++ b/llvm/lib/Analysis/DemandedBits.cpp
@@ -114,6 +114,11 @@ void DemandedBits::determineLiveOperandBits(
         // the output.
         AB = AOut.reverseBits();
         break;
+      case Intrinsic::clmul:
+        // Output bits only depend on input bits with lower or
+        // equal bit index.
+        AB = APInt::getLowBitsSet(BitWidth, AOut.getActiveBits());
+        break;
       case Intrinsic::ctlz:
         if (OperandNo == 0) {
           // We need some output bits, so we need all bits of the

diff  --git a/llvm/test/Analysis/DemandedBits/intrinsics.ll b/llvm/test/Analysis/DemandedBits/intrinsics.ll
index 0421b23202a2c..225c7cd4feef9 100644
--- a/llvm/test/Analysis/DemandedBits/intrinsics.ll
+++ b/llvm/test/Analysis/DemandedBits/intrinsics.ll
@@ -109,3 +109,16 @@ define i33 @test_fshr_non_pow2_bitwidth(i33 %x, i33 %y, i33 %z) {
   %r = and i33 %f, 65535
   ret i33 %r
 }
+
+; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_clmul':
+; CHECK-DAG: DemandedBits: 0xffff for   %x2 = or i32 %x, 1
+; CHECK-DAG: DemandedBits: 0xffff for   %y2 = or i32 %y, 1
+; CHECK-DAG: DemandedBits: 0xff00 for   %z = call i32 @llvm.clmul.i32(i32 %x2, i32 %y2)
+; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and i32 %z, 65280
+define i32 @test_clmul(i32 %x, i32 %y) {
+  %x2 = or i32 %x, 1
+  %y2 = or i32 %y, 1
+  %z = call i32 @llvm.clmul.i32(i32 %x2, i32 %y2)
+  %r = and i32 %z, 65280
+  ret i32 %r
+}


        


More information about the llvm-commits mailing list