[Mlir-commits] [mlir] [mlir][llvmir] Add llvm.intr.ldexp operation (PR #133070)
Letu Ren
llvmlistbot at llvm.org
Wed Mar 26 11:52:17 PDT 2025
https://github.com/FantasqueX updated https://github.com/llvm/llvm-project/pull/133070
>From 8eb536472b37ef27b4afa5fa61d981e2f56b9c84 Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Wed, 26 Mar 2025 19:58:54 +0800
Subject: [PATCH 1/3] [mlir][llvmir] Add llvm.intr.ldexp operation
---
.../mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td | 22 +++++++++++--------
mlir/test/Target/LLVMIR/Import/intrinsic.ll | 11 ++++++++++
.../test/Target/LLVMIR/llvmir-intrinsics.mlir | 9 ++++++++
mlir/test/Target/LLVMIR/llvmir-invalid.mlir | 2 +-
4 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
index ace880bd28590..d702247244808 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
@@ -106,10 +106,22 @@ def LLVM_IsFPClass : LLVM_OneResultIntrOp<"is.fpclass", [], [0], [Pure],
let arguments = (ins LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$in, I32Attr:$bit);
}
+class LLVM_PowFI<string func> :
+ LLVM_OneResultIntrOp<func, [], [0,1],
+ [Pure], /*requiresFastmath=*/1> {
+ let arguments =
+ (ins LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$val,
+ AnyI32:$power,
+ DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags);
+ let assemblyFormat = "`(` operands `)` attr-dict `:` "
+ "functional-type(operands, results)";
+}
+
def LLVM_CopySignOp : LLVM_BinarySameArgsIntrOpF<"copysign">;
def LLVM_ExpOp : LLVM_UnaryIntrOpF<"exp">;
def LLVM_Exp2Op : LLVM_UnaryIntrOpF<"exp2">;
def LLVM_Exp10Op : LLVM_UnaryIntrOpF<"exp10">;
+def LLVM_LoadExpOp: LLVM_PowFI<"ldexp">;
def LLVM_FAbsOp : LLVM_UnaryIntrOpF<"fabs">;
def LLVM_FCeilOp : LLVM_UnaryIntrOpF<"ceil">;
def LLVM_FFloorOp : LLVM_UnaryIntrOpF<"floor">;
@@ -130,15 +142,7 @@ def LLVM_RoundOp : LLVM_UnaryIntrOpF<"round">;
def LLVM_FTruncOp : LLVM_UnaryIntrOpF<"trunc">;
def LLVM_SqrtOp : LLVM_UnaryIntrOpF<"sqrt">;
def LLVM_PowOp : LLVM_BinarySameArgsIntrOpF<"pow">;
-def LLVM_PowIOp : LLVM_OneResultIntrOp<"powi", [], [0,1],
- [Pure], /*requiresFastmath=*/1> {
- let arguments =
- (ins LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$val,
- AnySignlessInteger:$power,
- DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags);
- let assemblyFormat = "`(` operands `)` attr-dict `:` "
- "functional-type(operands, results)";
-}
+def LLVM_PowIOp : LLVM_PowFI<"powi">;
def LLVM_RintOp : LLVM_UnaryIntrOpF<"rint">;
def LLVM_NearbyintOp : LLVM_UnaryIntrOpF<"nearbyint">;
class LLVM_IntRoundIntrOpBase<string func> :
diff --git a/mlir/test/Target/LLVMIR/Import/intrinsic.ll b/mlir/test/Target/LLVMIR/Import/intrinsic.ll
index 09f1eb5529228..3ba3ba26c54ae 100644
--- a/mlir/test/Target/LLVMIR/Import/intrinsic.ll
+++ b/mlir/test/Target/LLVMIR/Import/intrinsic.ll
@@ -51,6 +51,15 @@ define void @exp10_test(float %0, <8 x float> %1) {
ret void
}
+; CHECK-LABEL: llvm.func @ldexp_test
+define void @ldexp_test(float %0, <8 x float> %1, i32 %2) {
+ ; CHECK: llvm.intr.ldexp(%{{.*}}, %{{.*}}) : (f32, i32) -> f32
+ %4 = call float @llvm.ldexp.f32.i32(float %0, i32 %2)
+ ; CHECK: llvm.intr.ldexp(%{{.*}}, %{{.*}}) : (vector<8xf32>, i32) -> vector<8xf32>
+ %5 = call <8 x float> @llvm.ldexp.v8f32.i32(<8 x float> %1, i32 %2)
+ ret void
+}
+
; CHECK-LABEL: llvm.func @log_test
define void @log_test(float %0, <8 x float> %1) {
; CHECK: llvm.intr.log(%{{.*}}) : (f32) -> f32
@@ -1060,6 +1069,8 @@ declare float @llvm.exp2.f32(float)
declare <8 x float> @llvm.exp2.v8f32(<8 x float>)
declare float @llvm.exp10.f32(float)
declare <8 x float> @llvm.exp10.v8f32(<8 x float>)
+declare float @llvm.ldexp.f32.i32(float, i32)
+declare <8 x float> @llvm.ldexp.v8f32.i32(<8 x float>, i32)
declare float @llvm.log.f32(float)
declare <8 x float> @llvm.log.v8f32(<8 x float>)
declare float @llvm.log10.f32(float)
diff --git a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
index d54cd3cb11b51..cba47e3274386 100644
--- a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
@@ -49,6 +49,15 @@ llvm.func @exp10_test(%arg0: f32, %arg1: vector<8xf32>) {
llvm.return
}
+// CHECK-LABEL: @ldexp_test
+llvm.func @ldexp_test(%arg0: f32, %arg1: vector<8xf32>, %arg2: i32) {
+ // CHECK: call float @llvm.ldexp.f32.i32(float %{{.*}}, i32 %{{.*}})
+ "llvm.intr.ldexp"(%arg0, %arg2) : (f32, i32) -> f32
+ // CHECK: call <8 x float> @llvm.ldexp.v8f32.i32(<8 x float> %{{.*}}, i32 %{{.*}})
+ "llvm.intr.ldexp"(%arg1, %arg2) : (vector<8xf32>, i32) -> vector<8xf32>
+ llvm.return
+}
+
// CHECK-LABEL: @log_test
llvm.func @log_test(%arg0: f32, %arg1: vector<8xf32>) {
// CHECK: call float @llvm.log.f32
diff --git a/mlir/test/Target/LLVMIR/llvmir-invalid.mlir b/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
index 83566d6649932..3397dfbfdfe72 100644
--- a/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
@@ -147,7 +147,7 @@ llvm.func @ternary_float_intr_wrong_type(%arg0 : f32, %arg1 : f32, %arg2 : i32)
// -----
llvm.func @powi_intr_wrong_type(%arg0 : f32, %arg1 : f32) -> f32 {
- // expected-error @below{{op operand #1 must be signless integer, but got 'f32'}}
+ // expected-error @below{{op operand #1 must be 32-bit integer, but got 'f32'}}
%0 = "llvm.intr.powi"(%arg0, %arg1) : (f32, f32) -> f32
llvm.return %0 : f32
}
>From 5f0f0a0f7bfe8beafe290742ab4549e0626c431e Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Wed, 26 Mar 2025 21:54:37 +0800
Subject: [PATCH 2/3] Allow all kinds of integers
---
mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td | 2 +-
mlir/test/Target/LLVMIR/llvmir-invalid.mlir | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
index d702247244808..a467a372f9206 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
@@ -111,7 +111,7 @@ class LLVM_PowFI<string func> :
[Pure], /*requiresFastmath=*/1> {
let arguments =
(ins LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$val,
- AnyI32:$power,
+ AnyInteger:$power,
DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags);
let assemblyFormat = "`(` operands `)` attr-dict `:` "
"functional-type(operands, results)";
diff --git a/mlir/test/Target/LLVMIR/llvmir-invalid.mlir b/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
index 3397dfbfdfe72..725ffa5f773e7 100644
--- a/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
@@ -147,7 +147,7 @@ llvm.func @ternary_float_intr_wrong_type(%arg0 : f32, %arg1 : f32, %arg2 : i32)
// -----
llvm.func @powi_intr_wrong_type(%arg0 : f32, %arg1 : f32) -> f32 {
- // expected-error @below{{op operand #1 must be 32-bit integer, but got 'f32'}}
+ // expected-error @below{{op operand #1 must be integer, but got 'f32'}}
%0 = "llvm.intr.powi"(%arg0, %arg1) : (f32, f32) -> f32
llvm.return %0 : f32
}
>From eaa413d4bdc9f32d636e6076692b74a2e9c26f8d Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Thu, 27 Mar 2025 02:52:03 +0800
Subject: [PATCH 3/3] Reuse signless integer
---
mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td | 2 +-
mlir/test/Target/LLVMIR/llvmir-invalid.mlir | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
index a467a372f9206..58062a64df760 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
@@ -111,7 +111,7 @@ class LLVM_PowFI<string func> :
[Pure], /*requiresFastmath=*/1> {
let arguments =
(ins LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$val,
- AnyInteger:$power,
+ AnySignlessInteger:$power,
DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags);
let assemblyFormat = "`(` operands `)` attr-dict `:` "
"functional-type(operands, results)";
diff --git a/mlir/test/Target/LLVMIR/llvmir-invalid.mlir b/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
index 725ffa5f773e7..83566d6649932 100644
--- a/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir-invalid.mlir
@@ -147,7 +147,7 @@ llvm.func @ternary_float_intr_wrong_type(%arg0 : f32, %arg1 : f32, %arg2 : i32)
// -----
llvm.func @powi_intr_wrong_type(%arg0 : f32, %arg1 : f32) -> f32 {
- // expected-error @below{{op operand #1 must be integer, but got 'f32'}}
+ // expected-error @below{{op operand #1 must be signless integer, but got 'f32'}}
%0 = "llvm.intr.powi"(%arg0, %arg1) : (f32, f32) -> f32
llvm.return %0 : f32
}
More information about the Mlir-commits
mailing list