summaryrefslogtreecommitdiffstats
path: root/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp
diff options
context:
space:
mode:
authorManuel Freiberger <manuel.freiberger@gmail.com>2019-12-22 10:01:35 -0800
committerA. Unique TensorFlower <gardener@tensorflow.org>2019-12-22 10:02:13 -0800
commit22954a0e408afde1d8686dffb3a3dcab107a2cd3 (patch)
treed206709d143fb15efd807a2c601035668fcae7b2 /mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp
parentdcc14f08656a82aadd326aeca54b95b5b866fc86 (diff)
downloadbcm5719-llvm-22954a0e408afde1d8686dffb3a3dcab107a2cd3.tar.gz
bcm5719-llvm-22954a0e408afde1d8686dffb3a3dcab107a2cd3.zip
Add integer bit-shift operations to the standard dialect.
Rename the 'shlis' operation in the standard dialect to 'shift_left'. Add tests for this operation (these have been missing so far) and add a lowering to the 'shl' operation in the LLVM dialect. Add also 'shift_right_signed' (lowered to LLVM's 'ashr') and 'shift_right_unsigned' (lowered to 'lshr'). The original plan was to name these operations 'shift.left', 'shift.right.signed' and 'shift.right.unsigned'. This works if the operations are prefixed with 'std.' in MLIR assembly. Unfortunately during import the short form is ambigous with operations from a hypothetical 'shift' dialect. The best solution seems to omit dots in standard operations for now. Closes tensorflow/mlir#226 PiperOrigin-RevId: 286803388
Diffstat (limited to 'mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp')
-rw-r--r--mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp35
1 files changed, 27 insertions, 8 deletions
diff --git a/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp b/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp
index ea8501b9a7e..fdc90851b64 100644
--- a/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp
+++ b/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp
@@ -814,16 +814,20 @@ struct SubIOpLowering : public BinaryOpLLVMOpLowering<SubIOp, LLVM::SubOp> {
struct MulIOpLowering : public BinaryOpLLVMOpLowering<MulIOp, LLVM::MulOp> {
using Super::Super;
};
-struct DivISOpLowering : public BinaryOpLLVMOpLowering<DivISOp, LLVM::SDivOp> {
+struct SignedDivIOpLowering
+ : public BinaryOpLLVMOpLowering<SignedDivIOp, LLVM::SDivOp> {
using Super::Super;
};
-struct DivIUOpLowering : public BinaryOpLLVMOpLowering<DivIUOp, LLVM::UDivOp> {
+struct UnsignedDivIOpLowering
+ : public BinaryOpLLVMOpLowering<UnsignedDivIOp, LLVM::UDivOp> {
using Super::Super;
};
-struct RemISOpLowering : public BinaryOpLLVMOpLowering<RemISOp, LLVM::SRemOp> {
+struct SignedRemIOpLowering
+ : public BinaryOpLLVMOpLowering<SignedRemIOp, LLVM::SRemOp> {
using Super::Super;
};
-struct RemIUOpLowering : public BinaryOpLLVMOpLowering<RemIUOp, LLVM::URemOp> {
+struct UnsignedRemIOpLowering
+ : public BinaryOpLLVMOpLowering<UnsignedRemIOp, LLVM::URemOp> {
using Super::Super;
};
struct AndOpLowering : public BinaryOpLLVMOpLowering<AndOp, LLVM::AndOp> {
@@ -862,6 +866,18 @@ struct ConstLLVMOpLowering
: public OneToOneLLVMOpLowering<ConstantOp, LLVM::ConstantOp> {
using Super::Super;
};
+struct ShiftLeftOpLowering
+ : public OneToOneLLVMOpLowering<ShiftLeftOp, LLVM::ShlOp> {
+ using Super::Super;
+};
+struct SignedShiftRightOpLowering
+ : public OneToOneLLVMOpLowering<SignedShiftRightOp, LLVM::AShrOp> {
+ using Super::Super;
+};
+struct UnsignedShiftRightOpLowering
+ : public OneToOneLLVMOpLowering<UnsignedShiftRightOp, LLVM::LShrOp> {
+ using Super::Super;
+};
// Check if the MemRefType `type` is supported by the lowering. We currently
// only support memrefs with identity maps.
@@ -2082,8 +2098,6 @@ void mlir::populateStdToLLVMNonMemoryConversionPatterns(
CosOpLowering,
ConstLLVMOpLowering,
DivFOpLowering,
- DivISOpLowering,
- DivIUOpLowering,
ExpOpLowering,
LogOpLowering,
Log10OpLowering,
@@ -2097,18 +2111,23 @@ void mlir::populateStdToLLVMNonMemoryConversionPatterns(
OrOpLowering,
PrefetchOpLowering,
RemFOpLowering,
- RemISOpLowering,
- RemIUOpLowering,
ReturnOpLowering,
SIToFPLowering,
SelectOpLowering,
+ ShiftLeftOpLowering,
SignExtendIOpLowering,
+ SignedDivIOpLowering,
+ SignedRemIOpLowering,
+ SignedShiftRightOpLowering,
SplatOpLowering,
SplatNdOpLowering,
SubFOpLowering,
SubIOpLowering,
TanhOpLowering,
TruncateIOpLowering,
+ UnsignedDivIOpLowering,
+ UnsignedRemIOpLowering,
+ UnsignedShiftRightOpLowering,
XOrOpLowering,
ZeroExtendIOpLowering>(*converter.getDialect(), converter);
// clang-format on
OpenPOWER on IntegriCloud