Author: Joseph Huber Date: 2023-08-18T17:10:13-05:00 New Revision: 4ab4e40fa2944bfd2ed44c63027e7a838043e0fd
URL: https://github.com/llvm/llvm-project/commit/4ab4e40fa2944bfd2ed44c63027e7a838043e0fd DIFF: https://github.com/llvm/llvm-project/commit/4ab4e40fa2944bfd2ed44c63027e7a838043e0fd.diff LOG: [OpenMP] Always pass the optimization level to the linker wrapper The linker wrapper runs LTO internally, so it needs to know the optimization level the user requested, if any. Previously this was only done in `-foffload-lto` mode as we were assuming that this would enble LTO. However, AMDGPU always performs LTO, and it's possible to run clang on object files to link without passing this flag. So we should just respect it always. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D158298 Added: Modified: clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/amdgpu-openmp-toolchain.c Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index ed42eba0945ee5..8ac68df3b6db73 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8619,24 +8619,22 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, } } - if (D.isUsingLTO(/* IsOffload */ true)) { - // Pass in the optimization level to use for LTO. - if (const Arg *A = Args.getLastArg(options::OPT_O_Group)) { - StringRef OOpt; - if (A->getOption().matches(options::OPT_O4) || - A->getOption().matches(options::OPT_Ofast)) - OOpt = "3"; - else if (A->getOption().matches(options::OPT_O)) { - OOpt = A->getValue(); - if (OOpt == "g") - OOpt = "1"; - else if (OOpt == "s" || OOpt == "z") - OOpt = "2"; - } else if (A->getOption().matches(options::OPT_O0)) - OOpt = "0"; - if (!OOpt.empty()) - CmdArgs.push_back(Args.MakeArgString(Twine("--opt-level=O") + OOpt)); - } + // Pass in the optimization level to use for LTO. + if (const Arg *A = Args.getLastArg(options::OPT_O_Group)) { + StringRef OOpt; + if (A->getOption().matches(options::OPT_O4) || + A->getOption().matches(options::OPT_Ofast)) + OOpt = "3"; + else if (A->getOption().matches(options::OPT_O)) { + OOpt = A->getValue(); + if (OOpt == "g") + OOpt = "1"; + else if (OOpt == "s" || OOpt == "z") + OOpt = "2"; + } else if (A->getOption().matches(options::OPT_O0)) + OOpt = "0"; + if (!OOpt.empty()) + CmdArgs.push_back(Args.MakeArgString(Twine("--opt-level=O") + OOpt)); } CmdArgs.push_back( diff --git a/clang/test/Driver/amdgpu-openmp-toolchain.c b/clang/test/Driver/amdgpu-openmp-toolchain.c index acb175b8663607..06b6ed324e74ec 100644 --- a/clang/test/Driver/amdgpu-openmp-toolchain.c +++ b/clang/test/Driver/amdgpu-openmp-toolchain.c @@ -70,3 +70,7 @@ // RUN: not %clang -### -target x86_64-pc-linux-gnu -fopenmp --offload-arch=gfx90a,gfx90a:xnack+ \ // RUN: -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-TARGET-ID-ERROR // CHECK-TARGET-ID-ERROR: error: invalid offload arch combinations: 'gfx90a' and 'gfx90a:xnack+' + +// RUN: %clang -### -target x86_64-pc-linux-gnu -fopenmp --offload-arch=gfx90a \ +// RUN: -O3 -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-OPT +// CHECK-OPT: clang-linker-wrapper{{.*}}"--opt-level=O3" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits