[Mlir-commits] [mlir] 071643f - [mlir][llvm] Add `llvm.experimental.constrained.fpext` operation (#129054)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Mar 24 05:04:26 PDT 2025


Author: Letu Ren
Date: 2025-03-24T13:04:19+01:00
New Revision: 071643f339a05044bdc2b236ca958d4689c6dd8a

URL: https://github.com/llvm/llvm-project/commit/071643f339a05044bdc2b236ca958d4689c6dd8a
DIFF: https://github.com/llvm/llvm-project/commit/071643f339a05044bdc2b236ca958d4689c6dd8a.diff

LOG: [mlir][llvm] Add `llvm.experimental.constrained.fpext` operation (#129054)

Ref: https://github.com/llvm/llvm-project/pull/86260

Added: 
    

Modified: 
    mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
    mlir/test/Target/LLVMIR/Import/intrinsic.ll
    mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
index 2724bf079bbc1..ace880bd28590 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
@@ -468,6 +468,15 @@ def LLVM_ConstrainedFPTruncIntr
   }];
 }
 
+def LLVM_ConstrainedFPExtIntr
+    : LLVM_ConstrainedIntr<"fpext", /*numArgs=*/1,
+        /*overloadedResult=*/1, /*overloadedOperands=*/[0],
+        /*hasRoundingMode=*/0> {
+  let assemblyFormat = [{
+    $arg_0 $fpExceptionBehavior attr-dict `:` type($arg_0) `to` type(results)
+  }];
+}
+
 // Intrinsics with multiple returns.
 
 class LLVM_ArithWithOverflowOp<string mnem>

diff  --git a/mlir/test/Target/LLVMIR/Import/intrinsic.ll b/mlir/test/Target/LLVMIR/Import/intrinsic.ll
index 171c82313457d..09f1eb5529228 100644
--- a/mlir/test/Target/LLVMIR/Import/intrinsic.ll
+++ b/mlir/test/Target/LLVMIR/Import/intrinsic.ll
@@ -1034,6 +1034,19 @@ define void @experimental_constrained_fptrunc(double %s, <4 x double> %v) {
   ret void
 }
 
+; CHECK-LABEL: experimental_constrained_fpext
+define void @experimental_constrained_fpext(float %s, <4 x float> %v) {
+  ; CHECK: llvm.intr.experimental.constrained.fpext %{{.*}} ignore : f32 to f64
+  %1 = call double @llvm.experimental.constrained.fpext.f64.f32(float %s, metadata !"fpexcept.ignore")
+  ; CHECK: llvm.intr.experimental.constrained.fpext %{{.*}} maytrap : f32 to f64
+  %2 = call double @llvm.experimental.constrained.fpext.f64.f32(float %s, metadata !"fpexcept.maytrap")
+  ; CHECK: llvm.intr.experimental.constrained.fpext %{{.*}} strict : f32 to f64
+  %3 = call double @llvm.experimental.constrained.fpext.f64.f32(float %s, metadata !"fpexcept.strict")
+  ; CHECK: llvm.intr.experimental.constrained.fpext %{{.*}} ignore : vector<4xf32> to vector<4xf64>
+  %6 = call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float> %v, metadata !"fpexcept.ignore")
+  ret void
+}
+
 declare float @llvm.fmuladd.f32(float, float, float)
 declare <8 x float> @llvm.fmuladd.v8f32(<8 x float>, <8 x float>, <8 x float>)
 declare float @llvm.fma.f32(float, float, float)
@@ -1278,3 +1291,5 @@ declare <vscale x 4 x float> @llvm.vector.insert.nxv4f32.v4f32(<vscale x 4 x flo
 declare <4 x float> @llvm.vector.extract.v4f32.nxv4f32(<vscale x 4 x float>, i64)
 declare <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f64(<4 x double>, metadata, metadata)
 declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)
+declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)
+declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)

diff  --git a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
index f1c2aa11303ce..d54cd3cb11b51 100644
--- a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
@@ -1131,6 +1131,23 @@ llvm.func @experimental_constrained_fptrunc(%s: f64, %v: vector<4xf32>) {
   llvm.return
 }
 
+// CHECK-LABEL: @experimental_constrained_fpext
+llvm.func @experimental_constrained_fpext(%s: f32, %v: vector<4xf32>) {
+  // CHECK: call double @llvm.experimental.constrained.fpext.f64.f32(
+  // CHECK: metadata !"fpexcept.ignore"
+  %0 = llvm.intr.experimental.constrained.fpext %s ignore : f32 to f64
+  // CHECK: call double @llvm.experimental.constrained.fpext.f64.f32(
+  // CHECK: metadata !"fpexcept.maytrap"
+  %1 = llvm.intr.experimental.constrained.fpext %s maytrap : f32 to f64
+  // CHECK: call double @llvm.experimental.constrained.fpext.f64.f32(
+  // CHECK: metadata !"fpexcept.strict"
+  %2 = llvm.intr.experimental.constrained.fpext %s strict : f32 to f64
+  // CHECK: call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(
+  // CHECK: metadata !"fpexcept.strict"
+  %5 = llvm.intr.experimental.constrained.fpext %v strict : vector<4xf32> to vector<4xf64>
+  llvm.return
+}
+
 // Check that intrinsics are declared with appropriate types.
 // CHECK-DAG: declare float @llvm.fma.f32(float, float, float)
 // CHECK-DAG: declare <8 x float> @llvm.fma.v8f32(<8 x float>, <8 x float>, <8 x float>) #0


        


More information about the Mlir-commits mailing list