tra created this revision. Herald added subscribers: mattd, gchakrabarti, asavonic, kerbowa, bixia, tpr, yaxunl, jvesely. Herald added a project: All. tra edited the summary of this revision. tra published this revision for review. tra added reviewers: jlebar, yaxunl. tra added a comment. Herald added subscribers: cfe-commits, jholewinski. Herald added a project: clang.
For some context about why it's needed see https://github.com/compiler-explorer/compiler-explorer/pull/5373#issuecomment-1687127788 The short version is that currently CUDA compilation is broken w/ clang with unpatched libstdc++. Ubuntu and Debian patch libstdc++ to avoid the problem, but this should be handled by clang. GPUs do not have actual FP128 support, but we do need to be able to compile host-side headers which use `__float128`. On the GPU side we'll downgrade `__float128` to double, similarly to how we handle `long double`. Both types will have different in-memory representation compared to their host counterparts and are not expected to be interchangeable across host/device boundary. Also see https://reviews.llvm.org/D78513 which applied equivalent change to HIP/AMDGPU. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D158778 Files: clang/lib/Basic/Targets/NVPTX.cpp clang/test/SemaCUDA/amdgpu-f128.cu clang/test/SemaCUDA/f128.cu Index: clang/test/SemaCUDA/f128.cu =================================================================== --- clang/test/SemaCUDA/f128.cu +++ clang/test/SemaCUDA/f128.cu @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-linux-gnu -fcuda-is-device -fsyntax-only -verify %s +// RUN: %clang_cc1 -triple nvptx64 -aux-triple x86_64-unknown-linux-gnu -fcuda-is-device -fsyntax-only -verify %s // expected-no-diagnostics typedef __float128 f128_t; Index: clang/lib/Basic/Targets/NVPTX.cpp =================================================================== --- clang/lib/Basic/Targets/NVPTX.cpp +++ clang/lib/Basic/Targets/NVPTX.cpp @@ -142,6 +142,20 @@ // we need all classes to be defined on both the host and device. MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth(); + // For certain builtin types support on the host target, claim they are + // support to pass the compilation of the host code during the device-side + // compilation. + // + // FIXME: As the side effect, we also accept `__float128` uses in the device + // code, but use 'double' as the underlying type, so host/device + // representation of the type is different. This is similar to what happens to + // long double. + + if (HostTarget->hasFloat128Type()) { + HasFloat128 = true; + Float128Format = DoubleFormat; + } + // Properties intentionally not copied from host: // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the // host/device boundary.
Index: clang/test/SemaCUDA/f128.cu =================================================================== --- clang/test/SemaCUDA/f128.cu +++ clang/test/SemaCUDA/f128.cu @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-linux-gnu -fcuda-is-device -fsyntax-only -verify %s +// RUN: %clang_cc1 -triple nvptx64 -aux-triple x86_64-unknown-linux-gnu -fcuda-is-device -fsyntax-only -verify %s // expected-no-diagnostics typedef __float128 f128_t; Index: clang/lib/Basic/Targets/NVPTX.cpp =================================================================== --- clang/lib/Basic/Targets/NVPTX.cpp +++ clang/lib/Basic/Targets/NVPTX.cpp @@ -142,6 +142,20 @@ // we need all classes to be defined on both the host and device. MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth(); + // For certain builtin types support on the host target, claim they are + // support to pass the compilation of the host code during the device-side + // compilation. + // + // FIXME: As the side effect, we also accept `__float128` uses in the device + // code, but use 'double' as the underlying type, so host/device + // representation of the type is different. This is similar to what happens to + // long double. + + if (HostTarget->hasFloat128Type()) { + HasFloat128 = true; + Float128Format = DoubleFormat; + } + // Properties intentionally not copied from host: // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the // host/device boundary.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits