[llvm] [InstSimplify] Const-fold clmul (PR #203346)

Ramkumar Ramachandra via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 11 10:53:14 PDT 2026


https://github.com/artagnon updated https://github.com/llvm/llvm-project/pull/203346

>From aa5cf6f17507939f879826b9f891b83245ae7435 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Thu, 11 Jun 2026 17:52:47 +0100
Subject: [PATCH 1/3] [InstSimplify] Pre-commit clmul const-fold tests

---
 .../Transforms/InstSimplify/fold-intrinsics.ll | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll b/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
index ef97d42834ac8..8e64f627de8b8 100644
--- a/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
+++ b/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
@@ -53,6 +53,24 @@ define i32 @test_ctpop_poison(i32 %a) {
   ret i32 %res
 }
 
+define i8 @clmul() {
+; CHECK-LABEL: @clmul(
+; CHECK-NEXT:    [[CLMUL:%.*]] = call i8 @llvm.clmul.i8(i8 3, i8 4)
+; CHECK-NEXT:    ret i8 [[CLMUL]]
+;
+  %clmul = call i8 @llvm.clmul.i8(i8 3, i8 4)
+  ret i8 %clmul
+}
+
+define i8 @clmul_poison() {
+; CHECK-LABEL: @clmul_poison(
+; CHECK-NEXT:    [[CLMUL:%.*]] = call i8 @llvm.clmul.i8(i8 3, i8 poison)
+; CHECK-NEXT:    ret i8 [[CLMUL]]
+;
+  %clmul = call i8 @llvm.clmul.i8(i8 3, i8 poison)
+  ret i8 %clmul
+}
+
 define void @pow_poison(i16 %arg_int,float %arg_flt, ptr %P) {
 ; CHECK-LABEL: @pow_poison(
 ; CHECK-NEXT:    store volatile float poison, ptr [[P:%.*]], align 4

>From 53b5bbcedef28bd35388a934c36e80ccda958ad8 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Thu, 11 Jun 2026 18:05:02 +0100
Subject: [PATCH 2/3] [InstSimplify] Const-fold clmul

---
 llvm/lib/Analysis/ConstantFolding.cpp                | 5 +++++
 llvm/test/Transforms/InstSimplify/fold-intrinsics.ll | 6 ++----
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 5259c6b035188..9bf76617cecbe 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -1755,6 +1755,7 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) {
   case Intrinsic::cttz:
   case Intrinsic::fshl:
   case Intrinsic::fshr:
+  case Intrinsic::clmul:
   case Intrinsic::launder_invariant_group:
   case Intrinsic::strip_invariant_group:
   case Intrinsic::masked_load:
@@ -3899,6 +3900,10 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
         return Constant::getNullValue(Ty);
 
       return ConstantInt::get(Ty, C0->abs());
+    case Intrinsic::clmul:
+      if (!C0 || !C1)
+        return PoisonValue::get(Ty);
+      return ConstantInt::get(Ty, APIntOps::clmul(*C0, *C1));
     case Intrinsic::amdgcn_wave_reduce_umin:
     case Intrinsic::amdgcn_wave_reduce_umax:
     case Intrinsic::amdgcn_wave_reduce_max:
diff --git a/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll b/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
index 8e64f627de8b8..f1d1aa5a0f007 100644
--- a/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
+++ b/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
@@ -55,8 +55,7 @@ define i32 @test_ctpop_poison(i32 %a) {
 
 define i8 @clmul() {
 ; CHECK-LABEL: @clmul(
-; CHECK-NEXT:    [[CLMUL:%.*]] = call i8 @llvm.clmul.i8(i8 3, i8 4)
-; CHECK-NEXT:    ret i8 [[CLMUL]]
+; CHECK-NEXT:    ret i8 12
 ;
   %clmul = call i8 @llvm.clmul.i8(i8 3, i8 4)
   ret i8 %clmul
@@ -64,8 +63,7 @@ define i8 @clmul() {
 
 define i8 @clmul_poison() {
 ; CHECK-LABEL: @clmul_poison(
-; CHECK-NEXT:    [[CLMUL:%.*]] = call i8 @llvm.clmul.i8(i8 3, i8 poison)
-; CHECK-NEXT:    ret i8 [[CLMUL]]
+; CHECK-NEXT:    ret i8 poison
 ;
   %clmul = call i8 @llvm.clmul.i8(i8 3, i8 poison)
   ret i8 %clmul

>From dbade92f5c6292152335cece4c651ad74b52498a Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Thu, 11 Jun 2026 18:50:03 +0100
Subject: [PATCH 3/3] [ConstFold] Produce undef or null-value appropriately

---
 llvm/lib/Analysis/ConstantFolding.cpp              |  4 +++-
 .../Transforms/InstSimplify/fold-intrinsics.ll     | 14 +++++++++++---
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 9bf76617cecbe..80a404ded6f41 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -3901,8 +3901,10 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
 
       return ConstantInt::get(Ty, C0->abs());
     case Intrinsic::clmul:
+      if (!C0 && !C1)
+        return UndefValue::get(Ty);
       if (!C0 || !C1)
-        return PoisonValue::get(Ty);
+        return Constant::getNullValue(Ty);
       return ConstantInt::get(Ty, APIntOps::clmul(*C0, *C1));
     case Intrinsic::amdgcn_wave_reduce_umin:
     case Intrinsic::amdgcn_wave_reduce_umax:
diff --git a/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll b/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
index f1d1aa5a0f007..2e6d1174e5cd5 100644
--- a/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
+++ b/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
@@ -61,14 +61,22 @@ define i8 @clmul() {
   ret i8 %clmul
 }
 
-define i8 @clmul_poison() {
-; CHECK-LABEL: @clmul_poison(
-; CHECK-NEXT:    ret i8 poison
+define i8 @clmul_onepoison() {
+; CHECK-LABEL: @clmul_onepoison(
+; CHECK-NEXT:    ret i8 0
 ;
   %clmul = call i8 @llvm.clmul.i8(i8 3, i8 poison)
   ret i8 %clmul
 }
 
+define i8 @clmul_bothpoison() {
+; CHECK-LABEL: @clmul_bothpoison(
+; CHECK-NEXT:    ret i8 undef
+;
+  %clmul = call i8 @llvm.clmul.i8(i8 poison, i8 poison)
+  ret i8 %clmul
+}
+
 define void @pow_poison(i16 %arg_int,float %arg_flt, ptr %P) {
 ; CHECK-LABEL: @pow_poison(
 ; CHECK-NEXT:    store volatile float poison, ptr [[P:%.*]], align 4



More information about the llvm-commits mailing list