From: Alexey Bataev Date: Tue, 18 Jun 2019 19:04:27 +0000 (+0000) Subject: [OPENMP][NVPTX]Correct codegen for 128 bit long double. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e02265a0ff295ad7b965ee532173c7a0ea89f280;p=clang [OPENMP][NVPTX]Correct codegen for 128 bit long double. If the host uses 128 bit long doubles, the compiler should generate correct code for NVPTX devices. If the return type has 128 bit long doubles, in LLVM IR this type must be coerced to int array instead. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@363720 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 707425ea81..b1ff46049f 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -6330,7 +6330,9 @@ private: static bool isUnsupportedType(ASTContext &Context, QualType T) { if (!Context.getTargetInfo().hasFloat16Type() && T->isFloat16Type()) return true; - if (!Context.getTargetInfo().hasFloat128Type() && T->isFloat128Type()) + if (!Context.getTargetInfo().hasFloat128Type() && + (T->isFloat128Type() || + (T->isRealFloatingType() && Context.getTypeSize(T) == 128))) return true; if (!Context.getTargetInfo().hasInt128Type() && T->isIntegerType() && Context.getTypeSize(T) > 64) diff --git a/test/OpenMP/nvptx_unsupported_type_codegen.cpp b/test/OpenMP/nvptx_unsupported_type_codegen.cpp index 167496cb84..2573daaa41 100644 --- a/test/OpenMP/nvptx_unsupported_type_codegen.cpp +++ b/test/OpenMP/nvptx_unsupported_type_codegen.cpp @@ -1,6 +1,8 @@ // Test target codegen - host bc file has to be created first. // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-host.bc -// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -aux-triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -o - | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -aux-triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -o - | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-linux-gnu -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-host.bc +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-linux-gnu -fopenmp-targets=nvptx64-nvidia-cuda -aux-triple x86_64-unknown-linux -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -o - | FileCheck %s // expected-no-diagnostics // CHECK-DAG: [[T:%.+]] = type {{.+}}, fp128, @@ -8,7 +10,11 @@ struct T { char a; +#ifndef _ARCH_PPC __float128 f; +#else + long double f; +#endif char c; T() : a(12), f(15) {} T &operator+(T &b) { f += b.a; return *this;}