Skip to content

Commit

Permalink
[mlir][llvm] Add missing cast ops
Browse files Browse the repository at this point in the history
Also adds a builder method for fcmp, identical to that for icmp.

PiperOrigin-RevId: 277923158
  • Loading branch information
James Molloy authored and tensorflower-gardener committed Nov 1, 2019
1 parent 7432234 commit 96531e2
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
10 changes: 10 additions & 0 deletions mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
Expand Up @@ -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); }];
}
Expand Down Expand Up @@ -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">;

Expand Down
12 changes: 11 additions & 1 deletion mlir/test/Dialect/LLVMIR/roundtrip.mlir
Expand Up @@ -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
Expand All @@ -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
}

Expand Down
19 changes: 19 additions & 0 deletions mlir/test/Target/llvmir.mlir
Expand Up @@ -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!"
Expand Down

0 comments on commit 96531e2

Please sign in to comment.