[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