Skip to content

Commit

Permalink
[flang][CodeGen] Run PreCGRewrite on omp reduction declare ops (#84954)
Browse files Browse the repository at this point in the history
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: #84953
Next PR: #84955
  • Loading branch information
tblah committed Mar 20, 2024
1 parent 1f1e094 commit 1f63a56
Showing 1 changed file with 5 additions and 12 deletions.
17 changes: 5 additions & 12 deletions flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp
Expand Up @@ -283,7 +283,9 @@ class DeclareOpConversion : public mlir::OpRewritePattern<fir::DeclareOp> {

class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
public:
void runOn(mlir::Operation *op, mlir::Region &region) {
void runOnOperation() override final {
mlir::ModuleOp mod = getOperation();

auto &context = getContext();
mlir::ConversionTarget target(context);
target.addLegalDialect<mlir::arith::ArithDialect, fir::FIROpsDialect,
Expand All @@ -300,24 +302,15 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
mlir::RewritePatternSet patterns(&context);
fir::populatePreCGRewritePatterns(patterns);
if (mlir::failed(
mlir::applyPartialConversion(op, target, std::move(patterns)))) {
mlir::applyPartialConversion(mod, target, std::move(patterns)))) {
mlir::emitError(mlir::UnknownLoc::get(&context),
"error in running the pre-codegen conversions");
signalPassFailure();
return;
}
// Erase any residual (fir.shape, fir.slice...).
mlir::IRRewriter rewriter(&context);
(void)mlir::runRegionDCE(rewriter, op->getRegions());
}

void runOnOperation() override final {
// Call runOn on all top level regions that may contain emboxOp/arrayCoorOp.
auto mod = getOperation();
for (auto func : mod.getOps<mlir::func::FuncOp>())
runOn(func, func.getBody());
for (auto global : mod.getOps<fir::GlobalOp>())
runOn(global, global.getRegion());
(void)mlir::runRegionDCE(rewriter, mod->getRegions());
}
};

Expand Down

0 comments on commit 1f63a56

Please sign in to comment.