From 9af67e622b725eb166186280ceca7881374cdc96 Mon Sep 17 00:00:00 2001 From: Jakub Chlanda Date: Fri, 20 Dec 2024 14:22:01 +0000 Subject: [PATCH 1/2] [Driver][SYCL] Support 64bit long double for SYCL GPU compilation --- clang/include/clang/Driver/ToolChain.h | 6 +++--- clang/lib/Driver/ToolChain.cpp | 23 +++++++++++++---------- clang/lib/Driver/ToolChains/Clang.cpp | 5 +++++ clang/test/Driver/mlong-double-128.c | 8 ++++++++ clang/test/Driver/sycl-mlong-double.cpp | 18 +++++++++++++++++- 5 files changed, 46 insertions(+), 14 deletions(-) diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 16c33b77c0f31..6c314ffd10822 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -377,9 +377,9 @@ class ToolChain { return nullptr; } - /// TranslateOffloadTargetArgs - Create a new derived argument list for - /// that contains the Offload target specific flags passed via - /// -Xopenmp-target -opt=val OR -Xopenmp-target= -opt=val + /// TranslateOffloadTargetArgs - Create a new derived argument list that + /// contains the Offload target specific flags passed via -Xopenmp-target + /// -opt=val OR -Xopenmp-target= -opt=val /// Also handles -Xsycl-target OR -Xsycl-target= virtual llvm::opt::DerivedArgList *TranslateOffloadTargetArgs( const llvm::opt::DerivedArgList &Args, bool SameTripleAsHost, diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index b6a182b8c7b1e..f1794a5989eed 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1640,6 +1640,8 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOffloadTargetArgs( DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); const OptTable &Opts = getDriver().getOpts(); bool Modified = false; + auto &Triple = getTriple(); + const bool IsSYCL = DeviceOffloadKind == Action::OFK_SYCL; // Handle -Xopenmp-target and -Xsycl-target-frontend flags for (auto *A : Args) { @@ -1654,13 +1656,15 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOffloadTargetArgs( // to correctly set metadata in intermediate files. if (SameTripleAsHost || A->getOption().matches(options::OPT_mcode_object_version_EQ) || - (getTriple().getArch() == llvm::Triple::amdgcn && - DeviceOffloadKind != Action::OFK_SYCL)) { + (Triple.getArch() == llvm::Triple::amdgcn && !IsSYCL)) { DAL->append(A); continue; } - // SPIR/SPIR-V special case for -mlong-double - if (getTriple().isSPIROrSPIRV() && + // SPIR/SPIR-V and SYCL GPU special case for -mlong-double. We have to + // make sure that if user requested 64bit long double it is honored on + // both host and device. + if ((Triple.isSPIROrSPIRV() || + (IsSYCL && (Triple.isAMDGCN() || Triple.isNVPTX()))) && A->getOption().matches(options::OPT_LongDouble_Group)) { DAL->append(A); continue; @@ -1683,7 +1687,7 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOffloadTargetArgs( // is similar, can be improved if (DeviceOffloadKind == Action::OFK_OpenMP) { XOffloadTargetNoTriple = - A->getOption().matches(options::OPT_Xopenmp_target); + A->getOption().matches(options::OPT_Xopenmp_target); if (A->getOption().matches(options::OPT_Xopenmp_target_EQ)) { llvm::Triple TT(getOpenMPTriple(A->getValue(0))); @@ -1699,12 +1703,12 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOffloadTargetArgs( DAL->append(A); continue; } - } else if (DeviceOffloadKind == Action::OFK_SYCL) { + } else if (IsSYCL) { XOffloadTargetNoTriple = - A->getOption().matches(options::OPT_Xsycl_frontend); + A->getOption().matches(options::OPT_Xsycl_frontend); if (A->getOption().matches(options::OPT_Xsycl_frontend_EQ)) { // Passing device args: -Xsycl-target-frontend= -opt=val. - if (getDriver().getSYCLDeviceTriple(A->getValue(0)) == getTriple()) + if (getDriver().getSYCLDeviceTriple(A->getValue(0)) == Triple) Index = Args.getBaseArgs().MakeIndex(A->getValue(1)); else continue; @@ -1744,8 +1748,7 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOffloadTargetArgs( getDriver().Diag(diag::err_drv_Xopenmp_target_missing_triple); continue; } - if (DeviceOffloadKind == Action::OFK_SYCL && - !SingleTargetTripleCount(options::OPT_fsycl_targets_EQ)) { + if (IsSYCL && !SingleTargetTripleCount(options::OPT_fsycl_targets_EQ)) { getDriver().Diag(diag::err_drv_Xsycl_target_missing_triple) << A->getSpelling(); continue; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 2649946b951f3..832733eb2bda8 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6751,6 +6751,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, (A->getOption().getID() == options::OPT_mlong_double_64)) // Only allow for -mlong-double-64 for SPIR/SPIR-V A->render(Args, CmdArgs); + else if ((IsSYCL && + (TC.getTriple().isAMDGCN() || TC.getTriple().isNVPTX())) && + (A->getOption().getID() == options::OPT_mlong_double_64)) + // similarly, allow 64bit long double for SYCL GPU targets + A->render(Args, CmdArgs); else if (TC.getTriple().isPPC() && (A->getOption().getID() != options::OPT_mlong_double_80)) A->render(Args, CmdArgs); diff --git a/clang/test/Driver/mlong-double-128.c b/clang/test/Driver/mlong-double-128.c index af038fc6a4075..4b22779627338 100644 --- a/clang/test/Driver/mlong-double-128.c +++ b/clang/test/Driver/mlong-double-128.c @@ -12,8 +12,16 @@ // RUN: not %clang --target=powerpc -c -### %s -mlong-double-80 2>&1 | FileCheck --check-prefix=ERR2 %s // RUN: not %clang --target=spir64-unknown-unknown -c -### %s -mlong-double-128 2>&1 | FileCheck --check-prefix=ERR3 %s // RUN: not %clang --target=spir64-unknown-unknown -c -### %s -mlong-double-80 2>&1 | FileCheck --check-prefix=ERR4 %s +// RUN: not %clang --target=nvptx64-nvidia-cuda -c -### %s -mlong-double-128 2>&1 | FileCheck --check-prefix=ERR5 %s +// RUN: not %clang --target=nvptx64-nvidia-cuda -c -### %s -mlong-double-80 2>&1 | FileCheck --check-prefix=ERR6 %s +// RUN: not %clang --target=amd_gpu_gfx1031 -c -### %s -mlong-double-128 2>&1 | FileCheck --check-prefix=ERR7 %s +// RUN: not %clang --target=amd_gpu_gfx1031 -c -### %s -mlong-double-80 2>&1 | FileCheck --check-prefix=ERR8 %s // ERR: error: unsupported option '-mlong-double-128' for target 'aarch64' // ERR2: error: unsupported option '-mlong-double-80' for target 'powerpc' // ERR3: error: unsupported option '-mlong-double-128' for target 'spir64-unknown-unknown' // ERR4: error: unsupported option '-mlong-double-80' for target 'spir64-unknown-unknown' +// ERR5: error: unsupported option '-mlong-double-128' for target 'nvptx64-nvidia-cuda' +// ERR6: error: unsupported option '-mlong-double-80' for target 'nvptx64-nvidia-cuda' +// ERR7: error: unsupported option '-mlong-double-128' for target 'amd_gpu_gfx1031' +// ERR8: error: unsupported option '-mlong-double-80' for target 'amd_gpu_gfx1031' diff --git a/clang/test/Driver/sycl-mlong-double.cpp b/clang/test/Driver/sycl-mlong-double.cpp index 40d933ca47f20..a9e105f41a3c7 100644 --- a/clang/test/Driver/sycl-mlong-double.cpp +++ b/clang/test/Driver/sycl-mlong-double.cpp @@ -5,7 +5,7 @@ // CHECK: clang{{.*}} "-triple" "x86_64-unknown-linux-gnu" // CHECK-SAME: "-mlong-double-64" -/// -mlong-double-128 and -mlong-double-80 are not supported for spir64. +/// -mlong-double-128 and -mlong-double-80 are not supported for spir64, or SYCL GPU targets. // RUN: not %clangxx -c -fsycl -mlong-double-128 -target x86_64-unknown-linux-gnu %s -### 2>&1 | FileCheck --check-prefix=CHECK-128 %s // CHECK-128: error: unsupported option '-mlong-double-128' for target 'spir64-unknown-unknown' // CHECK-128-NOT: clang{{.*}} "-triple" "-spir64-unknown-unknown" {{.*}} "-mlong-double-128" @@ -13,3 +13,19 @@ // RUN: not %clangxx -c -fsycl -mlong-double-80 -target x86_64-unknown-linux-gnu %s -### 2>&1 | FileCheck --check-prefix=CHECK-80 %s // CHECK-80: error: unsupported option '-mlong-double-80' for target 'spir64-unknown-unknown' // CHECK-80-NOT: clang{{.*}} "-triple" "-spir64-unknown-unknown" {{.*}} "-mlong-double-80" + +// RUN: not %clangxx -c -fsycl -mlong-double-128 -target amd_gpu_gfx1031 %s -### 2>&1 | FileCheck --check-prefix=CHECK-128-AMD %s +// CHECK-128-AMD: error: unsupported option '-mlong-double-128' for target 'amd_gpu_gfx1031' +// CHECK-128-AMD-NOT: clang{{.*}} "-triple" "-amd_gpu_gfx1031" {{.*}} "-mlong-double-128" + +// RUN: not %clangxx -c -fsycl -mlong-double-80 -target amd_gpu_gfx1031 %s -### 2>&1 | FileCheck --check-prefix=CHECK-80-AMD %s +// CHECK-80-AMD: error: unsupported option '-mlong-double-80' for target 'amd_gpu_gfx1031' +// CHECK-80-AMD-NOT: clang{{.*}} "-triple" "-amd_gpu_gfx1031" {{.*}} "-mlong-double-80" + +// RUN: not %clangxx -c -fsycl -mlong-double-128 -target nvptx64-nvidia-cuda %s -### 2>&1 | FileCheck --check-prefix=CHECK-128-NVPTX %s +// CHECK-128-NVPTX: error: unsupported option '-mlong-double-128' for target 'nvptx64-nvidia-cuda' +// CHECK-128-NVPTX-NOT: clang{{.*}} "-triple" "-nvptx64-nvidia-cuda" {{.*}} "-mlong-double-128" + +// RUN: not %clangxx -c -fsycl -mlong-double-80 -target nvptx64-nvidia-cuda %s -### 2>&1 | FileCheck --check-prefix=CHECK-80-NVPTX %s +// CHECK-80-NVPTX: error: unsupported option '-mlong-double-80' for target 'nvptx64-nvidia-cuda' +// CHECK-80-NVPTX-NOT: clang{{.*}} "-triple" "-nvptx64-nvidia-cuda" {{.*}} "-mlong-double-80" From 83260bb209299bbb76e62371dbe30bbb632d814b Mon Sep 17 00:00:00 2001 From: Jakub Chlanda Date: Sat, 28 Dec 2024 07:53:29 +0000 Subject: [PATCH 2/2] Use --target=A -fsycl-targets=B --- clang/test/Driver/sycl-mlong-double.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/test/Driver/sycl-mlong-double.cpp b/clang/test/Driver/sycl-mlong-double.cpp index a9e105f41a3c7..5f969b1605f7c 100644 --- a/clang/test/Driver/sycl-mlong-double.cpp +++ b/clang/test/Driver/sycl-mlong-double.cpp @@ -14,18 +14,18 @@ // CHECK-80: error: unsupported option '-mlong-double-80' for target 'spir64-unknown-unknown' // CHECK-80-NOT: clang{{.*}} "-triple" "-spir64-unknown-unknown" {{.*}} "-mlong-double-80" -// RUN: not %clangxx -c -fsycl -mlong-double-128 -target amd_gpu_gfx1031 %s -### 2>&1 | FileCheck --check-prefix=CHECK-128-AMD %s -// CHECK-128-AMD: error: unsupported option '-mlong-double-128' for target 'amd_gpu_gfx1031' +// RUN: not %clangxx -c -fsycl -mlong-double-128 --target=x86_64-unknown-linux-gnu -fsycl-targets=amd_gpu_gfx1031 %s -### 2>&1 | FileCheck --check-prefix=CHECK-128-AMD %s +// CHECK-128-AMD: error: unsupported option '-mlong-double-128' for target 'amdgcn-amd-amdhsa' // CHECK-128-AMD-NOT: clang{{.*}} "-triple" "-amd_gpu_gfx1031" {{.*}} "-mlong-double-128" -// RUN: not %clangxx -c -fsycl -mlong-double-80 -target amd_gpu_gfx1031 %s -### 2>&1 | FileCheck --check-prefix=CHECK-80-AMD %s -// CHECK-80-AMD: error: unsupported option '-mlong-double-80' for target 'amd_gpu_gfx1031' +// RUN: not %clangxx -c -fsycl -mlong-double-80 --target=x86_64-unknown-linux-gnu -fsycl-targets=amd_gpu_gfx1031 %s -### 2>&1 | FileCheck --check-prefix=CHECK-80-AMD %s +// CHECK-80-AMD: error: unsupported option '-mlong-double-80' for target 'amdgcn-amd-amdhsa' // CHECK-80-AMD-NOT: clang{{.*}} "-triple" "-amd_gpu_gfx1031" {{.*}} "-mlong-double-80" -// RUN: not %clangxx -c -fsycl -mlong-double-128 -target nvptx64-nvidia-cuda %s -### 2>&1 | FileCheck --check-prefix=CHECK-128-NVPTX %s +// RUN: not %clangxx -c -fsycl -mlong-double-128 --target=x86_64-unknown-linux-gnu -fsycl-targets=nvptx64-nvidia-cuda %s -### 2>&1 | FileCheck --check-prefix=CHECK-128-NVPTX %s // CHECK-128-NVPTX: error: unsupported option '-mlong-double-128' for target 'nvptx64-nvidia-cuda' // CHECK-128-NVPTX-NOT: clang{{.*}} "-triple" "-nvptx64-nvidia-cuda" {{.*}} "-mlong-double-128" -// RUN: not %clangxx -c -fsycl -mlong-double-80 -target nvptx64-nvidia-cuda %s -### 2>&1 | FileCheck --check-prefix=CHECK-80-NVPTX %s +// RUN: not %clangxx -c -fsycl -mlong-double-80 --target=x86_64-unknown-linux-gnu -fsycl-targets=nvptx64-nvidia-cuda %s -### 2>&1 | FileCheck --check-prefix=CHECK-80-NVPTX %s // CHECK-80-NVPTX: error: unsupported option '-mlong-double-80' for target 'nvptx64-nvidia-cuda' // CHECK-80-NVPTX-NOT: clang{{.*}} "-triple" "-nvptx64-nvidia-cuda" {{.*}} "-mlong-double-80"