[flang-commits] [flang] 87d7b5c - [Flang][OpenMP] Skip unrelated passes in simd-only mode (#219193)
via flang-commits
flang-commits at lists.llvm.org
Wed Sep 2 07:17:29 PDT 2026
Author: Sergio Afonso
Date: 2026-09-02T15:17:24+01:00
New Revision: 87d7b5cfe7116f50aca2625aebbbd6f9da6624d0
URL: https://github.com/llvm/llvm-project/commit/87d7b5cfe7116f50aca2625aebbbd6f9da6624d0
DIFF: https://github.com/llvm/llvm-project/commit/87d7b5cfe7116f50aca2625aebbbd6f9da6624d0.diff
LOG: [Flang][OpenMP] Skip unrelated passes in simd-only mode (#219193)
The `-fopenmp-simd` option allows the compiler to lower OpenMP `simd`
constructs while ignoring all other OpenMP directives.
This patch updates the compilation pipeline to avoid triggering passes
associated to any of these other OpenMP directives when compiling in
simd-only mode.
Added:
flang/test/Driver/mlir-omp-pass-pipeline.f90
Modified:
flang/include/flang/Optimizer/Passes/Pipelines.h
flang/lib/Frontend/FrontendActions.cpp
flang/lib/Optimizer/Passes/Pipelines.cpp
flang/tools/bbc/bbc.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Optimizer/Passes/Pipelines.h b/flang/include/flang/Optimizer/Passes/Pipelines.h
index 726607613260a..744c4c584d46a 100644
--- a/flang/include/flang/Optimizer/Passes/Pipelines.h
+++ b/flang/include/flang/Optimizer/Passes/Pipelines.h
@@ -166,6 +166,9 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
const MLIRToLLVMPassPipelineConfig &config);
struct OpenMPFIRPassPipelineOpts {
+ /// Whether only OpenMP simd constructs are being honored.
+ bool isSimdOnly;
+
/// Whether code is being generated for a target device rather than the host
/// device
bool isTargetDevice;
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index 35e0e4004d9a0..80f42a27c2439 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -312,9 +312,9 @@ bool CodeGenAction::beginSourceFileAction() {
bool isOpenMPEnabled =
ci.getInvocation().getFrontendOpts().features.IsEnabled(
Fortran::common::LanguageFeature::OpenMP);
- bool isOpenMPSimd = ci.getInvocation().getLangOpts().OpenMPSimd;
fir::OpenMPFIRPassPipelineOpts opts;
+ opts.isSimdOnly = ci.getInvocation().getLangOpts().OpenMPSimd;
using DoConcurrentMappingKind =
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind;
@@ -342,7 +342,7 @@ bool CodeGenAction::beginSourceFileAction() {
// WARNING: This pipeline must be run immediately after the lowering to
// ensure that the FIR is correct with respect to OpenMP operations/
// attributes.
- if (isOpenMPEnabled || isOpenMPSimd)
+ if (isOpenMPEnabled || opts.isSimdOnly)
fir::createOpenMPFIRPassPipeline(pm, opts);
pm.enableVerifier(/*verifyPasses=*/true);
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index 1f99a48505368..e8f156e5a1df2 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -317,7 +317,8 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
addNestedPassToAllTopLevelOperations<PassConstructor>(
pm, hlfir::createInlineHLFIRCopy);
}
- } else if (config.EnableOpenMPIsTargetDevice) {
+ } else if (config.EnableOpenMPIsTargetDevice &&
+ enableOpenMP == EnableOpenMP::Full) {
// At O0, only inline scalar-to-array broadcasts when compiling for an
// OpenMP target device. This avoids emitting Fortran runtime calls
// (e.g. _FortranAAssign) that use malloc/free in device code generated
@@ -355,12 +356,17 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
addNestedPassToAllTopLevelOperations<PassConstructor>(
pm, hlfir::createInlineHLFIRAssign);
pm.addPass(hlfir::createConvertHLFIRtoFIR());
- if (enableOpenMP != EnableOpenMP::None) {
+ switch (enableOpenMP) {
+ case EnableOpenMP::Full:
pm.addPass(flangomp::createLowerWorkshare());
pm.addPass(flangomp::createLowerWorkdistribute());
- }
- if (enableOpenMP == EnableOpenMP::Simd)
+ break;
+ case EnableOpenMP::Simd:
pm.addPass(flangomp::createSimdOnlyPass());
+ break;
+ case EnableOpenMP::None:
+ break;
+ }
}
/// Create a pass pipeline for handling certain OpenMP transformations needed
@@ -377,6 +383,10 @@ void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
using DoConcurrentMappingKind =
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind;
+ // None of the passes below apply to simd constructs, so skip them.
+ if (opts.isSimdOnly)
+ return;
+
if (opts.doConcurrentMappingKind != DoConcurrentMappingKind::DCMK_None)
pm.addPass(flangomp::createDoConcurrentConversionPass(
opts.doConcurrentMappingKind == DoConcurrentMappingKind::DCMK_Device));
@@ -519,9 +529,11 @@ void createMLIRToLLVMPassPipeline(mlir::PassManager &pm,
// Run a pass to prepare for translation of delayed privatization in the
// context of deferred target tasks.
- addPassConditionally(pm, disableFirToLlvmIr, [&]() {
- return mlir::omp::createPrepareForOMPOffloadPrivatizationPass();
- });
+ if (enableOpenMP == EnableOpenMP::Full) {
+ addPassConditionally(pm, disableFirToLlvmIr, [&]() {
+ return mlir::omp::createPrepareForOMPOffloadPrivatizationPass();
+ });
+ }
}
/// Register the passes used in flang's MLIR pass pipeline so that
diff --git a/flang/test/Driver/mlir-omp-pass-pipeline.f90 b/flang/test/Driver/mlir-omp-pass-pipeline.f90
new file mode 100644
index 0000000000000..40e2c52b993a4
--- /dev/null
+++ b/flang/test/Driver/mlir-omp-pass-pipeline.f90
@@ -0,0 +1,77 @@
+! Test the MLIR pass pipeline for OpenMP
+
+! RUN: %flang_fc1 -S -mmlir --mlir-pass-statistics -mmlir --mlir-pass-statistics-display=pipeline -o /dev/null %s 2>&1 | FileCheck --check-prefix=NO_OMP %s
+! RUN: %flang_fc1 -S -fopenmp -mmlir --mlir-pass-statistics -mmlir --mlir-pass-statistics-display=pipeline -o /dev/null %s 2>&1 | FileCheck --check-prefix=FULL %s
+! RUN: %flang_fc1 -S -fopenmp -fopenmp-simd -mmlir --mlir-pass-statistics -mmlir --mlir-pass-statistics-display=pipeline -o /dev/null %s 2>&1 | FileCheck --check-prefix=FULL %s
+! RUN: %flang_fc1 -S -fopenmp-simd -mmlir --mlir-pass-statistics -mmlir --mlir-pass-statistics-display=pipeline -o /dev/null %s 2>&1 | FileCheck --check-prefix=SIMD %s
+! RUN: %flang_fc1 -S -fopenmp -fopenmp-is-target-device -mmlir --mlir-pass-statistics -mmlir --mlir-pass-statistics-display=pipeline -o /dev/null %s 2>&1 | FileCheck --check-prefix=DEVICE %s
+
+! REQUIRES: asserts
+
+end program
+
+! NO_OMP-NOT: MapsForPrivatizedSymbolsPass
+! NO_OMP-NOT: AutomapToTargetDataPass
+! NO_OMP-NOT: MapInfoFinalizationPass
+! NO_OMP-NOT: GenericLoopConversionPass
+! NO_OMP-NOT: InlineHLFIRAssign
+! NO_OMP-NOT: LowerWorkshare
+! NO_OMP-NOT: LowerWorkdistribute
+! NO_OMP-NOT: SimdOnlyPass
+! NO_OMP-NOT: LowerNontemporalPass
+! NO_OMP-NOT: MarkDeclareTargetPass
+! NO_OMP-NOT: UnimplementedDeviceCheckPass
+! NO_OMP-NOT: FunctionFilteringPass
+! NO_OMP-NOT: HostOpFilteringPass
+! NO_OMP-NOT: StackToSharedPass
+! NO_OMP-NOT: PrepareForOMPOffloadPrivatizationPass
+
+! FULL: MapsForPrivatizedSymbolsPass
+! FULL: AutomapToTargetDataPass
+! FULL: MapInfoFinalizationPass
+! FULL: GenericLoopConversionPass
+! FULL-NOT: InlineHLFIRAssign
+! FULL: LowerWorkshare
+! FULL: LowerWorkdistribute
+! FULL-NOT: SimdOnlyPass
+! FULL: LowerNontemporalPass
+! FULL: MarkDeclareTargetPass
+! FULL: UnimplementedDeviceCheckPass
+! FULL: MarkDeclareTargetPass
+! FULL: FunctionFilteringPass
+! FULL: HostOpFilteringPass
+! FULL: StackToSharedPass
+! FULL: PrepareForOMPOffloadPrivatizationPass
+
+! SIMD-NOT: MapsForPrivatizedSymbolsPass
+! SIMD-NOT: AutomapToTargetDataPass
+! SIMD-NOT: MapInfoFinalizationPass
+! SIMD-NOT: GenericLoopConversionPass
+! SIMD-NOT: InlineHLFIRAssign
+! SIMD-NOT: LowerWorkshare
+! SIMD-NOT: LowerWorkdistribute
+! SIMD: SimdOnlyPass
+! SIMD: LowerNontemporalPass
+! SIMD-NOT: MarkDeclareTargetPass
+! SIMD-NOT: UnimplementedDeviceCheckPass
+! SIMD-NOT: FunctionFilteringPass
+! SIMD-NOT: HostOpFilteringPass
+! SIMD-NOT: StackToSharedPass
+! SIMD-NOT: PrepareForOMPOffloadPrivatizationPass
+
+! DEVICE: MapsForPrivatizedSymbolsPass
+! DEVICE: AutomapToTargetDataPass
+! DEVICE: MapInfoFinalizationPass
+! DEVICE: GenericLoopConversionPass
+! DEVICE: InlineHLFIRAssign
+! DEVICE: LowerWorkshare
+! DEVICE: LowerWorkdistribute
+! DEVICE-NOT: SimdOnlyPass
+! DEVICE: LowerNontemporalPass
+! DEVICE: MarkDeclareTargetPass
+! DEVICE: UnimplementedDeviceCheckPass
+! DEVICE: MarkDeclareTargetPass
+! DEVICE: FunctionFilteringPass
+! DEVICE: HostOpFilteringPass
+! DEVICE: StackToSharedPass
+! DEVICE: PrepareForOMPOffloadPrivatizationPass
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index eddc0415b4257..50742eb106421 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -376,6 +376,7 @@ static llvm::LogicalResult runOpenMPPasses(mlir::ModuleOp mlirModule) {
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind;
fir::OpenMPFIRPassPipelineOpts opts;
+ opts.isSimdOnly = false;
opts.isTargetDevice = enableOpenMPDevice;
opts.doConcurrentMappingKind =
llvm::StringSwitch<DoConcurrentMappingKind>(
More information about the flang-commits
mailing list