[SCFToAffine] Add a pass to raise scf to affine ops. by NexMing · Pull Request #152925 · llvm/llvm-project (original) (raw)

@llvm/pr-subscribers-mlir

Author: Ming Yan (NexMing)

Changes

This patch supports the conversion from scf.for to affine.for.


Full diff: https://github.com/llvm/llvm-project/pull/152925.diff

7 Files Affected:

diff --git a/mlir/include/mlir/Conversion/Passes.h b/mlir/include/mlir/Conversion/Passes.h index 3dc48b2201cf2..2507ef2834dc5 100644 --- a/mlir/include/mlir/Conversion/Passes.h +++ b/mlir/include/mlir/Conversion/Passes.h @@ -58,6 +58,7 @@ #include "mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h" #include "mlir/Conversion/PDLToPDLInterp/PDLToPDLInterp.h" #include "mlir/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.h" +#include "mlir/Conversion/SCFToAffine/SCFToAffine.h" #include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h" #include "mlir/Conversion/SCFToEmitC/SCFToEmitC.h" #include "mlir/Conversion/SCFToGPU/SCFToGPUPass.h" diff --git a/mlir/include/mlir/Conversion/Passes.td b/mlir/include/mlir/Conversion/Passes.td index 6e1baaf23fcf7..38f35b2dadd94 100644 --- a/mlir/include/mlir/Conversion/Passes.td +++ b/mlir/include/mlir/Conversion/Passes.td @@ -1025,6 +1025,18 @@ def ReconcileUnrealizedCastsPass : Pass<"reconcile-unrealized-casts"> { }]; }

+//===----------------------------------------------------------------------===// +// SCFToAffine +//===----------------------------------------------------------------------===// + +def RaiseSCFToAffinePass : Pass<"raise-scf-to-affine"> {

+#define MLIR_CONVERSION_SCFTOAFFINE_SCFTOAFFINE_H_ + +#include + +namespace mlir { +class Pass; +class RewritePatternSet; + +#define GEN_PASS_DECL_RAISESCFTOAFFINEPASS +#include "mlir/Conversion/Passes.h.inc" + +/// Collect a set of patterns to convert SCF operations to Affine operations. +void populateSCFToAffineConversionPatterns(RewritePatternSet &patterns); + +} // namespace mlir + +#endif // MLIR_CONVERSION_SCFTOAFFINE_SCFTOAFFINE_H_ diff --git a/mlir/lib/Conversion/CMakeLists.txt b/mlir/lib/Conversion/CMakeLists.txt index 785cb8293810c..b8059fcbfb028 100644 --- a/mlir/lib/Conversion/CMakeLists.txt +++ b/mlir/lib/Conversion/CMakeLists.txt @@ -51,6 +51,7 @@ add_subdirectory(OpenACCToSCF) add_subdirectory(OpenMPToLLVM) add_subdirectory(PDLToPDLInterp) add_subdirectory(ReconcileUnrealizedCasts) +add_subdirectory(SCFToAffine) add_subdirectory(SCFToControlFlow) add_subdirectory(SCFToEmitC) add_subdirectory(SCFToGPU) diff --git a/mlir/lib/Conversion/SCFToAffine/CMakeLists.txt b/mlir/lib/Conversion/SCFToAffine/CMakeLists.txt new file mode 100644 index 0000000000000..bf1494d6f3cf0 --- /dev/null +++ b/mlir/lib/Conversion/SCFToAffine/CMakeLists.txt @@ -0,0 +1,17 @@ +add_mlir_conversion_library(MLIRSCFToAffine

+#include "mlir/Dialect/Affine/IR/AffineOps.h" +#include "mlir/Dialect/SCF/IR/SCF.h" +#include "mlir/IR/Verifier.h" +#include "mlir/Transforms/DialectConversion.h" +#include "mlir/Transforms/Passes.h" + +namespace mlir { +#define GEN_PASS_DEF_RAISESCFTOAFFINEPASS +#include "mlir/Conversion/Passes.h.inc" +} // namespace mlir + +using namespace mlir; + +namespace { + +struct SCFToAffinePass

+} diff --git a/mlir/test/Conversion/SCFToAffine/scf-to-affine.mlir b/mlir/test/Conversion/SCFToAffine/scf-to-affine.mlir new file mode 100644 index 0000000000000..6f419bc8ee9ce --- /dev/null +++ b/mlir/test/Conversion/SCFToAffine/scf-to-affine.mlir @@ -0,0 +1,34 @@ +// RUN: mlir-opt -raise-scf-to-affine -split-input-file %s | FileCheck %s + +// CHECK: #[[$ATTR_0:.+]] = affine_map<()[s0, s1, s2] -> ((s0 - s1 + s2 - 1) floordiv s0)> +// CHECK: #[[$ATTR_1:.+]] = affine_map<(d0, d1)[s0] -> (d0 + d1 * s0)> +// CHECK-LABEL: func.func @simple_loop( +// CHECK-SAME: %[[ARG0:.]]: memref<?xi32>, +// CHECK-SAME: %[[ARG1:.]]: memref<3xindex>) { +// CHECK: %[[VAL_0:.]] = arith.constant 0 : i32 +// CHECK: %[[VAL_1:.]] = arith.constant 0 : index +// CHECK: %[[VAL_2:.]] = arith.constant 1 : index +// CHECK: %[[VAL_3:.]] = arith.constant 2 : index +// CHECK: %[[VAL_4:.]] = memref.load %[[ARG1]]{{[}}%[[VAL_1]]] : memref<3xindex> +// CHECK: %[[VAL_5:.]] = memref.load %[[ARG1]]{{[}}%[[VAL_2]]] : memref<3xindex> +// CHECK: %[[VAL_6:.]] = memref.load %[[ARG1]]{{[}}%[[VAL_3]]] : memref<3xindex> +// CHECK: affine.for %[[VAL_7:.]] = 0 to #[$ATTR_0]{{[}}%[[VAL_6]], %[[VAL_4]], %[[VAL_5]]] { +// CHECK: %[[VAL_8:.*]] = affine.apply #[[$ATTR_1]](%[[VAL_4]], %[[VAL_7]]){{[}}%[[VAL_6]]] +// CHECK: memref.store %[[VAL_0]], %[[ARG0]]{{[}}%[[VAL_8]]] : memref<?xi32> +// CHECK: } +// CHECK: return +// CHECK: } + +func.func @simple_loop(%arg0: memref<?xi32>, %arg1: memref<3xindex>) {