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 Riddle void 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 Riddle mlir::createConvertControlFlowToSPIRVPass() {
50*3ba66435SRiver Riddle   return std::make_unique<ConvertControlFlowToSPIRVPass>();
51*3ba66435SRiver Riddle }
52