[PATCH] D141158: [OpenMP] Introduce '-f[no]-openmp-target-jit' flag to control JIT for offloading

Joseph Huber via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 6 13:32:56 PST 2023


jhuber6 created this revision.
jhuber6 added reviewers: jdoerfert, JonChesterfield, MaskRay, ggeorgakoudis, tianshilei1992.
Herald added subscribers: StephenFan, guansong, yaxunl.
Herald added a project: All.
jhuber6 requested review of this revision.
Herald added subscribers: cfe-commits, sstefan1.
Herald added a project: clang.

JIT support for OpenMP offloading was introduced in D139287 <https://reviews.llvm.org/D139287>. This patch
adds a simple flag that enables this mode. It simply requires enabling
`-foffload-lto` mode and `--embed-bitcode` in the linker wrapper. This
option implies LTO if it is not enabled.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D141158

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/Driver.cpp
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/openmp-offload-jit.c


Index: clang/test/Driver/openmp-offload-jit.c
===================================================================
--- /dev/null
+++ clang/test/Driver/openmp-offload-jit.c
@@ -0,0 +1,42 @@
+// REQUIRES: x86-registered-target
+// REQUIRES: nvptx-registered-target
+// REQUIRES: amdgpu-registered-target
+
+// Check that we enable LTO-mode properly with '-fopenmp-target-jit' and that it
+// still enabled LTO-mode if `-fno-offload-lto` is on.
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -ccc-print-phases -fopenmp \
+// RUN:   -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp-target-jit %s 2>&1 \
+// RUN: | FileCheck -check-prefix=PHASES-JIT %s
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -ccc-print-phases -fopenmp \
+// RUN:   -fopenmp-targets=nvptx64-nvidia-cuda -foffload-lto -fopenmp-target-jit %s 2>&1 \
+// RUN: | FileCheck -check-prefix=PHASES-JIT %s
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -ccc-print-phases -fopenmp \
+// RUN:   -fopenmp-targets=amdgcn-amd-amdhsa -fopenmp-target-jit %s 2>&1 \
+// RUN: | FileCheck -check-prefix=PHASES-JIT %s
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -ccc-print-phases -fopenmp \
+// RUN:   -fopenmp-targets=amdgcn-amd-amdhsa -foffload-lto -fopenmp-target-jit %s 2>&1 \
+// RUN: | FileCheck -check-prefix=PHASES-JIT %s
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -ccc-print-phases -fopenmp \
+// RUN:   -fopenmp-targets=amdgcn-amd-amdhsa -fno-offload-lto -fopenmp-target-jit %s 2>&1 \
+// RUN: | FileCheck -check-prefix=PHASES-JIT %s
+//
+//      PHASES-JIT: 0: input, "[[INPUT:.+]]", c, (host-openmp)
+// PHASES-JIT-NEXT: 1: preprocessor, {0}, cpp-output, (host-openmp)
+// PHASES-JIT-NEXT: 2: compiler, {1}, ir, (host-openmp)
+// PHASES-JIT-NEXT: 3: input, "[[INPUT]]", c, (device-openmp)
+// PHASES-JIT-NEXT: 4: preprocessor, {3}, cpp-output, (device-openmp)
+// PHASES-JIT-NEXT: 5: compiler, {4}, ir, (device-openmp)
+// PHASES-JIT-NEXT: 6: offload, "host-openmp (x86_64-unknown-linux-gnu)" {2}, "device-openmp ([[TARGET:.+]])" {5}, ir
+// PHASES-JIT-NEXT: 7: backend, {6}, lto-bc, (device-openmp)
+// PHASES-JIT-NEXT: 8: offload, "device-openmp ([[TARGET]])" {7}, lto-bc
+// PHASES-JIT-NEXT: 9: clang-offload-packager, {8}, image, (device-openmp)
+// PHASES-JIT-NEXT: 10: offload, "host-openmp (x86_64-unknown-linux-gnu)" {2}, "device-openmp (x86_64-unknown-linux-gnu)" {9}, ir
+// PHASES-JIT-NEXT: 11: backend, {10}, assembler, (host-openmp)
+// PHASES-JIT-NEXT: 12: assembler, {11}, object, (host-openmp)
+// PHASES-JIT-NEXT: 13: clang-linker-wrapper, {12}, image, (host-openmp)
+
+// Check that we add the `--embed-bitcode` flag to the linker wrapper.
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp \
+// RUN:   -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp-target-jit %s 2>&1 \
+// RUN: | FileCheck -check-prefix=LINKER %s
+// LINKER: clang-linker-wrapper"{{.*}}"--embed-bitcode"
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -8428,6 +8428,10 @@
   }
   Args.ClaimAllArgs(options::OPT_Xoffload_linker);
 
+  // Embed bitcode instead of an object in JIT mode.
+  if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_target_jit))
+    CmdArgs.push_back("--embed-bitcode");
+
   // Forward `-mllvm` arguments to the LLVM invocations if present.
   for (Arg *A : Args.filtered(options::OPT_mllvm)) {
     CmdArgs.push_back("-mllvm");
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -721,6 +721,13 @@
 
   OffloadLTOMode = parseLTOMode(*this, Args, options::OPT_foffload_lto_EQ,
                                 options::OPT_fno_offload_lto);
+
+  // Enable `-foffload-lto=full` if `-fopenmp-target-jit` is on.
+  if (OffloadLTOMode == LTOK_None || OffloadLTOMode == LTOK_Unknown)
+    OffloadLTOMode = Args.hasFlag(options::OPT_fopenmp_target_jit,
+                                  options::OPT_fno_openmp_target_jit, false)
+                         ? LTOK_Full
+                         : OffloadLTOMode;
 }
 
 /// Compute the desired OpenMP runtime from the flags provided.
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -2652,6 +2652,11 @@
   Flags<[CC1Option, NoArgumentUnused]>,
   HelpText<"Do not create a host fallback if offloading to the device fails.">,
   MarshallingInfoFlag<LangOpts<"OpenMPOffloadMandatory">>;
+def fopenmp_target_jit : Flag<["-"], "fopenmp-target-jit">, Group<f_Group>,
+  Flags<[CoreOption, NoArgumentUnused]>,
+  HelpText<"Emit code that can be JIT compiled for OpenMP offloading. Implies -foffload-lto=full">;
+def fno_openmp_target_jit : Flag<["-"], "fno-openmp-target-jit">, Group<f_Group>,
+  Flags<[CoreOption, NoArgumentUnused, HelpHidden]>;
 def fopenmp_target_new_runtime : Flag<["-"], "fopenmp-target-new-runtime">,
   Group<f_Group>, Flags<[CC1Option, HelpHidden]>;
 def fno_openmp_target_new_runtime : Flag<["-"], "fno-openmp-target-new-runtime">,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141158.486978.patch
Type: text/x-patch
Size: 5250 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230106/095cb07d/attachment-0001.bin>


More information about the cfe-commits mailing list