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">,
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">,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits