[MLIR][SPIRVToLLVM] Added Bitcast conversion pattern
authorGeorge Mitenkov <georgemitenk0v@gmail.com>
Tue, 30 Jun 2020 00:32:40 +0000 (20:32 -0400)
committerLei Zhang <antiagainst@google.com>
Tue, 30 Jun 2020 00:32:48 +0000 (20:32 -0400)
Added conversion pattern and tests for `spv.Bitcast` op.  This one has
a direct mapping in LLVM dialect so `DirectConversionPattern` was used.

Differential Revision: https://reviews.llvm.org/D82748

mlir/lib/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.cpp
mlir/test/Conversion/SPIRVToLLVM/cast-ops-to-llvm.mlir

index 83be1c5..771610e 100644 (file)
@@ -388,6 +388,7 @@ void mlir::populateSPIRVToLLVMConversionPatterns(
       NotPattern<spirv::NotOp>,
 
       // Cast ops
+      DirectConversionPattern<spirv::BitcastOp, LLVM::BitcastOp>,
       DirectConversionPattern<spirv::ConvertFToSOp, LLVM::FPToSIOp>,
       DirectConversionPattern<spirv::ConvertFToUOp, LLVM::FPToUIOp>,
       DirectConversionPattern<spirv::ConvertSToFOp, LLVM::SIToFPOp>,
index 6a77224..0d101f3 100644 (file)
@@ -1,6 +1,40 @@
 // RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s
 
 //===----------------------------------------------------------------------===//
+// spv.Bitcast
+//===----------------------------------------------------------------------===//
+
+func @bitcast_float_to_integer_scalar(%arg0 : f32) {
+       // CHECK: {{.*}} = llvm.bitcast {{.*}} : !llvm.float to !llvm.i32
+       %0 = spv.Bitcast %arg0: f32 to i32
+       return
+}
+
+func @bitcast_float_to_integer_vector(%arg0 : vector<3xf32>) {
+       // CHECK: {{.*}} = llvm.bitcast {{.*}} : !llvm<"<3 x float>"> to !llvm<"<3 x i32>">
+       %0 = spv.Bitcast %arg0: vector<3xf32> to vector<3xi32>
+       return
+}
+
+func @bitcast_vector_to_scalar(%arg0 : vector<2xf32>) {
+       // CHECK: {{.*}} = llvm.bitcast {{.*}} : !llvm<"<2 x float>"> to !llvm.i64
+       %0 = spv.Bitcast %arg0: vector<2xf32> to i64
+       return
+}
+
+func @bitcast_scalar_to_vector(%arg0 : f64) {
+       // CHECK: {{.*}} = llvm.bitcast {{.*}} : !llvm.double to !llvm<"<2 x i32>">
+       %0 = spv.Bitcast %arg0: f64 to vector<2xi32>
+       return
+}
+
+func @bitcast_vector_to_vector(%arg0 : vector<4xf32>) {
+       // CHECK: {{.*}} = llvm.bitcast {{.*}} : !llvm<"<4 x float>"> to !llvm<"<2 x i64>">
+       %0 = spv.Bitcast %arg0: vector<4xf32> to vector<2xi64>
+       return
+}
+
+//===----------------------------------------------------------------------===//
 // spv.ConvertFToS
 //===----------------------------------------------------------------------===//