blob: 2ce8e167cf7e198c1ab54230870af6e4cd507592 [file]
// Copyright 2019 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/VM/Conversion/ImportUtils.h"
#include "iree/compiler/Dialect/VM/IR/VMOps.h"
#include "mlir/Transforms/DialectConversion.h"
namespace mlir::iree_compiler {
namespace {
class AllocatorAllocateOpConversion
: public OpConversionPattern<IREE::HAL::AllocatorAllocateOp> {
public:
AllocatorAllocateOpConversion(TypeConverter &typeConverter,
MLIRContext *context,
SymbolTable &importSymbols)
: OpConversionPattern(typeConverter, context) {
importOp =
importSymbols.lookup<IREE::VM::ImportOp>("hal.allocator.allocate");
assert(importOp);
}
LogicalResult
matchAndRewrite(IREE::HAL::AllocatorAllocateOp op, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
auto callOp = rewriter.replaceOpWithNewOp<IREE::VM::CallOp>(
op, importOp.getName(),
ArrayRef<Type>{
getTypeConverter()->convertType(op.getType()),
},
ArrayRef<Value>{
adaptor.getAllocator(),
castToImportType(adaptor.getQueueAffinity(), rewriter.getI64Type(),
rewriter),
rewriter.createOrFold<IREE::VM::ConstI32Op>(
op.getLoc(), op.getMemoryTypesAttr().getInt()),
rewriter.createOrFold<IREE::VM::ConstI32Op>(
op.getLoc(), op.getBufferUsageAttr().getInt()),
castToImportType(adaptor.getResultSize(), rewriter.getI64Type(),
rewriter),
});
copyImportAttrs(importOp, callOp);
return success();
}
private:
mutable IREE::VM::ImportOp importOp;
};
class AllocatorImportOpConversion
: public OpConversionPattern<IREE::HAL::AllocatorImportOp> {
public:
AllocatorImportOpConversion(TypeConverter &typeConverter,
MLIRContext *context, SymbolTable &importSymbols)
: OpConversionPattern(typeConverter, context) {
importOp = importSymbols.lookup<IREE::VM::ImportOp>("hal.allocator.import");
assert(importOp);
}
LogicalResult
matchAndRewrite(IREE::HAL::AllocatorImportOp op, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
auto callOp = rewriter.create<IREE::VM::CallOp>(
op.getLoc(), importOp.getName(),
ArrayRef<Type>{
getTypeConverter()->convertType(op.getResult().getType()),
},
ArrayRef<Value>{
adaptor.getAllocator(),
rewriter.createOrFold<IREE::VM::ConstI32Op>(op.getLoc(), /*try=*/1),
castToImportType(adaptor.getQueueAffinity(), rewriter.getI64Type(),
rewriter),
rewriter.createOrFold<IREE::VM::ConstI32Op>(
op.getLoc(), op.getMemoryTypesAttr().getInt()),
rewriter.createOrFold<IREE::VM::ConstI32Op>(
op.getLoc(), op.getBufferUsageAttr().getInt()),
adaptor.getSource(),
castToImportType(adaptor.getOffset(), rewriter.getI64Type(),
rewriter),
castToImportType(adaptor.getLength(), rewriter.getI64Type(),
rewriter),
});
copyImportAttrs(importOp, callOp);
auto result = callOp.getResults().front();
auto didImport = rewriter.create<IREE::VM::CmpNZRefOp>(
op.getLoc(), rewriter.getI32Type(), result);
rewriter.replaceOp(op, {didImport, result});
return success();
}
private:
mutable IREE::VM::ImportOp importOp;
};
} // namespace
void populateHALAllocatorToVMPatterns(MLIRContext *context,
SymbolTable &importSymbols,
TypeConverter &typeConverter,
RewritePatternSet &patterns) {
patterns.insert<AllocatorAllocateOpConversion>(typeConverter, context,
importSymbols);
patterns.insert<AllocatorImportOpConversion>(typeConverter, context,
importSymbols);
}
} // namespace mlir::iree_compiler