126be7fe2SLei Zhang //===- MemRefToSPIRVPass.cpp - MemRef to SPIR-V Passes ----------------===// 226be7fe2SLei Zhang // 326be7fe2SLei Zhang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 426be7fe2SLei Zhang // See https://llvm.org/LICENSE.txt for license information. 526be7fe2SLei Zhang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 626be7fe2SLei Zhang // 726be7fe2SLei Zhang //===----------------------------------------------------------------------===// 826be7fe2SLei Zhang // 926be7fe2SLei Zhang // This file implements a pass to convert standard dialect to SPIR-V dialect. 1026be7fe2SLei Zhang // 1126be7fe2SLei Zhang //===----------------------------------------------------------------------===// 1226be7fe2SLei Zhang 1326be7fe2SLei Zhang #include "mlir/Conversion/MemRefToSPIRV/MemRefToSPIRVPass.h" 1467d0d7acSMichele Scuttari 1526be7fe2SLei Zhang #include "mlir/Conversion/MemRefToSPIRV/MemRefToSPIRV.h" 1626be7fe2SLei Zhang #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" 1726be7fe2SLei Zhang #include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h" 1826be7fe2SLei Zhang 1967d0d7acSMichele Scuttari namespace mlir { 2067d0d7acSMichele Scuttari #define GEN_PASS_DEF_CONVERTMEMREFTOSPIRV 2167d0d7acSMichele Scuttari #include "mlir/Conversion/Passes.h.inc" 2267d0d7acSMichele Scuttari } // namespace mlir 2367d0d7acSMichele Scuttari 2426be7fe2SLei Zhang using namespace mlir; 2526be7fe2SLei Zhang 2626be7fe2SLei Zhang namespace { 2726be7fe2SLei Zhang /// A pass converting MLIR MemRef operations into the SPIR-V dialect. 2826be7fe2SLei Zhang class ConvertMemRefToSPIRVPass 2967d0d7acSMichele Scuttari : public impl::ConvertMemRefToSPIRVBase<ConvertMemRefToSPIRVPass> { 3026be7fe2SLei Zhang void runOnOperation() override; 3126be7fe2SLei Zhang }; 3226be7fe2SLei Zhang } // namespace 3326be7fe2SLei Zhang runOnOperation()3426be7fe2SLei Zhangvoid ConvertMemRefToSPIRVPass::runOnOperation() { 3526be7fe2SLei Zhang MLIRContext *context = &getContext(); 36f230d915Sjackalcooper Operation *op = getOperation(); 3726be7fe2SLei Zhang 38f230d915Sjackalcooper auto targetAttr = spirv::lookupTargetEnvOrDefault(op); 3926be7fe2SLei Zhang std::unique_ptr<ConversionTarget> target = 4026be7fe2SLei Zhang SPIRVConversionTarget::get(targetAttr); 4126be7fe2SLei Zhang 42dfaebd3dSLei Zhang SPIRVConversionOptions options; 439f5300c8SLei Zhang options.boolNumBits = this->boolNumBits; 44*4ffc63abSLei Zhang options.use64bitIndex = this->use64bitIndex; 459f5300c8SLei Zhang SPIRVTypeConverter typeConverter(targetAttr, options); 4626be7fe2SLei Zhang 4726be7fe2SLei Zhang // Use UnrealizedConversionCast as the bridge so that we don't need to pull in 4826be7fe2SLei Zhang // patterns for other dialects. 4926be7fe2SLei Zhang target->addLegalOp<UnrealizedConversionCastOp>(); 5026be7fe2SLei Zhang 5126be7fe2SLei Zhang RewritePatternSet patterns(context); 5226be7fe2SLei Zhang populateMemRefToSPIRVPatterns(typeConverter, patterns); 5326be7fe2SLei Zhang 54f230d915Sjackalcooper if (failed(applyPartialConversion(op, *target, std::move(patterns)))) 5526be7fe2SLei Zhang return signalPassFailure(); 5626be7fe2SLei Zhang } 5726be7fe2SLei Zhang createConvertMemRefToSPIRVPass()58f230d915Sjackalcooperstd::unique_ptr<OperationPass<>> mlir::createConvertMemRefToSPIRVPass() { 5926be7fe2SLei Zhang return std::make_unique<ConvertMemRefToSPIRVPass>(); 6026be7fe2SLei Zhang } 61