Skip to content

Commit 29da273

Browse files
tblahchencha3
authored andcommitted
[flang][CodeGen] Run PreCGRewrite on omp reduction declare ops (llvm#84954)
OpenMP reduction declare operations can contain FIR code which needs to be lowered to LLVM. With array reductions, these regions can contain more complicated operations which need PreCGRewriting. A similar extra case was already needed for fir::GlobalOp. OpenMP array reductions 3/6 Previous PR: llvm#84953 Next PR: llvm#84955
1 parent 1712cd1 commit 29da273

File tree

1 file changed

+5
-12
lines changed

1 file changed

+5
-12
lines changed

flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,9 @@ class DeclareOpConversion : public mlir::OpRewritePattern<fir::DeclareOp> {
283283

284284
class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
285285
public:
286-
void runOn(mlir::Operation *op, mlir::Region &region) {
286+
void runOnOperation() override final {
287+
mlir::ModuleOp mod = getOperation();
288+
287289
auto &context = getContext();
288290
mlir::ConversionTarget target(context);
289291
target.addLegalDialect<mlir::arith::ArithDialect, fir::FIROpsDialect,
@@ -300,24 +302,15 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
300302
mlir::RewritePatternSet patterns(&context);
301303
fir::populatePreCGRewritePatterns(patterns);
302304
if (mlir::failed(
303-
mlir::applyPartialConversion(op, target, std::move(patterns)))) {
305+
mlir::applyPartialConversion(mod, target, std::move(patterns)))) {
304306
mlir::emitError(mlir::UnknownLoc::get(&context),
305307
"error in running the pre-codegen conversions");
306308
signalPassFailure();
307309
return;
308310
}
309311
// Erase any residual (fir.shape, fir.slice...).
310312
mlir::IRRewriter rewriter(&context);
311-
(void)mlir::runRegionDCE(rewriter, op->getRegions());
312-
}
313-
314-
void runOnOperation() override final {
315-
// Call runOn on all top level regions that may contain emboxOp/arrayCoorOp.
316-
auto mod = getOperation();
317-
for (auto func : mod.getOps<mlir::func::FuncOp>())
318-
runOn(func, func.getBody());
319-
for (auto global : mod.getOps<fir::GlobalOp>())
320-
runOn(global, global.getRegion());
313+
(void)mlir::runRegionDCE(rewriter, mod->getRegions());
321314
}
322315
};
323316

0 commit comments

Comments
 (0)