Skip to content

Commit

Permalink
[MLIR][SPIRVToLLVM] Conversion for bitrverse and bitcount ops
Browse files Browse the repository at this point in the history
Implemented conversion for `spv.BitReverse` and `spv.BitCount`. Since ODS
generates builders in a different way for LLVM dialect intrinsics, I
added attributes to build method in `DirectConversionPattern` class. The
tests for these ops are in `bitwise-ops-to-llvm.mlir`.

Differential Revision: https://reviews.llvm.org/D82286
  • Loading branch information
georgemitenkov authored and antiagainst committed Jun 26, 2020
1 parent 056a539 commit c8295de
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
5 changes: 4 additions & 1 deletion mlir/lib/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.cpp
Expand Up @@ -72,7 +72,8 @@ class DirectConversionPattern : public SPIRVToLLVMConversion<SPIRVOp> {
auto dstType = this->typeConverter.convertType(operation.getType());
if (!dstType)
return failure();
rewriter.template replaceOpWithNewOp<LLVMOp>(operation, dstType, operands);
rewriter.template replaceOpWithNewOp<LLVMOp>(operation, dstType, operands,
operation.getAttrs());
return success();
}
};
Expand Down Expand Up @@ -340,6 +341,8 @@ void mlir::populateSPIRVToLLVMConversionPatterns(
DirectConversionPattern<spirv::UModOp, LLVM::URemOp>,

// Bitwise ops
DirectConversionPattern<spirv::BitCountOp, LLVM::CtPopOp>,
DirectConversionPattern<spirv::BitReverseOp, LLVM::BitReverseOp>,
DirectConversionPattern<spirv::BitwiseAndOp, LLVM::AndOp>,
DirectConversionPattern<spirv::BitwiseOrOp, LLVM::OrOp>,
DirectConversionPattern<spirv::BitwiseXorOp, LLVM::XOrOp>,
Expand Down
32 changes: 32 additions & 0 deletions mlir/test/Conversion/SPIRVToLLVM/bitwise-ops-to-llvm.mlir
@@ -1,5 +1,37 @@
// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s

//===----------------------------------------------------------------------===//
// spv.BitCount
//===----------------------------------------------------------------------===//

func @bitcount_scalar(%arg0: i16) {
// CHECK: %{{.*}} = "llvm.intr.ctpop"(%{{.*}}) : (!llvm.i16) -> !llvm.i16
%0 = spv.BitCount %arg0: i16
return
}

func @bitcount_vector(%arg0: vector<3xi32>) {
// CHECK: %{{.*}} = "llvm.intr.ctpop"(%{{.*}}) : (!llvm<"<3 x i32>">) -> !llvm<"<3 x i32>">
%0 = spv.BitCount %arg0: vector<3xi32>
return
}

//===----------------------------------------------------------------------===//
// spv.BitReverse
//===----------------------------------------------------------------------===//

func @bitreverse_scalar(%arg0: i64) {
// CHECK: %{{.*}} = "llvm.intr.bitreverse"(%{{.*}}) : (!llvm.i64) -> !llvm.i64
%0 = spv.BitReverse %arg0: i64
return
}

func @bitreverse_vector(%arg0: vector<4xi32>) {
// CHECK: %{{.*}} = "llvm.intr.bitreverse"(%{{.*}}) : (!llvm<"<4 x i32>">) -> !llvm<"<4 x i32>">
%0 = spv.BitReverse %arg0: vector<4xi32>
return
}

//===----------------------------------------------------------------------===//
// spv.BitwiseAnd
//===----------------------------------------------------------------------===//
Expand Down

0 comments on commit c8295de

Please sign in to comment.