diff options
author | James Molloy <jmolloy@google.com> | 2019-11-01 07:31:33 -0700 |
---|---|---|
committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-11-01 07:32:09 -0700 |
commit | 96531e2f871d74f6bc224446c40b37425d58a5b4 (patch) | |
tree | f65e90b0a346de8767d5571e71dde955c1818784 | |
parent | 7432234f3c5ca2da83f152f9f0508244a3b01a18 (diff) | |
download | bcm5719-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.td | 10 | ||||
-rw-r--r-- | mlir/test/Dialect/LLVMIR/roundtrip.mlir | 12 | ||||
-rw-r--r-- | mlir/test/Target/llvmir.mlir | 19 |
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!" |