summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Molloy <jmolloy@google.com>2019-11-01 07:31:33 -0700
committerA. Unique TensorFlower <gardener@tensorflow.org>2019-11-01 07:32:09 -0700
commit96531e2f871d74f6bc224446c40b37425d58a5b4 (patch)
treef65e90b0a346de8767d5571e71dde955c1818784
parent7432234f3c5ca2da83f152f9f0508244a3b01a18 (diff)
downloadbcm5719-llvm-96531e2f871d74f6bc224446c40b37425d58a5b4.tar.gz
bcm5719-llvm-96531e2f871d74f6bc224446c40b37425d58a5b4.zip
[mlir][llvm] Add missing cast ops
Also adds a builder method for fcmp, identical to that for icmp. PiperOrigin-RevId: 277923158
-rw-r--r--mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td10
-rw-r--r--mlir/test/Dialect/LLVMIR/roundtrip.mlir12
-rw-r--r--mlir/test/Target/llvmir.mlir19
3 files changed, 40 insertions, 1 deletions
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index d781f58902c..9bce041e7c5 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -230,6 +230,13 @@ def LLVM_FCmpOp : LLVM_OneResultOp<"fcmp", [NoSideEffect]>,
let llvmBuilder = [{
$res = builder.CreateFCmp(getLLVMCmpPredicate($predicate), $lhs, $rhs);
}];
+ let builders = [OpBuilder<
+ "Builder *b, OperationState &result, FCmpPredicate predicate, Value *lhs, "
+ "Value *rhs", [{
+ LLVMDialect *dialect = &lhs->getType().cast<LLVMType>().getDialect();
+ build(b, result, LLVMType::getInt1Ty(dialect),
+ b->getI64IntegerAttr(static_cast<int64_t>(predicate)), lhs, rhs);
+ }]>];
let parser = [{ return parseCmpOp<FCmpPredicate>(parser, result); }];
let printer = [{ printFCmpOp(p, *this); }];
}
@@ -309,13 +316,16 @@ class LLVM_CastOp<string mnemonic, string builderFunc,
let printer = [{ mlir::impl::printCastOp(this->getOperation(), p); }];
}
def LLVM_BitcastOp : LLVM_CastOp<"bitcast", "CreateBitCast">;
+def LLVM_AddrSpaceCastOp : LLVM_CastOp<"addrspacecast", "CreateAddrSpaceCast">;
def LLVM_IntToPtrOp : LLVM_CastOp<"inttoptr", "CreateIntToPtr">;
def LLVM_PtrToIntOp : LLVM_CastOp<"ptrtoint", "CreatePtrToInt">;
def LLVM_SExtOp : LLVM_CastOp<"sext", "CreateSExt">;
def LLVM_ZExtOp : LLVM_CastOp<"zext", "CreateZExt">;
def LLVM_TruncOp : LLVM_CastOp<"trunc", "CreateTrunc">;
def LLVM_SIToFPOp : LLVM_CastOp<"sitofp", "CreateSIToFP">;
+def LLVM_UIToFPOp : LLVM_CastOp<"uitofp", "CreateUIToFP">;
def LLVM_FPToSIOp : LLVM_CastOp<"fptosi", "CreateFPToSI">;
+def LLVM_FPToUIOp : LLVM_CastOp<"fptoui", "CreateFPToUI">;
def LLVM_FPExtOp : LLVM_CastOp<"fpext", "CreateFPExt">;
def LLVM_FPTruncOp : LLVM_CastOp<"fptrunc", "CreateFPTrunc">;
diff --git a/mlir/test/Dialect/LLVMIR/roundtrip.mlir b/mlir/test/Dialect/LLVMIR/roundtrip.mlir
index 06bb7ea032f..0bd839ea361 100644
--- a/mlir/test/Dialect/LLVMIR/roundtrip.mlir
+++ b/mlir/test/Dialect/LLVMIR/roundtrip.mlir
@@ -159,7 +159,7 @@ func @foo(%arg0: !llvm.i32) -> !llvm<"{ i32, double, i32 }"> {
// CHECK-LABEL: @casts
func @casts(%arg0: !llvm.i32, %arg1: !llvm.i64, %arg2: !llvm<"<4 x i32>">,
- %arg3: !llvm<"<4 x i64>">) {
+ %arg3: !llvm<"<4 x i64>">, %arg4: !llvm<"i32*">) {
// CHECK-NEXT: = llvm.sext %arg0 : !llvm.i32 to !llvm.i56
%0 = llvm.sext %arg0 : !llvm.i32 to !llvm.i56
// CHECK-NEXT: = llvm.zext %arg0 : !llvm.i32 to !llvm.i64
@@ -172,6 +172,16 @@ func @casts(%arg0: !llvm.i32, %arg1: !llvm.i64, %arg2: !llvm<"<4 x i32>">,
%4 = llvm.zext %arg2 : !llvm<"<4 x i32>"> to !llvm<"<4 x i64>">
// CHECK-NEXT: = llvm.trunc %arg3 : !llvm<"<4 x i64>"> to !llvm<"<4 x i56>">
%5 = llvm.trunc %arg3 : !llvm<"<4 x i64>"> to !llvm<"<4 x i56>">
+// CHECK-NEXT: = llvm.sitofp %arg0 : !llvm.i32 to !llvm.float
+ %6 = llvm.sitofp %arg0 : !llvm.i32 to !llvm.float
+// CHECK-NEXT: = llvm.uitofp %arg0 : !llvm.i32 to !llvm.float
+ %7 = llvm.uitofp %arg0 : !llvm.i32 to !llvm.float
+// CHECK-NEXT: = llvm.fptosi %7 : !llvm.float to !llvm.i32
+ %8 = llvm.fptosi %7 : !llvm.float to !llvm.i32
+// CHECK-NEXT: = llvm.fptoui %7 : !llvm.float to !llvm.i32
+ %9 = llvm.fptoui %7 : !llvm.float to !llvm.i32
+// CHECK-NEXT: = llvm.addrspacecast %arg4 : !llvm<"i32*"> to !llvm<"i32 addrspace(2)*">
+ %10 = llvm.addrspacecast %arg4 : !llvm<"i32*"> to !llvm<"i32 addrspace(2)*">
llvm.return
}
diff --git a/mlir/test/Target/llvmir.mlir b/mlir/test/Target/llvmir.mlir
index 676e497c9a3..249d4599d2b 100644
--- a/mlir/test/Target/llvmir.mlir
+++ b/mlir/test/Target/llvmir.mlir
@@ -865,6 +865,25 @@ llvm.func @intpointerconversion(%arg0 : !llvm.i32) -> !llvm.i32 {
llvm.return %2 : !llvm.i32
}
+llvm.func @fpconversion(%arg0 : !llvm.i32) -> !llvm.i32 {
+// CHECK: %2 = sitofp i32 %0 to float
+// CHECK-NEXT: %3 = fptosi float %2 to i32
+// CHECK-NEXT: %4 = uitofp i32 %3 to float
+// CHECK-NEXT: %5 = fptoui float %4 to i32
+ %1 = llvm.sitofp %arg0 : !llvm.i32 to !llvm.float
+ %2 = llvm.fptosi %1 : !llvm.float to !llvm.i32
+ %3 = llvm.uitofp %2 : !llvm.i32 to !llvm.float
+ %4 = llvm.fptoui %3 : !llvm.float to !llvm.i32
+ llvm.return %4 : !llvm.i32
+}
+
+// CHECK-LABEL: @addrspace
+llvm.func @addrspace(%arg0 : !llvm<"i32*">) -> !llvm<"i32 addrspace(2)*"> {
+// CHECK: %2 = addrspacecast i32* %0 to i32 addrspace(2)*
+ %1 = llvm.addrspacecast %arg0 : !llvm<"i32*"> to !llvm<"i32 addrspace(2)*">
+ llvm.return %1 : !llvm<"i32 addrspace(2)*">
+}
+
llvm.func @stringconstant() -> !llvm<"i8*"> {
%1 = llvm.mlir.constant("Hello world!") : !llvm<"i8*">
// CHECK: ret [12 x i8] c"Hello world!"
OpenPOWER on IntegriCloud