Skip to content

Commit 4ab4e40

Browse files
committed
[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
1 parent 8806b4f commit 4ab4e40

File tree

2 files changed

+20
-18
lines changed

2 files changed

+20
-18
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8619,24 +8619,22 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
86198619
}
86208620
}
86218621

8622-
if (D.isUsingLTO(/* IsOffload */ true)) {
8623-
// Pass in the optimization level to use for LTO.
8624-
if (const Arg *A = Args.getLastArg(options::OPT_O_Group)) {
8625-
StringRef OOpt;
8626-
if (A->getOption().matches(options::OPT_O4) ||
8627-
A->getOption().matches(options::OPT_Ofast))
8628-
OOpt = "3";
8629-
else if (A->getOption().matches(options::OPT_O)) {
8630-
OOpt = A->getValue();
8631-
if (OOpt == "g")
8632-
OOpt = "1";
8633-
else if (OOpt == "s" || OOpt == "z")
8634-
OOpt = "2";
8635-
} else if (A->getOption().matches(options::OPT_O0))
8636-
OOpt = "0";
8637-
if (!OOpt.empty())
8638-
CmdArgs.push_back(Args.MakeArgString(Twine("--opt-level=O") + OOpt));
8639-
}
8622+
// Pass in the optimization level to use for LTO.
8623+
if (const Arg *A = Args.getLastArg(options::OPT_O_Group)) {
8624+
StringRef OOpt;
8625+
if (A->getOption().matches(options::OPT_O4) ||
8626+
A->getOption().matches(options::OPT_Ofast))
8627+
OOpt = "3";
8628+
else if (A->getOption().matches(options::OPT_O)) {
8629+
OOpt = A->getValue();
8630+
if (OOpt == "g")
8631+
OOpt = "1";
8632+
else if (OOpt == "s" || OOpt == "z")
8633+
OOpt = "2";
8634+
} else if (A->getOption().matches(options::OPT_O0))
8635+
OOpt = "0";
8636+
if (!OOpt.empty())
8637+
CmdArgs.push_back(Args.MakeArgString(Twine("--opt-level=O") + OOpt));
86408638
}
86418639

86428640
CmdArgs.push_back(

clang/test/Driver/amdgpu-openmp-toolchain.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,7 @@
7070
// RUN: not %clang -### -target x86_64-pc-linux-gnu -fopenmp --offload-arch=gfx90a,gfx90a:xnack+ \
7171
// RUN: -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-TARGET-ID-ERROR
7272
// CHECK-TARGET-ID-ERROR: error: invalid offload arch combinations: 'gfx90a' and 'gfx90a:xnack+'
73+
74+
// RUN: %clang -### -target x86_64-pc-linux-gnu -fopenmp --offload-arch=gfx90a \
75+
// RUN: -O3 -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-OPT
76+
// CHECK-OPT: clang-linker-wrapper{{.*}}"--opt-level=O3"

0 commit comments

Comments
 (0)