From 439a17a87b58d8ff0999f15763c975733a9c4dc0 Mon Sep 17 00:00:00 2001 From: ergawy Date: Fri, 7 Jun 2024 03:41:55 -0500 Subject: [PATCH] [flang][OpenMP] Add `--openmp-enable-delayed-privatization-staging` flag Adds a new flag for delayed privatization to differentiate between features for which delayed privatization is fully supported vs. features with partial support. This enables use roll out delayed privatization and test it in the wild for completely supported constructs while keeping it switched off for partially supported ones. Which allows us to discover the issues early on rather than wait for all constructs to be supported. --- flang/lib/Lower/OpenMP/OpenMP.cpp | 2 +- flang/lib/Lower/OpenMP/Utils.cpp | 6 ++++++ flang/lib/Lower/OpenMP/Utils.h | 1 + .../DelayedPrivatization/target-private-allocatable.f90 | 4 ++-- .../target-private-multiple-variables.f90 | 4 ++-- .../OpenMP/DelayedPrivatization/target-private-simple.f90 | 4 ++-- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 184c43ff9fe91..6b391e11beb48 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -1114,7 +1114,7 @@ static void genTargetClauses( llvm::omp::Directive::OMPD_target); // `target private(..)` is only supported in delayed privatization mode. - if (!enableDelayedPrivatization) + if (!enableDelayedPrivatizationStaging) cp.processTODO(loc, llvm::omp::Directive::OMPD_target); } diff --git a/flang/lib/Lower/OpenMP/Utils.cpp b/flang/lib/Lower/OpenMP/Utils.cpp index da94352a84a7c..36d96f37ff36a 100644 --- a/flang/lib/Lower/OpenMP/Utils.cpp +++ b/flang/lib/Lower/OpenMP/Utils.cpp @@ -36,6 +36,12 @@ llvm::cl::opt enableDelayedPrivatization( "Emit `[first]private` variables as clauses on the MLIR ops."), llvm::cl::init(false)); +llvm::cl::opt enableDelayedPrivatizationStaging( + "openmp-enable-delayed-privatization-staging", + llvm::cl::desc("For partially supported constructs, emit `[first]private` " + "variables as clauses on the MLIR ops."), + llvm::cl::init(false)); + namespace Fortran { namespace lower { namespace omp { diff --git a/flang/lib/Lower/OpenMP/Utils.h b/flang/lib/Lower/OpenMP/Utils.h index d20f9187640f0..0b4fe9044bfa7 100644 --- a/flang/lib/Lower/OpenMP/Utils.h +++ b/flang/lib/Lower/OpenMP/Utils.h @@ -17,6 +17,7 @@ extern llvm::cl::opt treatIndexAsSection; extern llvm::cl::opt enableDelayedPrivatization; +extern llvm::cl::opt enableDelayedPrivatizationStaging; namespace fir { class FirOpBuilder; diff --git a/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-allocatable.f90 b/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-allocatable.f90 index 17a28c6a5ab7d..a27de1152ce17 100644 --- a/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-allocatable.f90 +++ b/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-allocatable.f90 @@ -1,8 +1,8 @@ ! Tests delayed privatization for `targets ... private(..)` for allocatables. -! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization \ +! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization-staging \ ! RUN: -o - %s 2>&1 | FileCheck %s -! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization -o - %s 2>&1 \ +! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization-staging -o - %s 2>&1 \ ! RUN: | FileCheck %s subroutine target_allocatable diff --git a/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-multiple-variables.f90 b/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-multiple-variables.f90 index 8682a420e89d9..6e8282b2af625 100644 --- a/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-multiple-variables.f90 +++ b/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-multiple-variables.f90 @@ -1,8 +1,8 @@ ! Tests delayed privatization for `targets ... private(..)` for allocatables. -! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization \ +! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization-staging \ ! RUN: -o - %s 2>&1 | FileCheck %s -! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization -o - %s 2>&1 \ +! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization-staging -o - %s 2>&1 \ ! RUN: | FileCheck %s subroutine target_allocatable(lb, ub, l) diff --git a/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-simple.f90 b/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-simple.f90 index 94edeaa5a7ef1..524e973780c49 100644 --- a/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-simple.f90 +++ b/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-simple.f90 @@ -1,8 +1,8 @@ ! Tests delayed privatization for `targets ... private(..)` for simple variables. -! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization \ +! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization-staging \ ! RUN: -o - %s 2>&1 | FileCheck %s -! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization -o - %s 2>&1 \ +! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization-staging -o - %s 2>&1 \ ! RUN: | FileCheck %s subroutine target_simple