[mlir] Add std.bitcast -> llvm.bitcast conversion

The conversion is a straightforward one-to-one mapping with optional unrolling
for nD vectors, similarly to other cast operations.

Depends On D107889

Reviewed By: cota, akuegel

Differential Revision: https://reviews.llvm.org/D107891
This commit is contained in:
Alex Zinenko 2021-08-11 13:23:40 +02:00
parent 79b0576dd4
commit a0d8a08e3e
3 changed files with 27 additions and 0 deletions

View file

@ -376,6 +376,8 @@ using AbsFOpLowering = VectorConvertToLLVMPattern<AbsFOp, LLVM::FAbsOp>;
using AddFOpLowering = VectorConvertToLLVMPattern<AddFOp, LLVM::FAddOp>;
using AddIOpLowering = VectorConvertToLLVMPattern<AddIOp, LLVM::AddOp>;
using AndOpLowering = VectorConvertToLLVMPattern<AndOp, LLVM::AndOp>;
using BitcastOpLowering =
VectorConvertToLLVMPattern<BitcastOp, LLVM::BitcastOp>;
using CeilFOpLowering = VectorConvertToLLVMPattern<CeilFOp, LLVM::FCeilOp>;
using CopySignOpLowering =
VectorConvertToLLVMPattern<CopySignOp, LLVM::CopySignOp>;
@ -1128,6 +1130,7 @@ void mlir::populateStdToLLVMConversionPatterns(LLVMTypeConverter &converter,
AndOpLowering,
AssertOpLowering,
AtomicRMWOpLowering,
BitcastOpLowering,
BranchOpLowering,
CallIndirectOpLowering,
CallOpLowering,

View file

@ -180,3 +180,18 @@ func @shru_vector(%arg0 : vector<1x2x3xi64>) -> vector<1x2x3xi64> {
%0 = shift_right_unsigned %arg0, %c1 : vector<1x2x3xi64>
return %0 : vector<1x2x3xi64>
}
// -----
// CHECK-LABEL: @bitcast_2d
func @bitcast_2d(%arg0: vector<2x4xf32>) {
// CHECK: llvm.mlir.undef
// CHECK: llvm.extractvalue %{{.*}}[0]
// CHECK: llvm.bitcast %{{.*}} : vector<4xf32> to vector<4xi32>
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0]
// CHECK: llvm.extractvalue %{{.*}}[1]
// CHECK: llvm.bitcast %{{.*}} : vector<4xf32> to vector<4xi32>
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[1]
std.bitcast %arg0 : vector<2x4xf32> to vector<2x4xi32>
return
}

View file

@ -928,6 +928,15 @@ func @index_vector(%arg0: vector<4xindex>) {
// -----
// CHECK-LABEL: @bitcast_1d
func @bitcast_1d(%arg0: vector<2xf32>) {
// CHECK: llvm.bitcast %{{.*}} : vector<2xf32> to vector<2xi32>
std.bitcast %arg0 : vector<2xf32> to vector<2xi32>
return
}
// -----
// CHECK-LABEL: func @cmpf_2dvector(
func @cmpf_2dvector(%arg0 : vector<4x3xf32>, %arg1 : vector<4x3xf32>) {
// CHECK: %[[EXTRACT1:.*]] = llvm.extractvalue %arg0[0] : !llvm.array<4 x vector<3xf32>>