diff --git a/mlir/docs/Dialects/SPIR-V.md b/mlir/docs/Dialects/SPIR-V.md --- a/mlir/docs/Dialects/SPIR-V.md +++ b/mlir/docs/Dialects/SPIR-V.md @@ -1145,7 +1145,7 @@ are at [lib/Conversion/StandardToSPIRV][MlirStdToSpirvLibs]. These dialect to dialect conversions have their dedicated libraries, -`MLIRGPUToSPIRV` and `MLIRStandardToSPIRV`, respectively. +`MLIRGPUToSPIRVTransforms` and `MLIRStandardToSPIRVTransforms`, respectively. There are also common utilities when targeting SPIR-V from any dialect: diff --git a/mlir/include/mlir/Conversion/GPUToSPIRV/GPUToSPIRV.h b/mlir/include/mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRV.h rename from mlir/include/mlir/Conversion/GPUToSPIRV/GPUToSPIRV.h rename to mlir/include/mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRV.h --- a/mlir/include/mlir/Conversion/GPUToSPIRV/GPUToSPIRV.h +++ b/mlir/include/mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRV.h @@ -1,4 +1,4 @@ -//===- GPUToSPIRV.h - GPU to SPIR-V Patterns --------------------*- C++ -*-===// +//===- ConvertGPUToSPIRV.h - GPU Ops to SPIR-V dialect patterns ----C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,12 +6,12 @@ // //===----------------------------------------------------------------------===// // -// Provides patterns to convert GPU dialect to SPIR-V dialect. +// Provides patterns for lowering GPU Ops to SPIR-V dialect. // //===----------------------------------------------------------------------===// -#ifndef MLIR_CONVERSION_GPUTOSPIRV_GPUTOSPIRV_H -#define MLIR_CONVERSION_GPUTOSPIRV_GPUTOSPIRV_H +#ifndef MLIR_CONVERSION_GPUTOSPIRV_CONVERTGPUTOSPIRV_H +#define MLIR_CONVERSION_GPUTOSPIRV_CONVERTGPUTOSPIRV_H #include "mlir/Transforms/DialectConversion.h" @@ -26,4 +26,4 @@ OwningRewritePatternList &patterns); } // namespace mlir -#endif // MLIR_CONVERSION_GPUTOSPIRV_GPUTOSPIRV_H +#endif // MLIR_CONVERSION_GPUTOSPIRV_CONVERTGPUTOSPIRV_H diff --git a/mlir/include/mlir/Conversion/GPUToSPIRV/GPUToSPIRVPass.h b/mlir/include/mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.h rename from mlir/include/mlir/Conversion/GPUToSPIRV/GPUToSPIRVPass.h rename to mlir/include/mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.h --- a/mlir/include/mlir/Conversion/GPUToSPIRV/GPUToSPIRVPass.h +++ b/mlir/include/mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.h @@ -1,4 +1,4 @@ -//===- GPUToSPIRVPass.h - GPU to SPIR-V Passes ------------------*- C++ -*-===// +//===- ConvertGPUToSPIRVPass.h - GPU to SPIR-V conversion pass --*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,24 +6,25 @@ // //===----------------------------------------------------------------------===// // -// Provides passes to convert GPU dialect to SPIR-V dialect. +// Provides a pass to convert GPU ops to SPIRV ops. // //===----------------------------------------------------------------------===// -#ifndef MLIR_CONVERSION_GPUTOSPIRV_GPUTOSPIRVPASS_H -#define MLIR_CONVERSION_GPUTOSPIRV_GPUTOSPIRVPASS_H +#ifndef MLIR_CONVERSION_GPUTOSPIRV_CONVERTGPUTOSPIRVPASS_H +#define MLIR_CONVERSION_GPUTOSPIRV_CONVERTGPUTOSPIRVPASS_H + +#include "mlir/Support/LLVM.h" #include namespace mlir { class ModuleOp; -template -class OperationPass; +template class OperationPass; -/// Creates a pass to convert GPU Ops to SPIR-V ops. For a gpu.func to be -/// converted, it should have a spv.entry_point_abi attribute. +/// Pass to convert GPU Ops to SPIR-V ops. For a gpu.func to be converted, it +/// should have a spv.entry_point_abi attribute. std::unique_ptr> createConvertGPUToSPIRVPass(); } // namespace mlir -#endif // MLIR_CONVERSION_GPUTOSPIRV_GPUTOSPIRVPASS_H +#endif // MLIR_CONVERSION_GPUTOSPIRV_CONVERTGPUTOSPIRVPASS_H diff --git a/mlir/include/mlir/Conversion/LinalgToSPIRV/LinalgToSPIRV.h b/mlir/include/mlir/Conversion/LinalgToSPIRV/LinalgToSPIRV.h --- a/mlir/include/mlir/Conversion/LinalgToSPIRV/LinalgToSPIRV.h +++ b/mlir/include/mlir/Conversion/LinalgToSPIRV/LinalgToSPIRV.h @@ -1,4 +1,4 @@ -//===- LinalgToSPIRV.h - Linalg to SPIR-V Patterns --------------*- C++ -*-===// +//===- LinalgToSPIRV.h - Linalg to SPIR-V dialect conversion ----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// Provides patterns to convert Linalg dialect to SPIR-V dialect. +// This file provides patterns for Linalg to SPIR-V dialect conversion. // //===----------------------------------------------------------------------===// diff --git a/mlir/include/mlir/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.h b/mlir/include/mlir/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.h --- a/mlir/include/mlir/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.h +++ b/mlir/include/mlir/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.h @@ -1,4 +1,4 @@ -//===- LinalgToSPIRVPass.h - Linalg to SPIR-V Passes -----------*- C++ -*-===// +//===- LinalgToSPIRVPass.h - Linalg to SPIR-V conversion pass --*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// Provides passes to convert Linalg dialect to SPIR-V dialect. +// This file provides a pass for Linalg to SPIR-V dialect conversion. // //===----------------------------------------------------------------------===// diff --git a/mlir/include/mlir/Conversion/Passes.h b/mlir/include/mlir/Conversion/Passes.h --- a/mlir/include/mlir/Conversion/Passes.h +++ b/mlir/include/mlir/Conversion/Passes.h @@ -14,7 +14,7 @@ #include "mlir/Conversion/GPUCommon/GPUCommonPass.h" #include "mlir/Conversion/GPUToNVVM/GPUToNVVMPass.h" #include "mlir/Conversion/GPUToROCDL/GPUToROCDLPass.h" -#include "mlir/Conversion/GPUToSPIRV/GPUToSPIRVPass.h" +#include "mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.h" #include "mlir/Conversion/GPUToVulkan/ConvertGPUToVulkanPass.h" #include "mlir/Conversion/LinalgToLLVM/LinalgToLLVM.h" #include "mlir/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.h" @@ -23,16 +23,15 @@ #include "mlir/Conversion/PDLToPDLInterp/PDLToPDLInterp.h" #include "mlir/Conversion/SCFToGPU/SCFToGPUPass.h" #include "mlir/Conversion/SCFToOpenMP/SCFToOpenMP.h" -#include "mlir/Conversion/SCFToSPIRV/SCFToSPIRVPass.h" #include "mlir/Conversion/SCFToStandard/SCFToStandard.h" -#include "mlir/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.h" +#include "mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.h" #include "mlir/Conversion/ShapeToStandard/ShapeToStandard.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h" -#include "mlir/Conversion/StandardToSPIRV/StandardToSPIRVPass.h" +#include "mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.h" #include "mlir/Conversion/VectorToLLVM/ConvertVectorToLLVM.h" #include "mlir/Conversion/VectorToROCDL/VectorToROCDL.h" #include "mlir/Conversion/VectorToSCF/VectorToSCF.h" -#include "mlir/Conversion/VectorToSPIRV/VectorToSPIRVPass.h" +#include "mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRVPass.h" namespace mlir { diff --git a/mlir/include/mlir/Conversion/Passes.td b/mlir/include/mlir/Conversion/Passes.td --- a/mlir/include/mlir/Conversion/Passes.td +++ b/mlir/include/mlir/Conversion/Passes.td @@ -230,23 +230,6 @@ let dependentDialects = ["omp::OpenMPDialect"]; } -//===----------------------------------------------------------------------===// -// SCFToSPIRV -//===----------------------------------------------------------------------===// - -def SCFToSPIRV : Pass<"convert-scf-to-spirv", "ModuleOp"> { - let summary = "Convert SCF dialect to SPIR-V dialect."; - let description = [{ - This pass converts SCF ops into SPIR-V structured control flow ops. - SPIR-V structured control flow ops does not support yielding values. - So for SCF ops yielding values, SPIR-V variables are created for - holding the values and load/store operations are emitted for updating - them. - }]; - let constructor = "mlir::createConvertSCFToSPIRVPass()"; - let dependentDialects = ["spirv::SPIRVDialect"]; -} - //===----------------------------------------------------------------------===// // SCFToStandard //===----------------------------------------------------------------------===// diff --git a/mlir/include/mlir/Conversion/SCFToSPIRV/SCFToSPIRV.h b/mlir/include/mlir/Conversion/SCFToSPIRV/SCFToSPIRV.h --- a/mlir/include/mlir/Conversion/SCFToSPIRV/SCFToSPIRV.h +++ b/mlir/include/mlir/Conversion/SCFToSPIRV/SCFToSPIRV.h @@ -1,4 +1,4 @@ -//===- SCFToSPIRV.h - SCF to SPIR-V Patterns --------------------*- C++ -*-===// +//===------------ SCFToSPIRV.h - Pass entrypoint ----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// Provides patterns to convert SCF dialect to SPIR-V dialect. +// Provides patterns for lowering SCF ops to SPIR-V dialect. // //===----------------------------------------------------------------------===// #ifndef MLIR_CONVERSION_SCFTOSPIRV_SCFTOSPIRV_H_ diff --git a/mlir/include/mlir/Conversion/SCFToSPIRV/SCFToSPIRVPass.h b/mlir/include/mlir/Conversion/SCFToSPIRV/SCFToSPIRVPass.h deleted file mode 100644 --- a/mlir/include/mlir/Conversion/SCFToSPIRV/SCFToSPIRVPass.h +++ /dev/null @@ -1,25 +0,0 @@ -//===- SCFToSPIRVPass.h - SCF to SPIR-V Passes ------------------*- C++ -*-===// -// -// Part of the LLVM Project, 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 -// -//===----------------------------------------------------------------------===// -// -// Provides passes to convert SCF dialect to SPIR-V dialect. -// -//===----------------------------------------------------------------------===// - -#ifndef MLIR_CONVERSION_SCFTOSPIRV_SCFTOSPIRVPASS_H -#define MLIR_CONVERSION_SCFTOSPIRV_SCFTOSPIRVPASS_H - -#include "mlir/Pass/Pass.h" - -namespace mlir { - -/// Creates a pass to convert SCF ops into SPIR-V ops. -std::unique_ptr> createConvertSCFToSPIRVPass(); - -} // namespace mlir - -#endif // MLIR_CONVERSION_SCFTOSPIRV_SCFTOSPIRVPASS_H diff --git a/mlir/include/mlir/Conversion/SPIRVToLLVM/SPIRVToLLVM.h b/mlir/include/mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.h rename from mlir/include/mlir/Conversion/SPIRVToLLVM/SPIRVToLLVM.h rename to mlir/include/mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.h --- a/mlir/include/mlir/Conversion/SPIRVToLLVM/SPIRVToLLVM.h +++ b/mlir/include/mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.h @@ -1,4 +1,4 @@ -//===- SPIRVToLLVM.h - SPIR-V to LLVM Patterns ------------------*- C++ -*-===// +//===- ConvertSPIRVToLLVM.h - Convert SPIR-V to LLVM dialect ----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -10,8 +10,8 @@ // //===----------------------------------------------------------------------===// -#ifndef MLIR_CONVERSION_SPIRVTOLLVM_SPIRVTOLLVM_H -#define MLIR_CONVERSION_SPIRVTOLLVM_SPIRVTOLLVM_H +#ifndef MLIR_CONVERSION_SPIRVTOLLVM_CONVERTSPIRVTOLLVM_H +#define MLIR_CONVERSION_SPIRVTOLLVM_CONVERTSPIRVTOLLVM_H #include "mlir/Transforms/DialectConversion.h" @@ -57,4 +57,4 @@ } // namespace mlir -#endif // MLIR_CONVERSION_SPIRVTOLLVM_SPIRVTOLLVM_H +#endif // MLIR_CONVERSION_SPIRVTOLLVM_CONVERTSPIRVTOLLVM_H diff --git a/mlir/include/mlir/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.h b/mlir/include/mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.h rename from mlir/include/mlir/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.h rename to mlir/include/mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.h --- a/mlir/include/mlir/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.h +++ b/mlir/include/mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.h @@ -1,4 +1,4 @@ -//===- SPIRVToLLVMPass.h - SPIR-V to LLVM Passes ----------------*- C++ -*-===// +//===- ConvertSPIRVToLLVMPass.h - SPIR-V dialect to LLVM pass ---*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,12 +6,12 @@ // //===----------------------------------------------------------------------===// // -// Provides passes to convert SPIR-V dialect to LLVM dialect. +// Provides a pass to lower from SPIR-V dialect to LLVM dialect. // //===----------------------------------------------------------------------===// -#ifndef MLIR_CONVERSION_SPIRVTOLLVM_SPIRVTOLLVMPASS_H -#define MLIR_CONVERSION_SPIRVTOLLVM_SPIRVTOLLVMPASS_H +#ifndef MLIR_CONVERSION_SPIRVTOLLVM_CONVERTSPIRVTOLLVMPASS_H +#define MLIR_CONVERSION_SPIRVTOLLVM_CONVERTSPIRVTOLLVMPASS_H #include @@ -35,4 +35,4 @@ } // namespace mlir -#endif // MLIR_CONVERSION_SPIRVTOLLVM_SPIRVTOLLVMPASS_H +#endif // MLIR_CONVERSION_SPIRVTOLLVM_CONVERTSPIRVTOLLVMPASS_H_ diff --git a/mlir/include/mlir/Conversion/StandardToSPIRV/StandardToSPIRV.h b/mlir/include/mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.h rename from mlir/include/mlir/Conversion/StandardToSPIRV/StandardToSPIRV.h rename to mlir/include/mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.h --- a/mlir/include/mlir/Conversion/StandardToSPIRV/StandardToSPIRV.h +++ b/mlir/include/mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.h @@ -1,4 +1,4 @@ -//===- StandardToSPIRV.h - Standard to SPIR-V Patterns --------*- C++ -*-===// +//===- ConvertStandardToSPIRV.h - Convert to SPIR-V dialect -----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,21 +6,21 @@ // //===----------------------------------------------------------------------===// // -// Provides patterns to convert Standard dialect to SPIR-V dialect. +// Provides patterns to lower StandardOps to SPIR-V dialect. // //===----------------------------------------------------------------------===// -#ifndef MLIR_CONVERSION_STANDARDTOSPIRV_STANDARDTOSPIRV_H -#define MLIR_CONVERSION_STANDARDTOSPIRV_STANDARDTOSPIRV_H +#ifndef MLIR_CONVERSION_STANDARDTOSPIRV_CONVERTSTANDARDTOSPIRV_H +#define MLIR_CONVERSION_STANDARDTOSPIRV_CONVERTSTANDARDTOSPIRV_H #include "mlir/Transforms/DialectConversion.h" namespace mlir { class SPIRVTypeConverter; -/// Appends to a pattern list additional patterns for translating standard ops -/// to SPIR-V ops. Also adds the patterns to legalize ops not directly -/// translated to SPIR-V dialect. +/// Appends to a pattern list additional patterns for translating StandardOps to +/// SPIR-V ops. Also adds the patterns legalize ops not directly translated to +/// SPIR-V dialect. void populateStandardToSPIRVPatterns(MLIRContext *context, SPIRVTypeConverter &typeConverter, OwningRewritePatternList &patterns); @@ -32,4 +32,4 @@ } // namespace mlir -#endif // MLIR_CONVERSION_STANDARDTOSPIRV_STANDARDTOSPIRV_H +#endif // MLIR_CONVERSION_STANDARDTOSPIRV_CONVERTSTANDARDTOSPIRV_H diff --git a/mlir/include/mlir/Conversion/StandardToSPIRV/StandardToSPIRVPass.h b/mlir/include/mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.h rename from mlir/include/mlir/Conversion/StandardToSPIRV/StandardToSPIRVPass.h rename to mlir/include/mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.h --- a/mlir/include/mlir/Conversion/StandardToSPIRV/StandardToSPIRVPass.h +++ b/mlir/include/mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.h @@ -1,4 +1,4 @@ -//===- StandardToSPIRVPass.h - Standard to SPIR-V Passes --------*- C++ -*-===// +//===- ConvertStandardToSPIRVPass.h - StdOps to SPIR-V pass -----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,23 +6,23 @@ // //===----------------------------------------------------------------------===// // -// Provides passes to convert Standard dialect to SPIR-V dialect. +// Provides a pass to lower from StandardOps to SPIR-V dialect. // //===----------------------------------------------------------------------===// -#ifndef MLIR_CONVERSION_STANDARDTOSPIRV_STANDARDTOSPIRVPASS_H -#define MLIR_CONVERSION_STANDARDTOSPIRV_STANDARDTOSPIRVPASS_H +#ifndef MLIR_CONVERSION_STANDARDTOSPIRV_CONVERTSTANDARDTOSPIRVPASS_H +#define MLIR_CONVERSION_STANDARDTOSPIRV_CONVERTSTANDARDTOSPIRVPASS_H #include "mlir/Pass/Pass.h" namespace mlir { -/// Creates a pass to convert standard ops to SPIR-V ops. +/// Pass to convert StandardOps to SPIR-V ops. std::unique_ptr> createConvertStandardToSPIRVPass(); -/// Creates a pass to legalize ops that are not directly lowered to SPIR-V. +/// Pass to legalize ops that are not directly lowered to SPIR-V. std::unique_ptr createLegalizeStdOpsForSPIRVLoweringPass(); } // namespace mlir -#endif // MLIR_CONVERSION_STANDARDTOSPIRV_STANDARDTOSPIRVPASS_H +#endif // MLIR_CONVERSION_STANDARDTOSPIRV_CONVERTSTANDARDTOSPIRVPASS_H diff --git a/mlir/include/mlir/Conversion/VectorToSPIRV/VectorToSPIRV.h b/mlir/include/mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRV.h rename from mlir/include/mlir/Conversion/VectorToSPIRV/VectorToSPIRV.h rename to mlir/include/mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRV.h --- a/mlir/include/mlir/Conversion/VectorToSPIRV/VectorToSPIRV.h +++ b/mlir/include/mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRV.h @@ -1,4 +1,4 @@ -//=- VectorToSPIRV.h - Vector to SPIR-V Patterns ------------------*- C++ -*-=// +//=- ConvertVectorToSPIRV.h - Vector Ops to SPIR-V dialect patterns - C++ -*-=// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,12 +6,12 @@ // //===----------------------------------------------------------------------===// // -// Provides patterns to convert Vector dialect to SPIR-V dialect. +// Provides patterns for lowering Vector Ops to SPIR-V dialect. // //===----------------------------------------------------------------------===// -#ifndef MLIR_INCLUDE_MLIR_CONVERSION_VECTORTOSPIRV_VECTORTOSPIRV_H -#define MLIR_INCLUDE_MLIR_CONVERSION_VECTORTOSPIRV_VECTORTOSPIRV_H +#ifndef MLIR_INCLUDE_MLIR_CONVERSION_VECTORTOSPIRV_CONVERTVECTORTOSPIRV_H_ +#define MLIR_INCLUDE_MLIR_CONVERSION_VECTORTOSPIRV_CONVERTVECTORTOSPIRV_H_ #include "mlir/Transforms/DialectConversion.h" @@ -26,4 +26,4 @@ } // namespace mlir -#endif // MLIR_INCLUDE_MLIR_CONVERSION_VECTORTOSPIRV_VECTORTOSPIRV_H +#endif // MLIR_INCLUDE_MLIR_CONVERSION_VECTORTOSPIRV_CONVERTVECTORTOSPIRV_H_ diff --git a/mlir/include/mlir/Conversion/VectorToSPIRV/VectorToSPIRVPass.h b/mlir/include/mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRVPass.h rename from mlir/include/mlir/Conversion/VectorToSPIRV/VectorToSPIRVPass.h rename to mlir/include/mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRVPass.h --- a/mlir/include/mlir/Conversion/VectorToSPIRV/VectorToSPIRVPass.h +++ b/mlir/include/mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRVPass.h @@ -1,4 +1,4 @@ -//=- VectorToSPIRVPass.h - Vector to SPIR-V Passes ----------------*- C++ -*-=// +//=- ConvertVectorToSPIRVPass.h - Pass converting Vector to SPIRV -*- C++ -*-=// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,20 +6,20 @@ // //===----------------------------------------------------------------------===// // -// Provides passes to convert Vector dialect to SPIR-V dialect. +// Provides a pass to convert Vector ops to SPIR-V ops. // //===----------------------------------------------------------------------===// -#ifndef MLIR_CONVERSION_VECTORTOSPIRV_GPUTOSPIRVPASS_H -#define MLIR_CONVERSION_VECTORTOSPIRV_GPUTOSPIRVPASS_H +#ifndef MLIR_CONVERSION_VECTORTOSPIRV_CONVERTGPUTOSPIRVPASS_H +#define MLIR_CONVERSION_VECTORTOSPIRV_CONVERTGPUTOSPIRVPASS_H #include "mlir/Pass/Pass.h" namespace mlir { -/// Creates a pass to convert Vector Ops to SPIR-V ops. +/// Pass to convert Vector Ops to SPIR-V ops. std::unique_ptr> createConvertVectorToSPIRVPass(); } // namespace mlir -#endif // MLIR_CONVERSION_VECTORTOSPIRV_GPUTOSPIRVPASS_H +#endif // MLIR_CONVERSION_VECTORTOSPIRV_CONVERTGPUTOSPIRVPASS_H diff --git a/mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt --- a/mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt +++ b/mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt @@ -2,9 +2,9 @@ mlir_tablegen(GPUToSPIRV.cpp.inc -gen-rewriters) add_public_tablegen_target(MLIRGPUToSPIRVIncGen) -add_mlir_conversion_library(MLIRGPUToSPIRV - GPUToSPIRV.cpp - GPUToSPIRVPass.cpp +add_mlir_conversion_library(MLIRGPUToSPIRVTransforms + ConvertGPUToSPIRV.cpp + ConvertGPUToSPIRVPass.cpp DEPENDS MLIRConversionPassIncGen @@ -18,7 +18,7 @@ MLIRSPIRV MLIRSPIRVConversion MLIRStandard - MLIRStandardToSPIRV + MLIRStandardToSPIRVTransforms MLIRSupport MLIRTransforms ) diff --git a/mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp b/mlir/lib/Conversion/GPUToSPIRV/ConvertGPUToSPIRV.cpp rename from mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp rename to mlir/lib/Conversion/GPUToSPIRV/ConvertGPUToSPIRV.cpp --- a/mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp +++ b/mlir/lib/Conversion/GPUToSPIRV/ConvertGPUToSPIRV.cpp @@ -1,4 +1,4 @@ -//===- GPUToSPIRV.cpp - GPU to SPIR-V Patterns ----------------------------===// +//===- ConvertGPUToSPIRV.cpp - Convert GPU ops to SPIR-V dialect ----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,11 +6,10 @@ // //===----------------------------------------------------------------------===// // -// This file implements patterns to convert GPU dialect to SPIR-V dialect. +// This file implements the conversion patterns from GPU ops to SPIR-V dialect. // //===----------------------------------------------------------------------===// - -#include "mlir/Conversion/GPUToSPIRV/GPUToSPIRV.h" +#include "mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRV.h" #include "mlir/Dialect/GPU/GPUDialect.h" #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" #include "mlir/Dialect/SPIRV/IR/SPIRVOps.h" diff --git a/mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRVPass.cpp b/mlir/lib/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.cpp rename from mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRVPass.cpp rename to mlir/lib/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.cpp --- a/mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRVPass.cpp +++ b/mlir/lib/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.cpp @@ -1,4 +1,4 @@ -//===- GPUToSPIRVPass.cpp - GPU to SPIR-V Passes --------------------------===// +//===- ConvertGPUToSPIRVPass.cpp - GPU to SPIR-V dialect lowering passes --===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -7,16 +7,17 @@ //===----------------------------------------------------------------------===// // // This file implements a pass to convert a kernel function in the GPU Dialect -// into a spv.module operation. +// into a spv.module operation // //===----------------------------------------------------------------------===// -#include "mlir/Conversion/GPUToSPIRV/GPUToSPIRVPass.h" - +#include "mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.h" #include "../PassDetail.h" -#include "mlir/Conversion/GPUToSPIRV/GPUToSPIRV.h" -#include "mlir/Conversion/StandardToSPIRV/StandardToSPIRV.h" +#include "mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRV.h" +#include "mlir/Conversion/SCFToSPIRV/SCFToSPIRV.h" +#include "mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.h" #include "mlir/Dialect/GPU/GPUDialect.h" +#include "mlir/Dialect/SCF/SCF.h" #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" #include "mlir/Dialect/SPIRV/IR/SPIRVOps.h" #include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h" @@ -57,8 +58,10 @@ spirv::SPIRVConversionTarget::get(targetAttr); SPIRVTypeConverter typeConverter(targetAttr); + ScfToSPIRVContext scfContext; OwningRewritePatternList patterns; populateGPUToSPIRVPatterns(context, typeConverter, patterns); + populateSCFToSPIRVPatterns(context, typeConverter, scfContext, patterns); populateStandardToSPIRVPatterns(context, typeConverter, patterns); if (failed(applyFullConversion(kernelModules, *target, std::move(patterns)))) diff --git a/mlir/lib/Conversion/LinalgToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/LinalgToSPIRV/CMakeLists.txt --- a/mlir/lib/Conversion/LinalgToSPIRV/CMakeLists.txt +++ b/mlir/lib/Conversion/LinalgToSPIRV/CMakeLists.txt @@ -1,4 +1,4 @@ -add_mlir_conversion_library(MLIRLinalgToSPIRV +add_mlir_conversion_library(MLIRLinalgToSPIRVTransforms LinalgToSPIRV.cpp LinalgToSPIRVPass.cpp diff --git a/mlir/lib/Conversion/LinalgToSPIRV/LinalgToSPIRV.cpp b/mlir/lib/Conversion/LinalgToSPIRV/LinalgToSPIRV.cpp --- a/mlir/lib/Conversion/LinalgToSPIRV/LinalgToSPIRV.cpp +++ b/mlir/lib/Conversion/LinalgToSPIRV/LinalgToSPIRV.cpp @@ -1,4 +1,4 @@ -//===- LinalgToSPIRV.cpp - Linalg to SPIR-V Patterns ----------------------===// +//===- LinalgToSPIRV.cpp - Linalg to SPIR-V dialect conversion ------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/mlir/lib/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.cpp b/mlir/lib/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.cpp --- a/mlir/lib/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.cpp +++ b/mlir/lib/Conversion/LinalgToSPIRV/LinalgToSPIRVPass.cpp @@ -1,4 +1,4 @@ -//===- LinalgToSPIRVPass.cpp - Linalg to SPIR-V Passes --------------------===// +//===- LinalgToSPIRVPass.cpp - Linalg to SPIR-V conversion pass -----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt --- a/mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt +++ b/mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt @@ -1,6 +1,5 @@ add_mlir_conversion_library(MLIRSCFToSPIRV SCFToSPIRV.cpp - SCFToSPIRVPass.cpp ADDITIONAL_HEADER_DIRS ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SCFToSPIRV @@ -9,10 +8,12 @@ MLIRConversionPassIncGen LINK_LIBS PUBLIC + MLIRAffine + MLIRAffineToStandard MLIRSPIRV MLIRSPIRVConversion - MLIRStandardToSPIRV MLIRIR + MLIRLinalg MLIRPass MLIRStandard MLIRSupport diff --git a/mlir/lib/Conversion/SCFToSPIRV/SCFToSPIRV.cpp b/mlir/lib/Conversion/SCFToSPIRV/SCFToSPIRV.cpp --- a/mlir/lib/Conversion/SCFToSPIRV/SCFToSPIRV.cpp +++ b/mlir/lib/Conversion/SCFToSPIRV/SCFToSPIRV.cpp @@ -1,4 +1,4 @@ -//===- SCFToSPIRV.cpp - SCF to SPIR-V Patterns ----------------------------===// +//===- SCFToSPIRV.cpp - Convert SCF ops to SPIR-V dialect -----------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,10 +6,9 @@ // //===----------------------------------------------------------------------===// // -// This file implements patterns to convert SCF dialect to SPIR-V dialect. +// This file implements the conversion patterns from SCF ops to SPIR-V dialect. // //===----------------------------------------------------------------------===// - #include "mlir/Conversion/SCFToSPIRV/SCFToSPIRV.h" #include "mlir/Dialect/SCF/SCF.h" #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" diff --git a/mlir/lib/Conversion/SCFToSPIRV/SCFToSPIRVPass.cpp b/mlir/lib/Conversion/SCFToSPIRV/SCFToSPIRVPass.cpp deleted file mode 100644 --- a/mlir/lib/Conversion/SCFToSPIRV/SCFToSPIRVPass.cpp +++ /dev/null @@ -1,51 +0,0 @@ -//===- SCFToSPIRVPass.cpp - SCF to SPIR-V Passes --------------------------===// -// -// Part of the LLVM Project, 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 -// -//===----------------------------------------------------------------------===// -// -// This file implements a pass to convert SCF dialect into SPIR-V dialect. -// -//===----------------------------------------------------------------------===// - -#include "mlir/Conversion/SCFToSPIRV/SCFToSPIRVPass.h" - -#include "../PassDetail.h" -#include "mlir/Conversion/SCFToSPIRV/SCFToSPIRV.h" -#include "mlir/Conversion/StandardToSPIRV/StandardToSPIRV.h" -#include "mlir/Dialect/SCF/SCF.h" -#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" -#include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h" - -using namespace mlir; - -namespace { -struct SCFToSPIRVPass : public SCFToSPIRVBase { - void runOnOperation() override; -}; -} // namespace - -void SCFToSPIRVPass::runOnOperation() { - MLIRContext *context = &getContext(); - ModuleOp module = getOperation(); - - auto targetAttr = spirv::lookupTargetEnvOrDefault(module); - std::unique_ptr target = - spirv::SPIRVConversionTarget::get(targetAttr); - - SPIRVTypeConverter typeConverter(targetAttr); - ScfToSPIRVContext scfContext; - OwningRewritePatternList patterns; - populateSCFToSPIRVPatterns(context, typeConverter, scfContext, patterns); - populateStandardToSPIRVPatterns(context, typeConverter, patterns); - populateBuiltinFuncToSPIRVPatterns(context, typeConverter, patterns); - - if (failed(applyPartialConversion(module, *target, std::move(patterns)))) - return signalPassFailure(); -} - -std::unique_ptr> mlir::createConvertSCFToSPIRVPass() { - return std::make_unique(); -} diff --git a/mlir/lib/Conversion/SPIRVToLLVM/CMakeLists.txt b/mlir/lib/Conversion/SPIRVToLLVM/CMakeLists.txt --- a/mlir/lib/Conversion/SPIRVToLLVM/CMakeLists.txt +++ b/mlir/lib/Conversion/SPIRVToLLVM/CMakeLists.txt @@ -1,7 +1,7 @@ add_mlir_conversion_library(MLIRSPIRVToLLVM ConvertLaunchFuncToLLVMCalls.cpp - SPIRVToLLVM.cpp - SPIRVToLLVMPass.cpp + ConvertSPIRVToLLVM.cpp + ConvertSPIRVToLLVMPass.cpp ADDITIONAL_HEADER_DIRS ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SPIRVToLLVM diff --git a/mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp b/mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp --- a/mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp +++ b/mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp @@ -12,8 +12,8 @@ //===----------------------------------------------------------------------===// #include "../PassDetail.h" -#include "mlir/Conversion/SPIRVToLLVM/SPIRVToLLVM.h" -#include "mlir/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.h" +#include "mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.h" +#include "mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h" #include "mlir/Dialect/GPU/GPUDialect.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp b/mlir/lib/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.cpp rename from mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp rename to mlir/lib/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.cpp --- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp +++ b/mlir/lib/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.cpp @@ -1,4 +1,4 @@ -//===- SPIRVToLLVM.cpp - SPIR-V to LLVM Patterns --------------------------===// +//===- ConvertSPIRVToLLVM.cpp - SPIR-V dialect to LLVM dialect conversion -===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -10,7 +10,7 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Conversion/SPIRVToLLVM/SPIRVToLLVM.h" +#include "mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" @@ -894,7 +894,7 @@ if (!op.memory_access().hasValue()) { replaceWithLoadOrStore(op, rewriter, this->typeConverter, /*alignment=*/0, - /*isVolatile=*/false, /*isNonTemporal=*/false); + /*isVolatile=*/false, /*isNonTemporal=*/ false); return success(); } auto memoryAccess = op.memory_access().getValue(); diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.cpp b/mlir/lib/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.cpp rename from mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.cpp rename to mlir/lib/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.cpp --- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.cpp +++ b/mlir/lib/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.cpp @@ -1,4 +1,4 @@ -//===- SPIRVToLLVMPass.cpp - SPIR-V to LLVM Passes ------------------------===// +//===- ConvertSPIRVToLLVMPass.cpp - Convert SPIR-V ops to LLVM ops --------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -10,9 +10,9 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.h" +#include "mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.h" #include "../PassDetail.h" -#include "mlir/Conversion/SPIRVToLLVM/SPIRVToLLVM.h" +#include "mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVM.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" diff --git a/mlir/lib/Conversion/StandardToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/StandardToSPIRV/CMakeLists.txt --- a/mlir/lib/Conversion/StandardToSPIRV/CMakeLists.txt +++ b/mlir/lib/Conversion/StandardToSPIRV/CMakeLists.txt @@ -1,7 +1,7 @@ -add_mlir_conversion_library(MLIRStandardToSPIRV +add_mlir_conversion_library(MLIRStandardToSPIRVTransforms + ConvertStandardToSPIRV.cpp + ConvertStandardToSPIRVPass.cpp LegalizeStandardForSPIRV.cpp - StandardToSPIRV.cpp - StandardToSPIRVPass.cpp ADDITIONAL_HEADER_DIRS ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV diff --git a/mlir/lib/Conversion/StandardToSPIRV/StandardToSPIRV.cpp b/mlir/lib/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.cpp rename from mlir/lib/Conversion/StandardToSPIRV/StandardToSPIRV.cpp rename to mlir/lib/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.cpp --- a/mlir/lib/Conversion/StandardToSPIRV/StandardToSPIRV.cpp +++ b/mlir/lib/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.cpp @@ -1,4 +1,4 @@ -//===- StandardToSPIRV.cpp - Standard to SPIR-V Patterns ------------------===// +//===- ConvertStandardToSPIRV.cpp - Standard to SPIR-V dialect conversion--===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// This file implements patterns to convert standard dialect to SPIR-V dialect. +// This file implements patterns to convert standard ops to SPIR-V ops. // //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Conversion/StandardToSPIRV/StandardToSPIRVPass.cpp b/mlir/lib/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.cpp rename from mlir/lib/Conversion/StandardToSPIRV/StandardToSPIRVPass.cpp rename to mlir/lib/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.cpp --- a/mlir/lib/Conversion/StandardToSPIRV/StandardToSPIRVPass.cpp +++ b/mlir/lib/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.cpp @@ -1,4 +1,4 @@ -//===- StandardToSPIRVPass.cpp - Standard to SPIR-V Passes ----------------===// +//===- ConvertStandardToSPIRVPass.cpp - Convert Std Ops to SPIR-V Ops -----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,13 +6,14 @@ // //===----------------------------------------------------------------------===// // -// This file implements a pass to convert standard dialect to SPIR-V dialect. +// This file implements a pass to convert MLIR standard ops into the SPIR-V +// ops. // //===----------------------------------------------------------------------===// -#include "mlir/Conversion/StandardToSPIRV/StandardToSPIRVPass.h" +#include "mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.h" #include "../PassDetail.h" -#include "mlir/Conversion/StandardToSPIRV/StandardToSPIRV.h" +#include "mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.h" #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" #include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h" diff --git a/mlir/lib/Conversion/StandardToSPIRV/LegalizeStandardForSPIRV.cpp b/mlir/lib/Conversion/StandardToSPIRV/LegalizeStandardForSPIRV.cpp --- a/mlir/lib/Conversion/StandardToSPIRV/LegalizeStandardForSPIRV.cpp +++ b/mlir/lib/Conversion/StandardToSPIRV/LegalizeStandardForSPIRV.cpp @@ -12,8 +12,8 @@ //===----------------------------------------------------------------------===// #include "../PassDetail.h" -#include "mlir/Conversion/StandardToSPIRV/StandardToSPIRV.h" -#include "mlir/Conversion/StandardToSPIRV/StandardToSPIRVPass.h" +#include "mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRV.h" +#include "mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.h" #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" #include "mlir/Dialect/StandardOps/IR/Ops.h" #include "mlir/Dialect/Vector/VectorOps.h" diff --git a/mlir/lib/Conversion/VectorToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/VectorToSPIRV/CMakeLists.txt --- a/mlir/lib/Conversion/VectorToSPIRV/CMakeLists.txt +++ b/mlir/lib/Conversion/VectorToSPIRV/CMakeLists.txt @@ -1,6 +1,5 @@ add_mlir_conversion_library(MLIRVectorToSPIRV VectorToSPIRV.cpp - VectorToSPIRVPass.cpp ADDITIONAL_HEADER_DIRS ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/VectorToSPIRV diff --git a/mlir/lib/Conversion/VectorToSPIRV/VectorToSPIRV.cpp b/mlir/lib/Conversion/VectorToSPIRV/VectorToSPIRV.cpp --- a/mlir/lib/Conversion/VectorToSPIRV/VectorToSPIRV.cpp +++ b/mlir/lib/Conversion/VectorToSPIRV/VectorToSPIRV.cpp @@ -1,4 +1,4 @@ -//===- VectorToSPIRV.cpp - Vector to SPIR-V Patterns ----------------------===// +//===------- VectorToSPIRV.cpp - Vector to SPIRV lowering passes ----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,18 +6,20 @@ // //===----------------------------------------------------------------------===// // -// This file implements patterns to convert Vector dialect to SPIRV dialect. +// This file implements a pass to generate SPIRV operations for Vector +// operations. // //===----------------------------------------------------------------------===// -#include "mlir/Conversion/VectorToSPIRV/VectorToSPIRV.h" - #include "../PassDetail.h" +#include "mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRV.h" +#include "mlir/Conversion/VectorToSPIRV/ConvertVectorToSPIRVPass.h" #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" #include "mlir/Dialect/SPIRV/IR/SPIRVOps.h" #include "mlir/Dialect/SPIRV/IR/SPIRVTypes.h" #include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h" #include "mlir/Dialect/Vector/VectorOps.h" +#include "mlir/Pass/Pass.h" #include "mlir/Transforms/DialectConversion.h" using namespace mlir; @@ -66,7 +68,7 @@ matchAndRewrite(vector::InsertOp insertOp, ArrayRef operands, ConversionPatternRewriter &rewriter) const override { if (insertOp.getSourceType().isa() || - !spirv::CompositeType::isValid(insertOp.getDestVectorType())) + !spirv::CompositeType::isValid(insertOp.getDestVectorType())) return failure(); vector::InsertOp::Adaptor adaptor(operands); int32_t id = insertOp.position().begin()->cast().getInt(); @@ -122,3 +124,34 @@ VectorInsertOpConvert, VectorExtractElementOpConvert, VectorInsertElementOpConvert>(context, typeConverter); } + +namespace { +struct LowerVectorToSPIRVPass + : public ConvertVectorToSPIRVBase { + void runOnOperation() override; +}; +} // namespace + +void LowerVectorToSPIRVPass::runOnOperation() { + MLIRContext *context = &getContext(); + ModuleOp module = getOperation(); + + auto targetAttr = spirv::lookupTargetEnvOrDefault(module); + std::unique_ptr target = + spirv::SPIRVConversionTarget::get(targetAttr); + + SPIRVTypeConverter typeConverter(targetAttr); + OwningRewritePatternList patterns; + populateVectorToSPIRVPatterns(context, typeConverter, patterns); + + target->addLegalOp(); + target->addLegalOp(); + + if (failed(applyFullConversion(module, *target, std::move(patterns)))) + return signalPassFailure(); +} + +std::unique_ptr> +mlir::createConvertVectorToSPIRVPass() { + return std::make_unique(); +} diff --git a/mlir/lib/Conversion/VectorToSPIRV/VectorToSPIRVPass.cpp b/mlir/lib/Conversion/VectorToSPIRV/VectorToSPIRVPass.cpp deleted file mode 100644 --- a/mlir/lib/Conversion/VectorToSPIRV/VectorToSPIRVPass.cpp +++ /dev/null @@ -1,53 +0,0 @@ -//===- VectorToSPIRVPass.cpp - Vector to SPIR-V Passes --------------------===// -// -// Part of the LLVM Project, 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 -// -//===----------------------------------------------------------------------===// -// -// This file implements a pass to convert Vector dialect to SPIRV dialect. -// -//===----------------------------------------------------------------------===// - -#include "mlir/Conversion/VectorToSPIRV/VectorToSPIRVPass.h" - -#include "../PassDetail.h" -#include "mlir/Conversion/VectorToSPIRV/VectorToSPIRV.h" -#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" -#include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h" -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/DialectConversion.h" - -using namespace mlir; - -namespace { -struct LowerVectorToSPIRVPass - : public ConvertVectorToSPIRVBase { - void runOnOperation() override; -}; -} // namespace - -void LowerVectorToSPIRVPass::runOnOperation() { - MLIRContext *context = &getContext(); - ModuleOp module = getOperation(); - - auto targetAttr = spirv::lookupTargetEnvOrDefault(module); - std::unique_ptr target = - spirv::SPIRVConversionTarget::get(targetAttr); - - SPIRVTypeConverter typeConverter(targetAttr); - OwningRewritePatternList patterns; - populateVectorToSPIRVPatterns(context, typeConverter, patterns); - - target->addLegalOp(); - target->addLegalOp(); - - if (failed(applyFullConversion(module, *target, std::move(patterns)))) - return signalPassFailure(); -} - -std::unique_ptr> -mlir::createConvertVectorToSPIRVPass() { - return std::make_unique(); -} diff --git a/mlir/test/Conversion/GPUToSPIRV/if.mlir b/mlir/test/Conversion/GPUToSPIRV/if.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Conversion/GPUToSPIRV/if.mlir @@ -0,0 +1,167 @@ +// RUN: mlir-opt -convert-gpu-to-spirv %s -o - | FileCheck %s + +module attributes { + gpu.container_module, + spv.target_env = #spv.target_env< + #spv.vce, {}> +} { + func @main(%arg0 : memref<10xf32>, %arg1 : i1) { + %c0 = constant 1 : index + gpu.launch_func @kernels::@kernel_simple_selection + blocks in (%c0, %c0, %c0) threads in (%c0, %c0, %c0) + args(%arg0 : memref<10xf32>, %arg1 : i1) + return + } + + gpu.module @kernels { + // CHECK-LABEL: @kernel_simple_selection + gpu.func @kernel_simple_selection(%arg2 : memref<10xf32>, %arg3 : i1) kernel + attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} { + %value = constant 0.0 : f32 + %i = constant 0 : index + + // CHECK: spv.selection { + // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE:\^.*]], [[MERGE:\^.*]] + // CHECK-NEXT: [[TRUE]]: + // CHECK: spv.Branch [[MERGE]] + // CHECK-NEXT: [[MERGE]]: + // CHECK-NEXT: spv.mlir.merge + // CHECK-NEXT: } + // CHECK-NEXT: spv.Return + + scf.if %arg3 { + store %value, %arg2[%i] : memref<10xf32> + } + gpu.return + } + + // CHECK-LABEL: @kernel_nested_selection + gpu.func @kernel_nested_selection(%arg3 : memref<10xf32>, %arg4 : memref<10xf32>, %arg5 : i1, %arg6 : i1) kernel + attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} { + %i = constant 0 : index + %j = constant 9 : index + + // CHECK: spv.selection { + // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE_TOP:\^.*]], [[FALSE_TOP:\^.*]] + // CHECK-NEXT: [[TRUE_TOP]]: + // CHECK-NEXT: spv.selection { + // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE_NESTED_TRUE_PATH:\^.*]], [[FALSE_NESTED_TRUE_PATH:\^.*]] + // CHECK-NEXT: [[TRUE_NESTED_TRUE_PATH]]: + // CHECK: spv.Branch [[MERGE_NESTED_TRUE_PATH:\^.*]] + // CHECK-NEXT: [[FALSE_NESTED_TRUE_PATH]]: + // CHECK: spv.Branch [[MERGE_NESTED_TRUE_PATH]] + // CHECK-NEXT: [[MERGE_NESTED_TRUE_PATH]]: + // CHECK-NEXT: spv.mlir.merge + // CHECK-NEXT: } + // CHECK-NEXT: spv.Branch [[MERGE_TOP:\^.*]] + // CHECK-NEXT: [[FALSE_TOP]]: + // CHECK-NEXT: spv.selection { + // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE_NESTED_FALSE_PATH:\^.*]], [[FALSE_NESTED_FALSE_PATH:\^.*]] + // CHECK-NEXT: [[TRUE_NESTED_FALSE_PATH]]: + // CHECK: spv.Branch [[MERGE_NESTED_FALSE_PATH:\^.*]] + // CHECK-NEXT: [[FALSE_NESTED_FALSE_PATH]]: + // CHECK: spv.Branch [[MERGE_NESTED_FALSE_PATH]] + // CHECK: [[MERGE_NESTED_FALSE_PATH]]: + // CHECK-NEXT: spv.mlir.merge + // CHECK-NEXT: } + // CHECK-NEXT: spv.Branch [[MERGE_TOP]] + // CHECK-NEXT: [[MERGE_TOP]]: + // CHECK-NEXT: spv.mlir.merge + // CHECK-NEXT: } + // CHECK-NEXT: spv.Return + + scf.if %arg5 { + scf.if %arg6 { + %value = load %arg3[%i] : memref<10xf32> + store %value, %arg4[%i] : memref<10xf32> + } else { + %value = load %arg4[%i] : memref<10xf32> + store %value, %arg3[%i] : memref<10xf32> + } + } else { + scf.if %arg6 { + %value = load %arg3[%j] : memref<10xf32> + store %value, %arg4[%j] : memref<10xf32> + } else { + %value = load %arg4[%j] : memref<10xf32> + store %value, %arg3[%j] : memref<10xf32> + } + } + gpu.return + } + // CHECK-LABEL: @simple_if_yield + gpu.func @simple_if_yield(%arg2 : memref<10xf32>, %arg3 : i1) kernel + attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} { + // CHECK: %[[VAR1:.*]] = spv.Variable : !spv.ptr + // CHECK: %[[VAR2:.*]] = spv.Variable : !spv.ptr + // CHECK: spv.selection { + // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE:\^.*]], [[FALSE:\^.*]] + // CHECK-NEXT: [[TRUE]]: + // CHECK: %[[RET1TRUE:.*]] = spv.constant 0.000000e+00 : f32 + // CHECK: %[[RET2TRUE:.*]] = spv.constant 1.000000e+00 : f32 + // CHECK-DAG: spv.Store "Function" %[[VAR1]], %[[RET1TRUE]] : f32 + // CHECK-DAG: spv.Store "Function" %[[VAR2]], %[[RET2TRUE]] : f32 + // CHECK: spv.Branch ^[[MERGE:.*]] + // CHECK-NEXT: [[FALSE]]: + // CHECK: %[[RET2FALSE:.*]] = spv.constant 2.000000e+00 : f32 + // CHECK: %[[RET1FALSE:.*]] = spv.constant 3.000000e+00 : f32 + // CHECK-DAG: spv.Store "Function" %[[VAR1]], %[[RET1FALSE]] : f32 + // CHECK-DAG: spv.Store "Function" %[[VAR2]], %[[RET2FALSE]] : f32 + // CHECK: spv.Branch ^[[MERGE]] + // CHECK-NEXT: ^[[MERGE]]: + // CHECK: spv.mlir.merge + // CHECK-NEXT: } + // CHECK-DAG: %[[OUT1:.*]] = spv.Load "Function" %[[VAR1]] : f32 + // CHECK-DAG: %[[OUT2:.*]] = spv.Load "Function" %[[VAR2]] : f32 + // CHECK: spv.Store "StorageBuffer" {{%.*}}, %[[OUT1]] : f32 + // CHECK: spv.Store "StorageBuffer" {{%.*}}, %[[OUT2]] : f32 + // CHECK: spv.Return + %0:2 = scf.if %arg3 -> (f32, f32) { + %c0 = constant 0.0 : f32 + %c1 = constant 1.0 : f32 + scf.yield %c0, %c1 : f32, f32 + } else { + %c0 = constant 2.0 : f32 + %c1 = constant 3.0 : f32 + scf.yield %c1, %c0 : f32, f32 + } + %i = constant 0 : index + %j = constant 1 : index + store %0#0, %arg2[%i] : memref<10xf32> + store %0#1, %arg2[%j] : memref<10xf32> + gpu.return + } + // TODO: The transformation should only be legal if + // VariablePointer capability is supported. This test is still useful to + // make sure we can handle scf op result with type change. + // CHECK-LABEL: @simple_if_yield_type_change + // CHECK: %[[VAR:.*]] = spv.Variable : !spv.ptr [0])>, StorageBuffer>, Function> + // CHECK: spv.selection { + // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE:\^.*]], [[FALSE:\^.*]] + // CHECK-NEXT: [[TRUE]]: + // CHECK: spv.Store "Function" %[[VAR]], {{%.*}} : !spv.ptr [0])>, StorageBuffer> + // CHECK: spv.Branch ^[[MERGE:.*]] + // CHECK-NEXT: [[FALSE]]: + // CHECK: spv.Store "Function" %[[VAR]], {{%.*}} : !spv.ptr [0])>, StorageBuffer> + // CHECK: spv.Branch ^[[MERGE]] + // CHECK-NEXT: ^[[MERGE]]: + // CHECK: spv.mlir.merge + // CHECK-NEXT: } + // CHECK: %[[OUT:.*]] = spv.Load "Function" %[[VAR]] : !spv.ptr [0])>, StorageBuffer> + // CHECK: %[[ADD:.*]] = spv.AccessChain %[[OUT]][{{%.*}}, {{%.*}}] : !spv.ptr [0])>, StorageBuffer> + // CHECK: spv.Store "StorageBuffer" %[[ADD]], {{%.*}} : f32 + // CHECK: spv.Return + gpu.func @simple_if_yield_type_change(%arg2 : memref<10xf32>, %arg3 : memref<10xf32>, %arg4 : i1) kernel + attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} { + %i = constant 0 : index + %value = constant 0.0 : f32 + %0 = scf.if %arg4 -> (memref<10xf32>) { + scf.yield %arg2 : memref<10xf32> + } else { + scf.yield %arg3 : memref<10xf32> + } + store %value, %0[%i] : memref<10xf32> + gpu.return + } + } +} diff --git a/mlir/test/Conversion/GPUToSPIRV/loop.mlir b/mlir/test/Conversion/GPUToSPIRV/loop.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Conversion/GPUToSPIRV/loop.mlir @@ -0,0 +1,98 @@ +// RUN: mlir-opt -convert-gpu-to-spirv %s -o - | FileCheck %s + +module attributes { + gpu.container_module, + spv.target_env = #spv.target_env< + #spv.vce, {}> +} { + func @loop(%arg0 : memref<10xf32>, %arg1 : memref<10xf32>) { + %c0 = constant 1 : index + gpu.launch_func @kernels::@loop_kernel + blocks in (%c0, %c0, %c0) threads in (%c0, %c0, %c0) + args(%arg0 : memref<10xf32>, %arg1 : memref<10xf32>) + return + } + + gpu.module @kernels { + gpu.func @loop_kernel(%arg2 : memref<10xf32>, %arg3 : memref<10xf32>) kernel + attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} { + // CHECK: %[[LB:.*]] = spv.constant 4 : i32 + %lb = constant 4 : index + // CHECK: %[[UB:.*]] = spv.constant 42 : i32 + %ub = constant 42 : index + // CHECK: %[[STEP:.*]] = spv.constant 2 : i32 + %step = constant 2 : index + // CHECK: spv.loop { + // CHECK-NEXT: spv.Branch ^[[HEADER:.*]](%[[LB]] : i32) + // CHECK: ^[[HEADER]](%[[INDVAR:.*]]: i32): + // CHECK: %[[CMP:.*]] = spv.SLessThan %[[INDVAR]], %[[UB]] : i32 + // CHECK: spv.BranchConditional %[[CMP]], ^[[BODY:.*]], ^[[MERGE:.*]] + // CHECK: ^[[BODY]]: + // CHECK: %[[ZERO1:.*]] = spv.constant 0 : i32 + // CHECK: %[[OFFSET1:.*]] = spv.constant 0 : i32 + // CHECK: %[[STRIDE1:.*]] = spv.constant 1 : i32 + // CHECK: %[[UPDATE1:.*]] = spv.IMul %[[STRIDE1]], %[[INDVAR]] : i32 + // CHECK: %[[INDEX1:.*]] = spv.IAdd %[[OFFSET1]], %[[UPDATE1]] : i32 + // CHECK: spv.AccessChain {{%.*}}{{\[}}%[[ZERO1]], %[[INDEX1]]{{\]}} + // CHECK: %[[ZERO2:.*]] = spv.constant 0 : i32 + // CHECK: %[[OFFSET2:.*]] = spv.constant 0 : i32 + // CHECK: %[[STRIDE2:.*]] = spv.constant 1 : i32 + // CHECK: %[[UPDATE2:.*]] = spv.IMul %[[STRIDE2]], %[[INDVAR]] : i32 + // CHECK: %[[INDEX2:.*]] = spv.IAdd %[[OFFSET2]], %[[UPDATE2]] : i32 + // CHECK: spv.AccessChain {{%.*}}[%[[ZERO2]], %[[INDEX2]]] + // CHECK: %[[INCREMENT:.*]] = spv.IAdd %[[INDVAR]], %[[STEP]] : i32 + // CHECK: spv.Branch ^[[HEADER]](%[[INCREMENT]] : i32) + // CHECK: ^[[MERGE]] + // CHECK: spv.mlir.merge + // CHECK: } + scf.for %arg4 = %lb to %ub step %step { + %1 = load %arg2[%arg4] : memref<10xf32> + store %1, %arg3[%arg4] : memref<10xf32> + } + gpu.return + } + + + // CHECK-LABEL: @loop_yield + gpu.func @loop_yield(%arg2 : memref<10xf32>, %arg3 : memref<10xf32>) kernel + attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} { + // CHECK: %[[LB:.*]] = spv.constant 4 : i32 + %lb = constant 4 : index + // CHECK: %[[UB:.*]] = spv.constant 42 : i32 + %ub = constant 42 : index + // CHECK: %[[STEP:.*]] = spv.constant 2 : i32 + %step = constant 2 : index + // CHECK: %[[INITVAR1:.*]] = spv.constant 0.000000e+00 : f32 + %s0 = constant 0.0 : f32 + // CHECK: %[[INITVAR2:.*]] = spv.constant 1.000000e+00 : f32 + %s1 = constant 1.0 : f32 + // CHECK: %[[VAR1:.*]] = spv.Variable : !spv.ptr + // CHECK: %[[VAR2:.*]] = spv.Variable : !spv.ptr + // CHECK: spv.loop { + // CHECK: spv.Branch ^[[HEADER:.*]](%[[LB]], %[[INITVAR1]], %[[INITVAR2]] : i32, f32, f32) + // CHECK: ^[[HEADER]](%[[INDVAR:.*]]: i32, %[[CARRIED1:.*]]: f32, %[[CARRIED2:.*]]: f32): + // CHECK: %[[CMP:.*]] = spv.SLessThan %[[INDVAR]], %[[UB]] : i32 + // CHECK: spv.BranchConditional %[[CMP]], ^[[BODY:.*]], ^[[MERGE:.*]] + // CHECK: ^[[BODY]]: + // CHECK: %[[UPDATED:.*]] = spv.FAdd %[[CARRIED1]], %[[CARRIED1]] : f32 + // CHECK-DAG: %[[INCREMENT:.*]] = spv.IAdd %[[INDVAR]], %[[STEP]] : i32 + // CHECK-DAG: spv.Store "Function" %[[VAR1]], %[[UPDATED]] : f32 + // CHECK-DAG: spv.Store "Function" %[[VAR2]], %[[UPDATED]] : f32 + // CHECK: spv.Branch ^[[HEADER]](%[[INCREMENT]], %[[UPDATED]], %[[UPDATED]] : i32, f32, f32) + // CHECK: ^[[MERGE]]: + // CHECK: spv.mlir.merge + // CHECK: } + %result:2 = scf.for %i0 = %lb to %ub step %step iter_args(%si = %s0, %sj = %s1) -> (f32, f32) { + %sn = addf %si, %si : f32 + scf.yield %sn, %sn : f32, f32 + } + // CHECK-DAG: %[[OUT1:.*]] = spv.Load "Function" %[[VAR1]] : f32 + // CHECK-DAG: %[[OUT2:.*]] = spv.Load "Function" %[[VAR2]] : f32 + // CHECK: spv.Store "StorageBuffer" {{%.*}}, %[[OUT1]] : f32 + // CHECK: spv.Store "StorageBuffer" {{%.*}}, %[[OUT2]] : f32 + store %result#0, %arg3[%lb] : memref<10xf32> + store %result#1, %arg3[%ub] : memref<10xf32> + gpu.return + } + } +} diff --git a/mlir/test/Conversion/GPUToSPIRV/entry-point.mlir b/mlir/test/Conversion/GPUToSPIRV/test_spirv_entry_point.mlir rename from mlir/test/Conversion/GPUToSPIRV/entry-point.mlir rename to mlir/test/Conversion/GPUToSPIRV/test_spirv_entry_point.mlir diff --git a/mlir/test/Conversion/SCFToSPIRV/for.mlir b/mlir/test/Conversion/SCFToSPIRV/for.mlir deleted file mode 100644 --- a/mlir/test/Conversion/SCFToSPIRV/for.mlir +++ /dev/null @@ -1,86 +0,0 @@ -// RUN: mlir-opt -convert-scf-to-spirv %s -o - | FileCheck %s - -module attributes { - spv.target_env = #spv.target_env< - #spv.vce, {}> -} { - -func @loop_kernel(%arg2 : memref<10xf32>, %arg3 : memref<10xf32>) { - // CHECK: %[[LB:.*]] = spv.constant 4 : i32 - %lb = constant 4 : index - // CHECK: %[[UB:.*]] = spv.constant 42 : i32 - %ub = constant 42 : index - // CHECK: %[[STEP:.*]] = spv.constant 2 : i32 - %step = constant 2 : index - // CHECK: spv.loop { - // CHECK-NEXT: spv.Branch ^[[HEADER:.*]](%[[LB]] : i32) - // CHECK: ^[[HEADER]](%[[INDVAR:.*]]: i32): - // CHECK: %[[CMP:.*]] = spv.SLessThan %[[INDVAR]], %[[UB]] : i32 - // CHECK: spv.BranchConditional %[[CMP]], ^[[BODY:.*]], ^[[MERGE:.*]] - // CHECK: ^[[BODY]]: - // CHECK: %[[ZERO1:.*]] = spv.constant 0 : i32 - // CHECK: %[[OFFSET1:.*]] = spv.constant 0 : i32 - // CHECK: %[[STRIDE1:.*]] = spv.constant 1 : i32 - // CHECK: %[[UPDATE1:.*]] = spv.IMul %[[STRIDE1]], %[[INDVAR]] : i32 - // CHECK: %[[INDEX1:.*]] = spv.IAdd %[[OFFSET1]], %[[UPDATE1]] : i32 - // CHECK: spv.AccessChain {{%.*}}{{\[}}%[[ZERO1]], %[[INDEX1]]{{\]}} - // CHECK: %[[ZERO2:.*]] = spv.constant 0 : i32 - // CHECK: %[[OFFSET2:.*]] = spv.constant 0 : i32 - // CHECK: %[[STRIDE2:.*]] = spv.constant 1 : i32 - // CHECK: %[[UPDATE2:.*]] = spv.IMul %[[STRIDE2]], %[[INDVAR]] : i32 - // CHECK: %[[INDEX2:.*]] = spv.IAdd %[[OFFSET2]], %[[UPDATE2]] : i32 - // CHECK: spv.AccessChain {{%.*}}[%[[ZERO2]], %[[INDEX2]]] - // CHECK: %[[INCREMENT:.*]] = spv.IAdd %[[INDVAR]], %[[STEP]] : i32 - // CHECK: spv.Branch ^[[HEADER]](%[[INCREMENT]] : i32) - // CHECK: ^[[MERGE]] - // CHECK: spv.mlir.merge - // CHECK: } - scf.for %arg4 = %lb to %ub step %step { - %1 = load %arg2[%arg4] : memref<10xf32> - store %1, %arg3[%arg4] : memref<10xf32> - } - return -} - -// CHECK-LABEL: @loop_yield -func @loop_yield(%arg2 : memref<10xf32>, %arg3 : memref<10xf32>) { - // CHECK: %[[LB:.*]] = spv.constant 4 : i32 - %lb = constant 4 : index - // CHECK: %[[UB:.*]] = spv.constant 42 : i32 - %ub = constant 42 : index - // CHECK: %[[STEP:.*]] = spv.constant 2 : i32 - %step = constant 2 : index - // CHECK: %[[INITVAR1:.*]] = spv.constant 0.000000e+00 : f32 - %s0 = constant 0.0 : f32 - // CHECK: %[[INITVAR2:.*]] = spv.constant 1.000000e+00 : f32 - %s1 = constant 1.0 : f32 - // CHECK: %[[VAR1:.*]] = spv.Variable : !spv.ptr - // CHECK: %[[VAR2:.*]] = spv.Variable : !spv.ptr - // CHECK: spv.loop { - // CHECK: spv.Branch ^[[HEADER:.*]](%[[LB]], %[[INITVAR1]], %[[INITVAR2]] : i32, f32, f32) - // CHECK: ^[[HEADER]](%[[INDVAR:.*]]: i32, %[[CARRIED1:.*]]: f32, %[[CARRIED2:.*]]: f32): - // CHECK: %[[CMP:.*]] = spv.SLessThan %[[INDVAR]], %[[UB]] : i32 - // CHECK: spv.BranchConditional %[[CMP]], ^[[BODY:.*]], ^[[MERGE:.*]] - // CHECK: ^[[BODY]]: - // CHECK: %[[UPDATED:.*]] = spv.FAdd %[[CARRIED1]], %[[CARRIED1]] : f32 - // CHECK-DAG: %[[INCREMENT:.*]] = spv.IAdd %[[INDVAR]], %[[STEP]] : i32 - // CHECK-DAG: spv.Store "Function" %[[VAR1]], %[[UPDATED]] : f32 - // CHECK-DAG: spv.Store "Function" %[[VAR2]], %[[UPDATED]] : f32 - // CHECK: spv.Branch ^[[HEADER]](%[[INCREMENT]], %[[UPDATED]], %[[UPDATED]] : i32, f32, f32) - // CHECK: ^[[MERGE]]: - // CHECK: spv.mlir.merge - // CHECK: } - %result:2 = scf.for %i0 = %lb to %ub step %step iter_args(%si = %s0, %sj = %s1) -> (f32, f32) { - %sn = addf %si, %si : f32 - scf.yield %sn, %sn : f32, f32 - } - // CHECK-DAG: %[[OUT1:.*]] = spv.Load "Function" %[[VAR1]] : f32 - // CHECK-DAG: %[[OUT2:.*]] = spv.Load "Function" %[[VAR2]] : f32 - // CHECK: spv.Store "StorageBuffer" {{%.*}}, %[[OUT1]] : f32 - // CHECK: spv.Store "StorageBuffer" {{%.*}}, %[[OUT2]] : f32 - store %result#0, %arg3[%lb] : memref<10xf32> - store %result#1, %arg3[%ub] : memref<10xf32> - return -} - -} // end module diff --git a/mlir/test/Conversion/SCFToSPIRV/if.mlir b/mlir/test/Conversion/SCFToSPIRV/if.mlir deleted file mode 100644 --- a/mlir/test/Conversion/SCFToSPIRV/if.mlir +++ /dev/null @@ -1,156 +0,0 @@ -// RUN: mlir-opt -convert-scf-to-spirv %s -o - | FileCheck %s - -module attributes { - spv.target_env = #spv.target_env< - #spv.vce, {}> -} { - -// CHECK-LABEL: @kernel_simple_selection -func @kernel_simple_selection(%arg2 : memref<10xf32>, %arg3 : i1) { - %value = constant 0.0 : f32 - %i = constant 0 : index - - // CHECK: spv.selection { - // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE:\^.*]], [[MERGE:\^.*]] - // CHECK-NEXT: [[TRUE]]: - // CHECK: spv.Branch [[MERGE]] - // CHECK-NEXT: [[MERGE]]: - // CHECK-NEXT: spv.mlir.merge - // CHECK-NEXT: } - // CHECK-NEXT: spv.Return - - scf.if %arg3 { - store %value, %arg2[%i] : memref<10xf32> - } - return -} - -// CHECK-LABEL: @kernel_nested_selection -func @kernel_nested_selection(%arg3 : memref<10xf32>, %arg4 : memref<10xf32>, %arg5 : i1, %arg6 : i1) { - %i = constant 0 : index - %j = constant 9 : index - - // CHECK: spv.selection { - // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE_TOP:\^.*]], [[FALSE_TOP:\^.*]] - // CHECK-NEXT: [[TRUE_TOP]]: - // CHECK-NEXT: spv.selection { - // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE_NESTED_TRUE_PATH:\^.*]], [[FALSE_NESTED_TRUE_PATH:\^.*]] - // CHECK-NEXT: [[TRUE_NESTED_TRUE_PATH]]: - // CHECK: spv.Branch [[MERGE_NESTED_TRUE_PATH:\^.*]] - // CHECK-NEXT: [[FALSE_NESTED_TRUE_PATH]]: - // CHECK: spv.Branch [[MERGE_NESTED_TRUE_PATH]] - // CHECK-NEXT: [[MERGE_NESTED_TRUE_PATH]]: - // CHECK-NEXT: spv.mlir.merge - // CHECK-NEXT: } - // CHECK-NEXT: spv.Branch [[MERGE_TOP:\^.*]] - // CHECK-NEXT: [[FALSE_TOP]]: - // CHECK-NEXT: spv.selection { - // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE_NESTED_FALSE_PATH:\^.*]], [[FALSE_NESTED_FALSE_PATH:\^.*]] - // CHECK-NEXT: [[TRUE_NESTED_FALSE_PATH]]: - // CHECK: spv.Branch [[MERGE_NESTED_FALSE_PATH:\^.*]] - // CHECK-NEXT: [[FALSE_NESTED_FALSE_PATH]]: - // CHECK: spv.Branch [[MERGE_NESTED_FALSE_PATH]] - // CHECK: [[MERGE_NESTED_FALSE_PATH]]: - // CHECK-NEXT: spv.mlir.merge - // CHECK-NEXT: } - // CHECK-NEXT: spv.Branch [[MERGE_TOP]] - // CHECK-NEXT: [[MERGE_TOP]]: - // CHECK-NEXT: spv.mlir.merge - // CHECK-NEXT: } - // CHECK-NEXT: spv.Return - - scf.if %arg5 { - scf.if %arg6 { - %value = load %arg3[%i] : memref<10xf32> - store %value, %arg4[%i] : memref<10xf32> - } else { - %value = load %arg4[%i] : memref<10xf32> - store %value, %arg3[%i] : memref<10xf32> - } - } else { - scf.if %arg6 { - %value = load %arg3[%j] : memref<10xf32> - store %value, %arg4[%j] : memref<10xf32> - } else { - %value = load %arg4[%j] : memref<10xf32> - store %value, %arg3[%j] : memref<10xf32> - } - } - return -} - -// CHECK-LABEL: @simple_if_yield -func @simple_if_yield(%arg2 : memref<10xf32>, %arg3 : i1) { - // CHECK: %[[VAR1:.*]] = spv.Variable : !spv.ptr - // CHECK: %[[VAR2:.*]] = spv.Variable : !spv.ptr - // CHECK: spv.selection { - // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE:\^.*]], [[FALSE:\^.*]] - // CHECK-NEXT: [[TRUE]]: - // CHECK: %[[RET1TRUE:.*]] = spv.constant 0.000000e+00 : f32 - // CHECK: %[[RET2TRUE:.*]] = spv.constant 1.000000e+00 : f32 - // CHECK-DAG: spv.Store "Function" %[[VAR1]], %[[RET1TRUE]] : f32 - // CHECK-DAG: spv.Store "Function" %[[VAR2]], %[[RET2TRUE]] : f32 - // CHECK: spv.Branch ^[[MERGE:.*]] - // CHECK-NEXT: [[FALSE]]: - // CHECK: %[[RET2FALSE:.*]] = spv.constant 2.000000e+00 : f32 - // CHECK: %[[RET1FALSE:.*]] = spv.constant 3.000000e+00 : f32 - // CHECK-DAG: spv.Store "Function" %[[VAR1]], %[[RET1FALSE]] : f32 - // CHECK-DAG: spv.Store "Function" %[[VAR2]], %[[RET2FALSE]] : f32 - // CHECK: spv.Branch ^[[MERGE]] - // CHECK-NEXT: ^[[MERGE]]: - // CHECK: spv.mlir.merge - // CHECK-NEXT: } - // CHECK-DAG: %[[OUT1:.*]] = spv.Load "Function" %[[VAR1]] : f32 - // CHECK-DAG: %[[OUT2:.*]] = spv.Load "Function" %[[VAR2]] : f32 - // CHECK: spv.Store "StorageBuffer" {{%.*}}, %[[OUT1]] : f32 - // CHECK: spv.Store "StorageBuffer" {{%.*}}, %[[OUT2]] : f32 - // CHECK: spv.Return - %0:2 = scf.if %arg3 -> (f32, f32) { - %c0 = constant 0.0 : f32 - %c1 = constant 1.0 : f32 - scf.yield %c0, %c1 : f32, f32 - } else { - %c0 = constant 2.0 : f32 - %c1 = constant 3.0 : f32 - scf.yield %c1, %c0 : f32, f32 - } - %i = constant 0 : index - %j = constant 1 : index - store %0#0, %arg2[%i] : memref<10xf32> - store %0#1, %arg2[%j] : memref<10xf32> - return -} - -// TODO: The transformation should only be legal if VariablePointer capability -// is supported. This test is still useful to make sure we can handle scf op -// result with type change. -func @simple_if_yield_type_change(%arg2 : memref<10xf32>, %arg3 : memref<10xf32>, %arg4 : i1) { - // CHECK-LABEL: @simple_if_yield_type_change - // CHECK: %[[VAR:.*]] = spv.Variable : !spv.ptr [0])>, StorageBuffer>, Function> - // CHECK: spv.selection { - // CHECK-NEXT: spv.BranchConditional {{%.*}}, [[TRUE:\^.*]], [[FALSE:\^.*]] - // CHECK-NEXT: [[TRUE]]: - // CHECK: spv.Store "Function" %[[VAR]], {{%.*}} : !spv.ptr [0])>, StorageBuffer> - // CHECK: spv.Branch ^[[MERGE:.*]] - // CHECK-NEXT: [[FALSE]]: - // CHECK: spv.Store "Function" %[[VAR]], {{%.*}} : !spv.ptr [0])>, StorageBuffer> - // CHECK: spv.Branch ^[[MERGE]] - // CHECK-NEXT: ^[[MERGE]]: - // CHECK: spv.mlir.merge - // CHECK-NEXT: } - // CHECK: %[[OUT:.*]] = spv.Load "Function" %[[VAR]] : !spv.ptr [0])>, StorageBuffer> - // CHECK: %[[ADD:.*]] = spv.AccessChain %[[OUT]][{{%.*}}, {{%.*}}] : !spv.ptr [0])>, StorageBuffer> - // CHECK: spv.Store "StorageBuffer" %[[ADD]], {{%.*}} : f32 - // CHECK: spv.Return - %i = constant 0 : index - %value = constant 0.0 : f32 - %0 = scf.if %arg4 -> (memref<10xf32>) { - scf.yield %arg2 : memref<10xf32> - } else { - scf.yield %arg3 : memref<10xf32> - } - store %value, %0[%i] : memref<10xf32> - return -} - -} // end module diff --git a/mlir/tools/mlir-spirv-cpu-runner/mlir-spirv-cpu-runner.cpp b/mlir/tools/mlir-spirv-cpu-runner/mlir-spirv-cpu-runner.cpp --- a/mlir/tools/mlir-spirv-cpu-runner/mlir-spirv-cpu-runner.cpp +++ b/mlir/tools/mlir-spirv-cpu-runner/mlir-spirv-cpu-runner.cpp @@ -12,8 +12,8 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Conversion/GPUToSPIRV/GPUToSPIRVPass.h" -#include "mlir/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.h" +#include "mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.h" +#include "mlir/Conversion/SPIRVToLLVM/ConvertSPIRVToLLVMPass.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h" #include "mlir/Dialect/GPU/Passes.h" #include "mlir/Dialect/SPIRV/IR/SPIRVOps.h" diff --git a/mlir/tools/mlir-vulkan-runner/mlir-vulkan-runner.cpp b/mlir/tools/mlir-vulkan-runner/mlir-vulkan-runner.cpp --- a/mlir/tools/mlir-vulkan-runner/mlir-vulkan-runner.cpp +++ b/mlir/tools/mlir-vulkan-runner/mlir-vulkan-runner.cpp @@ -12,10 +12,10 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Conversion/GPUToSPIRV/GPUToSPIRVPass.h" +#include "mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.h" #include "mlir/Conversion/GPUToVulkan/ConvertGPUToVulkanPass.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h" -#include "mlir/Conversion/StandardToSPIRV/StandardToSPIRVPass.h" +#include "mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.h" #include "mlir/Dialect/GPU/Passes.h" #include "mlir/Dialect/SPIRV/IR/SPIRVOps.h" #include "mlir/Dialect/SPIRV/Transforms/Passes.h"