Author: Michael Klemm
Date: 2026-07-27T16:59:21+02:00
New Revision: 750ed0a8239147a5ce81eb31d54591c2b01b8e8f

URL: 
https://github.com/llvm/llvm-project/commit/750ed0a8239147a5ce81eb31d54591c2b01b8e8f
DIFF: 
https://github.com/llvm/llvm-project/commit/750ed0a8239147a5ce81eb31d54591c2b01b8e8f.diff

LOG: [Flang][OpenMP] Add support for -fopenmp-target-fast (#212181)

The `-fopenmp-target-fast` is a meta flag that enables several
optimizations for device code.

Added: 
    flang/test/Driver/openmp-target-fast-flag.f90

Modified: 
    clang/include/clang/Options/Options.td
    clang/lib/Driver/ToolChains/Flang.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index 41848b18f2e1b..1478624265f79 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -4301,11 +4301,11 @@ def fno_openmp_target_new_runtime : Flag<["-"], 
"fno-openmp-target-new-runtime">
   Group<f_Group>, Flags<[HelpHidden]>, Visibility<[ClangOption, CC1Option]>;
 def fopenmp_target_fast : Flag<["-"], "fopenmp-target-fast">,
   Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>,
-  Visibility<[ClangOption]>,
+  Visibility<[ClangOption, FlangOption]>,
   HelpText<"Assert common GPU usage patterns to enable OpenMP runtime 
optimizations">;
 def fno_openmp_target_fast : Flag<["-"], "fno-openmp-target-fast">,
   Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>,
-  Visibility<[ClangOption]>;
+  Visibility<[ClangOption, FlangOption]>;
 defm openmp_optimistic_collapse : BoolFOption<"openmp-optimistic-collapse",
   LangOpts<"OpenMPOptimisticCollapse">, DefaultFalse,
   PosFlag<SetTrue, [], [ClangOption, CC1Option]>,

diff  --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index d900037230f20..650148de1374a 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -758,15 +758,34 @@ void Flang::addOffloadOptions(Compilation &C, const 
InputInfoList &Inputs,
     // generating code for a device, so that only the relevant code is emitted.
     CmdArgs.push_back("-fopenmp-is-target-device");
 
+    // -fopenmp-target-fast implies -fopenmp-assume-no-thread-state and
+    // -fopenmp-assume-no-nested-parallelism, and forces -O3 unless an
+    // explicit optimization level was requested.
+    bool TargetFastUsed =
+        Args.hasFlag(options::OPT_fopenmp_target_fast,
+                     options::OPT_fno_openmp_target_fast, false);
+
+    if (TargetFastUsed && !Args.hasArg(options::OPT_O_Group))
+      CmdArgs.push_back("-O3");
+
     // When in OpenMP offloading mode, enable debugging on the device.
     Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_target_debug_EQ);
     if (Args.hasFlag(options::OPT_fopenmp_target_debug,
                      options::OPT_fno_openmp_target_debug, /*Default=*/false))
       CmdArgs.push_back("-fopenmp-target-debug");
-    if (Args.hasArg(options::OPT_fopenmp_assume_no_thread_state))
+
+    // Handle -fopenmp-assume-no-thread-state (implied by target-fast)
+    if (Args.hasFlag(options::OPT_fopenmp_assume_no_thread_state,
+                     options::OPT_fno_openmp_assume_no_thread_state,
+                     /*Default=*/TargetFastUsed))
       CmdArgs.push_back("-fopenmp-assume-no-thread-state");
-    if (Args.hasArg(options::OPT_fopenmp_assume_no_nested_parallelism))
+
+    // Handle -fopenmp-assume-no-nested-parallelism (implied by target-fast)
+    if (Args.hasFlag(options::OPT_fopenmp_assume_no_nested_parallelism,
+                     options::OPT_fno_openmp_assume_no_nested_parallelism,
+                     /*Default=*/TargetFastUsed))
       CmdArgs.push_back("-fopenmp-assume-no-nested-parallelism");
+
     if (!Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
                       true))
       CmdArgs.push_back("-nogpulib");

diff  --git a/flang/test/Driver/openmp-target-fast-flag.f90 
b/flang/test/Driver/openmp-target-fast-flag.f90
new file mode 100644
index 0000000000000..33083376b04da
--- /dev/null
+++ b/flang/test/Driver/openmp-target-fast-flag.f90
@@ -0,0 +1,35 @@
+! REQUIRES: amdgpu-registered-target
+
+! -fopenmp-target-fast is a meta-flag: on the OpenMP offload device compilation
+! it implies -fopenmp-assume-no-thread-state and
+! -fopenmp-assume-no-nested-parallelism, and forces -O3 unless an explicit
+! optimization level is requested. It is only enabled when explicitly
+! requested; -Ofast does not enable it. -fno-openmp-target-fast disables it.
+
+! RUN: %flang -### -fopenmp --offload-arch=gfx90a -nogpulib -O0 %s 2>&1 \
+! RUN:   | FileCheck -check-prefixes=DefaultTState,DefaultNoNestParallel %s
+
+! RUN: %flang -### -fopenmp --offload-arch=gfx90a -nogpulib -O0 
-fopenmp-target-fast %s 2>&1 \
+! RUN:   | FileCheck -check-prefixes=TState,NestParallel %s
+
+! RUN: %flang -### -fopenmp --offload-arch=gfx90a -nogpulib 
-fopenmp-target-fast %s 2>&1 \
+! RUN:   | FileCheck -check-prefixes=O3,TState,NestParallel %s
+
+! RUN: %flang -### -fopenmp --offload-arch=gfx90a -nogpulib -O3 
-fno-openmp-target-fast %s 2>&1 \
+! RUN:   | FileCheck -check-prefixes=DefaultTState,DefaultNoNestParallel %s
+
+! -Ofast must NOT enable target-fast.
+! RUN: %flang -### -fopenmp --offload-arch=gfx90a -nogpulib -Ofast %s 2>&1 \
+! RUN:   | FileCheck -check-prefixes=DefaultTState,DefaultNoNestParallel %s
+
+! O3: "-O3"
+
+! TState: "-fopenmp-assume-no-thread-state"
+! TState-NOT: "-fno-openmp-assume-no-thread-state"
+! DefaultTState-NOT: "-f{{(no-)?}}openmp-assume-no-thread-state"
+
+! NestParallel: "-fopenmp-assume-no-nested-parallelism"
+! NestParallel-NOT: "-fno-openmp-assume-no-nested-parallelism"
+! DefaultNoNestParallel-NOT: "-f{{(no-)?}}openmp-assume-no-nested-parallelism"
+
+end program
\ No newline at end of file


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to