[PATCH] D158298: [OpenMP] Always pass the optimization level to the linker wrapper
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG4ab4e40fa294: [OpenMP] Always pass the optimization level to the linker wrapper (authored by jhuber6). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158298/new/ https://reviews.llvm.org/D158298 Files: clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/amdgpu-openmp-toolchain.c Index: clang/test/Driver/amdgpu-openmp-toolchain.c === --- clang/test/Driver/amdgpu-openmp-toolchain.c +++ 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" Index: clang/lib/Driver/ToolChains/Clang.cpp === --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -8619,24 +8619,22 @@ } } - 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( Index: clang/test/Driver/amdgpu-openmp-toolchain.c === --- clang/test/Driver/amdgpu-openmp-toolchain.c +++ 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" Index: clang/lib/Driver/ToolChains/Clang.cpp === --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -8619,24 +8619,22 @@ } } - 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
[PATCH] D158298: [OpenMP] Always pass the optimization level to the linker wrapper
jhuber6 created this revision. jhuber6 added reviewers: jdoerfert, tianshilei1992, JonChesterfield, ye-luo. Herald added subscribers: kerbowa, guansong, tpr, yaxunl, jvesely. Herald added a project: All. jhuber6 requested review of this revision. Herald added subscribers: cfe-commits, jplehr, sstefan1, MaskRay. Herald added a project: clang. 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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D158298 Files: clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/amdgpu-openmp-toolchain.c Index: clang/test/Driver/amdgpu-openmp-toolchain.c === --- clang/test/Driver/amdgpu-openmp-toolchain.c +++ 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" Index: clang/lib/Driver/ToolChains/Clang.cpp === --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -8617,24 +8617,22 @@ } } - 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( Index: clang/test/Driver/amdgpu-openmp-toolchain.c === --- clang/test/Driver/amdgpu-openmp-toolchain.c +++ 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" Index: clang/lib/Driver/ToolChains/Clang.cpp === --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -8617,24 +8617,22 @@ } } - 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 =