[Mlir-commits] [mlir] d34df52 - Implement FPToUI and UIToFP ops in standard dialect
Alex Zinenko
llvmlistbot at llvm.org
Wed Aug 19 13:49:18 PDT 2020
Author: Mars Saxman
Date: 2020-08-19T22:49:09+02:00
New Revision: d34df52377fda5452a8c244a8378957eaed66700
URL: https://github.com/llvm/llvm-project/commit/d34df52377fda5452a8c244a8378957eaed66700
DIFF: https://github.com/llvm/llvm-project/commit/d34df52377fda5452a8c244a8378957eaed66700.diff
LOG: Implement FPToUI and UIToFP ops in standard dialect
Add the unsigned complements to the existing FPToSI and SIToFP operations in the
standard dialect, with one-to-one lowerings to the corresponding LLVM operations.
Reviewed By: ftynse
Differential Revision: https://reviews.llvm.org/D85557
Added:
Modified:
mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp
mlir/lib/Dialect/StandardOps/IR/Ops.cpp
mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td b/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
index 510d485d019f..b80da2958019 100644
--- a/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
+++ b/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
@@ -1642,6 +1642,26 @@ def FPToSIOp : CastOp<"fptosi">, Arguments<(ins AnyType:$in)> {
let hasFolder = 0;
}
+//===----------------------------------------------------------------------===//
+// FPToUIOp
+//===----------------------------------------------------------------------===//
+
+def FPToUIOp : CastOp<"fptoui">, Arguments<(ins AnyType:$in)> {
+ let summary = "cast from floating-point type to integer type";
+ let description = [{
+ Cast from a value interpreted as floating-point to the nearest (rounding
+ towards zero) unsigned integer value.
+ }];
+
+ let extraClassDeclaration = [{
+ /// Return true if `a` and `b` are valid operand and result pairs for
+ /// the operation.
+ static bool areCastCompatible(Type a, Type b);
+ }];
+
+ let hasFolder = 0;
+}
+
//===----------------------------------------------------------------------===//
// FPTruncOp
//===----------------------------------------------------------------------===//
@@ -3064,6 +3084,28 @@ def TruncateIOp : Std_Op<"trunci", [NoSideEffect, SameOperandsAndResultShape]> {
}];
}
+//===----------------------------------------------------------------------===//
+// UIToFPOp
+//===----------------------------------------------------------------------===//
+
+def UIToFPOp : CastOp<"uitofp">, Arguments<(ins AnyType:$in)> {
+ let summary = "cast from unsigned integer type to floating-point";
+ let description = [{
+ Cast from a value interpreted as unsigned integer to the corresponding
+ floating-point value. If the value cannot be exactly represented, it is
+ rounded using the default rounding mode. Only scalars are currently
+ supported.
+ }];
+
+ let extraClassDeclaration = [{
+ /// Return true if `a` and `b` are valid operand and result pairs for
+ /// the operation.
+ static bool areCastCompatible(Type a, Type b);
+ }];
+
+ let hasFolder = 0;
+}
+
//===----------------------------------------------------------------------===//
// UnsignedDivIOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp
index 44d912bfd8ed..36d786d0812d 100644
--- a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp
+++ b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp
@@ -2630,6 +2630,11 @@ struct SIToFPLowering
using Super::Super;
};
+struct UIToFPLowering
+ : public OneToOneConvertToLLVMPattern<UIToFPOp, LLVM::UIToFPOp> {
+ using Super::Super;
+};
+
struct FPExtLowering
: public OneToOneConvertToLLVMPattern<FPExtOp, LLVM::FPExtOp> {
using Super::Super;
@@ -2640,6 +2645,11 @@ struct FPToSILowering
using Super::Super;
};
+struct FPToUILowering
+ : public OneToOneConvertToLLVMPattern<FPToUIOp, LLVM::FPToUIOp> {
+ using Super::Super;
+};
+
struct FPTruncLowering
: public OneToOneConvertToLLVMPattern<FPTruncOp, LLVM::FPTruncOp> {
using Super::Super;
@@ -3293,6 +3303,7 @@ void mlir::populateStdToLLVMNonMemoryConversionPatterns(
Log2OpLowering,
FPExtLowering,
FPToSILowering,
+ FPToUILowering,
FPTruncLowering,
ImOpLowering,
IndexCastOpLowering,
@@ -3320,6 +3331,7 @@ void mlir::populateStdToLLVMNonMemoryConversionPatterns(
SubFOpLowering,
SubIOpLowering,
TruncateIOpLowering,
+ UIToFPLowering,
UnsignedDivIOpLowering,
UnsignedRemIOpLowering,
UnsignedShiftRightOpLowering,
diff --git a/mlir/lib/Dialect/StandardOps/IR/Ops.cpp b/mlir/lib/Dialect/StandardOps/IR/Ops.cpp
index 447e500deb95..9a5443048216 100644
--- a/mlir/lib/Dialect/StandardOps/IR/Ops.cpp
+++ b/mlir/lib/Dialect/StandardOps/IR/Ops.cpp
@@ -1779,6 +1779,14 @@ bool FPToSIOp::areCastCompatible(Type a, Type b) {
return a.isa<FloatType>() && b.isSignlessInteger();
}
+//===----------------------------------------------------------------------===//
+// FPToUIOp
+//===----------------------------------------------------------------------===//
+
+bool FPToUIOp::areCastCompatible(Type a, Type b) {
+ return a.isa<FloatType>() && b.isSignlessInteger();
+}
+
//===----------------------------------------------------------------------===//
// FPTruncOp
//===----------------------------------------------------------------------===//
@@ -2305,6 +2313,15 @@ OpFoldResult SubIOp::fold(ArrayRef<Attribute> operands) {
[](APInt a, APInt b) { return a - b; });
}
+//===----------------------------------------------------------------------===//
+// UIToFPOp
+//===----------------------------------------------------------------------===//
+
+// uitofp is applicable from integer types to float types.
+bool UIToFPOp::areCastCompatible(Type a, Type b) {
+ return a.isSignlessInteger() && b.isa<FloatType>();
+}
+
//===----------------------------------------------------------------------===//
// SubViewOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir b/mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir
index 419ee17d8f06..62be4783e364 100644
--- a/mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir
+++ b/mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir
@@ -580,7 +580,7 @@ func @index_cast(%arg0: index, %arg1: i1) {
return
}
-// Checking conversion of integer types to floating point.
+// Checking conversion of signed integer types to floating point.
// CHECK-LABEL: @sitofp
func @sitofp(%arg0 : i32, %arg1 : i64) {
// CHECK-NEXT: = llvm.sitofp {{.*}} : !llvm.i32 to !llvm.float
@@ -594,6 +594,20 @@ func @sitofp(%arg0 : i32, %arg1 : i64) {
return
}
+// Checking conversion of unsigned integer types to floating point.
+// CHECK-LABEL: @uitofp
+func @uitofp(%arg0 : i32, %arg1 : i64) {
+// CHECK-NEXT: = llvm.uitofp {{.*}} : !llvm.i32 to !llvm.float
+ %0 = uitofp %arg0: i32 to f32
+// CHECK-NEXT: = llvm.uitofp {{.*}} : !llvm.i32 to !llvm.double
+ %1 = uitofp %arg0: i32 to f64
+// CHECK-NEXT: = llvm.uitofp {{.*}} : !llvm.i64 to !llvm.float
+ %2 = uitofp %arg1: i64 to f32
+// CHECK-NEXT: = llvm.uitofp {{.*}} : !llvm.i64 to !llvm.double
+ %3 = uitofp %arg1: i64 to f64
+ return
+}
+
// Checking conversion of integer types to floating point.
// CHECK-LABEL: @fpext
func @fpext(%arg0 : f16, %arg1 : f32) {
@@ -632,6 +646,21 @@ func @fptosi(%arg0 : f32, %arg1 : f64) {
return
}
+// Checking conversion of floating point to integer types.
+// CHECK-LABEL: @fptoui
+func @fptoui(%arg0 : f32, %arg1 : f64) {
+// CHECK-NEXT: = llvm.fptoui {{.*}} : !llvm.float to !llvm.i32
+ %0 = fptoui %arg0: f32 to i32
+// CHECK-NEXT: = llvm.fptoui {{.*}} : !llvm.float to !llvm.i64
+ %1 = fptoui %arg0: f32 to i64
+// CHECK-NEXT: = llvm.fptoui {{.*}} : !llvm.double to !llvm.i32
+ %2 = fptoui %arg1: f64 to i32
+// CHECK-NEXT: = llvm.fptoui {{.*}} : !llvm.double to !llvm.i64
+ %3 = fptoui %arg1: f64 to i64
+ return
+}
+
+
// Checking conversion of integer types to floating point.
// CHECK-LABEL: @fptrunc
func @fptrunc(%arg0 : f32, %arg1 : f64) {
More information about the Mlir-commits
mailing list