Skip to content

Commit df513f8

Browse files
authored
[flang] Adapt PolymorphicOpConversion to run on all top level ops (#90597)
We might use polymorphic ops in top-level operations other than functions some time in the future. We need to ensure that these operations can be lowered. See RFC: https://discourse.llvm.org/t/rfc-add-an-interface-for-top-level-container-operations Some of the changes are from moving declaration and definition of the constructor function into tablegen (as requested in code review when altering another pass).
1 parent 5ada328 commit df513f8

File tree

8 files changed

+28
-9
lines changed

8 files changed

+28
-9
lines changed

flang/include/flang/Optimizer/Transforms/Passes.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ std::unique_ptr<mlir::Pass> createAnnotateConstantOperandsPass();
6767
std::unique_ptr<mlir::Pass> createAlgebraicSimplificationPass();
6868
std::unique_ptr<mlir::Pass>
6969
createAlgebraicSimplificationPass(const mlir::GreedyRewriteConfig &config);
70-
std::unique_ptr<mlir::Pass> createPolymorphicOpConversionPass();
7170

7271
std::unique_ptr<mlir::Pass> createOMPDescriptorMapInfoGenPass();
7372
std::unique_ptr<mlir::Pass> createOMPFunctionFilteringPass();

flang/include/flang/Optimizer/Transforms/Passes.td

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,14 +298,13 @@ def AlgebraicSimplification : Pass<"flang-algebraic-simplification"> {
298298
let constructor = "::fir::createAlgebraicSimplificationPass()";
299299
}
300300

301-
def PolymorphicOpConversion : Pass<"fir-polymorphic-op", "::mlir::func::FuncOp"> {
301+
def PolymorphicOpConversion : Pass<"fir-polymorphic-op"> {
302302
let summary =
303303
"Simplify operations on polymorphic types";
304304
let description = [{
305305
This pass breaks up the lowering of operations on polymorphic types by
306306
introducing an intermediate FIR level that simplifies code geneation.
307307
}];
308-
let constructor = "::fir::createPolymorphicOpConversionPass()";
309308
let dependentDialects = [
310309
"fir::FIROpsDialect", "mlir::func::FuncDialect"
311310
];

flang/include/flang/Tools/CLOptions.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ inline void createDefaultFIROptimizerPassPipeline(
271271
pm.addPass(mlir::createCSEPass());
272272

273273
// Polymorphic types
274-
pm.addPass(fir::createPolymorphicOpConversionPass());
274+
addNestedPassToAllTopLevelOperations(pm, fir::createPolymorphicOpConversion);
275275

276276
if (pc.AliasAnalysis && !disableFirAliasTags && !useOldAliasTags)
277277
pm.addPass(fir::createAliasTagsPass());

flang/lib/Optimizer/Transforms/PolymorphicOpConversion.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,9 @@ class PolymorphicOpConversion
229229

230230
void runOnOperation() override {
231231
auto *context = &getContext();
232-
auto mod = getOperation()->getParentOfType<ModuleOp>();
232+
auto mod = mlir::dyn_cast_or_null<mlir::ModuleOp>(getOperation());
233+
if (!mod)
234+
mod = getOperation()->getParentOfType<ModuleOp>();
233235
mlir::RewritePatternSet patterns(context);
234236

235237
BindingTables bindingTables;
@@ -471,7 +473,3 @@ SelectTypeConv::collectAncestors(fir::TypeInfoOp dt, mlir::ModuleOp mod) const {
471473
}
472474
return ancestors;
473475
}
474-
475-
std::unique_ptr<mlir::Pass> fir::createPolymorphicOpConversionPass() {
476-
return std::make_unique<PolymorphicOpConversion>();
477-
}

flang/test/Driver/bbc-mlir-pass-pipeline.f90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,16 @@
4747

4848
! CHECK-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
4949
! CHECK-NEXT: 'fir.global' Pipeline
50+
! CHECK-NEXT: PolymorphicOpConversion
5051
! CHECK-NEXT: CFGConversion
5152
! CHECK-NEXT: 'func.func' Pipeline
5253
! CHECK-NEXT: PolymorphicOpConversion
5354
! CHECK-NEXT: CFGConversion
5455
! CHECK-NEXT: 'omp.declare_reduction' Pipeline
56+
! CHECK-NEXT: PolymorphicOpConversion
5557
! CHECK-NEXT: CFGConversion
5658
! CHECK-NEXT: 'omp.private' Pipeline
59+
! CHECK-NEXT: PolymorphicOpConversion
5760
! CHECK-NEXT: CFGConversion
5861

5962
! CHECK-NEXT: SCFToControlFlow

flang/test/Driver/mlir-debug-pass-pipeline.f90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,16 @@
6767

6868
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
6969
! ALL-NEXT: 'fir.global' Pipeline
70+
! ALL-NEXT: PolymorphicOpConversion
7071
! ALL-NEXT: CFGConversion
7172
! ALL-NEXT: 'func.func' Pipeline
7273
! ALL-NEXT: PolymorphicOpConversion
7374
! ALL-NEXT: CFGConversion
7475
! ALL-NEXT: 'omp.declare_reduction' Pipeline
76+
! ALL-NEXT: PolymorphicOpConversion
7577
! ALL-NEXT: CFGConversion
7678
! ALL-NEXT: 'omp.private' Pipeline
79+
! ALL-NEXT: PolymorphicOpConversion
7780
! ALL-NEXT: CFGConversion
7881
! ALL-NEXT: SCFToControlFlow
7982
! ALL-NEXT: Canonicalizer

flang/test/Driver/mlir-pass-pipeline.f90

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,28 @@
5656
! ALL-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
5757
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
5858

59+
! O2-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
60+
! O2-NEXT: 'fir.global' Pipeline
61+
! O2-NEXT: PolymorphicOpConversion
5962
! O2-NEXT: 'func.func' Pipeline
6063
! O2-NEXT: PolymorphicOpConversion
64+
! O2-NEXT: 'omp.declare_reduction' Pipeline
65+
! O2-NEXT: PolymorphicOpConversion
66+
! O2-NEXT: 'omp.private' Pipeline
67+
! O2-NEXT: PolymorphicOpConversion
6168
! O2-NEXT: AddAliasTags
6269
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
6370
! ALL-NEXT: 'fir.global' Pipeline
71+
! NOTO2-NEXT: PolymorphicOpConversion
6472
! ALL-NEXT: CFGConversion
6573
! ALL-NEXT: 'func.func' Pipeline
6674
! NOTO2-NEXT: PolymorphicOpConversion
6775
! ALL-NEXT: CFGConversion
6876
! ALL-NEXT: 'omp.declare_reduction' Pipeline
77+
! NOTO2-NEXT: PolymorphicOpConversion
6978
! ALL-NEXT: CFGConversion
7079
! ALL-NEXT: 'omp.private' Pipeline
80+
! NOTO2-NEXT: PolymorphicOpConversion
7181
! ALL-NEXT: CFGConversion
7282

7383
! ALL-NEXT: SCFToControlFlow

flang/test/Fir/basic-program.fir

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,15 @@ func.func @_QQmain() {
6262
// PASSES-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
6363
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
6464

65+
// PASSES-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
66+
// PASSES-NEXT: 'fir.global' Pipeline
67+
// PASSES-NEXT: PolymorphicOpConversion
6568
// PASSES-NEXT: 'func.func' Pipeline
6669
// PASSES-NEXT: PolymorphicOpConversion
70+
// PASSES-NEXT: 'omp.declare_reduction' Pipeline
71+
// PASSES-NEXT: PolymorphicOpConversion
72+
// PASSES-NEXT: 'omp.private' Pipeline
73+
// PASSES-NEXT: PolymorphicOpConversion
6774

6875
// PASSES-NEXT: AddAliasTags
6976

0 commit comments

Comments
 (0)