1*3ba66435SRiver Riddle //===- ControlFlowToSPIRVPass.cpp - ControlFlow to SPIR-V Pass ------------===// 2*3ba66435SRiver Riddle // 3*3ba66435SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*3ba66435SRiver Riddle // See https://llvm.org/LICENSE.txt for license information. 5*3ba66435SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*3ba66435SRiver Riddle // 7*3ba66435SRiver Riddle //===----------------------------------------------------------------------===// 8*3ba66435SRiver Riddle // 9*3ba66435SRiver Riddle // This file implements a pass to convert ControlFlow dialect to SPIR-V dialect. 10*3ba66435SRiver Riddle // 11*3ba66435SRiver Riddle //===----------------------------------------------------------------------===// 12*3ba66435SRiver Riddle 13*3ba66435SRiver Riddle #include "mlir/Conversion/ControlFlowToSPIRV/ControlFlowToSPIRVPass.h" 14*3ba66435SRiver Riddle #include "../PassDetail.h" 15*3ba66435SRiver Riddle #include "mlir/Conversion/ControlFlowToSPIRV/ControlFlowToSPIRV.h" 16*3ba66435SRiver Riddle #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" 17*3ba66435SRiver Riddle #include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h" 18*3ba66435SRiver Riddle 19*3ba66435SRiver Riddle using namespace mlir; 20*3ba66435SRiver Riddle 21*3ba66435SRiver Riddle namespace { 22*3ba66435SRiver Riddle /// A pass converting MLIR ControlFlow operations into the SPIR-V dialect. 23*3ba66435SRiver Riddle class ConvertControlFlowToSPIRVPass 24*3ba66435SRiver Riddle : public ConvertControlFlowToSPIRVBase<ConvertControlFlowToSPIRVPass> { 25*3ba66435SRiver Riddle void runOnOperation() override; 26*3ba66435SRiver Riddle }; 27*3ba66435SRiver Riddle } // namespace 28*3ba66435SRiver Riddle runOnOperation()29*3ba66435SRiver Riddlevoid ConvertControlFlowToSPIRVPass::runOnOperation() { 30*3ba66435SRiver Riddle MLIRContext *context = &getContext(); 31*3ba66435SRiver Riddle ModuleOp module = getOperation(); 32*3ba66435SRiver Riddle 33*3ba66435SRiver Riddle auto targetAttr = spirv::lookupTargetEnvOrDefault(module); 34*3ba66435SRiver Riddle std::unique_ptr<ConversionTarget> target = 35*3ba66435SRiver Riddle SPIRVConversionTarget::get(targetAttr); 36*3ba66435SRiver Riddle 37*3ba66435SRiver Riddle SPIRVTypeConverter::Options options; 38*3ba66435SRiver Riddle options.emulateNon32BitScalarTypes = this->emulateNon32BitScalarTypes; 39*3ba66435SRiver Riddle SPIRVTypeConverter typeConverter(targetAttr, options); 40*3ba66435SRiver Riddle 41*3ba66435SRiver Riddle RewritePatternSet patterns(context); 42*3ba66435SRiver Riddle cf::populateControlFlowToSPIRVPatterns(typeConverter, patterns); 43*3ba66435SRiver Riddle 44*3ba66435SRiver Riddle if (failed(applyPartialConversion(module, *target, std::move(patterns)))) 45*3ba66435SRiver Riddle return signalPassFailure(); 46*3ba66435SRiver Riddle } 47*3ba66435SRiver Riddle 48*3ba66435SRiver Riddle std::unique_ptr<OperationPass<ModuleOp>> createConvertControlFlowToSPIRVPass()49*3ba66435SRiver Riddlemlir::createConvertControlFlowToSPIRVPass() { 50*3ba66435SRiver Riddle return std::make_unique<ConvertControlFlowToSPIRVPass>(); 51*3ba66435SRiver Riddle } 52