Author: abataev Date: Tue Jun 18 11:39:26 2019 New Revision: 363717 URL: http://llvm.org/viewvc/llvm-project?rev=363717&view=rev Log: [OPENMP]Use host's long double when compiling the code for device.
The device code must use the same long double type as the host. Otherwise the code cannot be linked and executed properly. Patch adds only basic support and checks for supporting of the host long double double on the device. Modified: cfe/trunk/lib/AST/ASTContext.cpp cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/test/OpenMP/nvptx_unsupported_type_messages.cpp Modified: cfe/trunk/lib/AST/ASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=363717&r1=363716&r2=363717&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTContext.cpp (original) +++ cfe/trunk/lib/AST/ASTContext.cpp Tue Jun 18 11:39:26 2019 @@ -1915,8 +1915,15 @@ TypeInfo ASTContext::getTypeInfoImpl(con Align = Target->getDoubleAlign(); break; case BuiltinType::LongDouble: - Width = Target->getLongDoubleWidth(); - Align = Target->getLongDoubleAlign(); + if (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice && + (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() || + Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) { + Width = AuxTarget->getLongDoubleWidth(); + Align = AuxTarget->getLongDoubleAlign(); + } else { + Width = Target->getLongDoubleWidth(); + Align = Target->getLongDoubleAlign(); + } break; case BuiltinType::Float128: if (Target->hasFloat128Type() || !getLangOpts().OpenMP || Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=363717&r1=363716&r2=363717&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Tue Jun 18 11:39:26 2019 @@ -1576,7 +1576,9 @@ void Sema::checkOpenMPDeviceExpr(const E "OpenMP device compilation mode is expected."); QualType Ty = E->getType(); if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type()) || - (Ty->isFloat128Type() && !Context.getTargetInfo().hasFloat128Type()) || + ((Ty->isFloat128Type() || + (Ty->isRealFloatingType() && Context.getTypeSize(Ty) == 128)) && + !Context.getTargetInfo().hasFloat128Type()) || (Ty->isIntegerType() && Context.getTypeSize(Ty) == 128 && !Context.getTargetInfo().hasInt128Type())) targetDiag(E->getExprLoc(), diag::err_type_unsupported) Modified: cfe/trunk/test/OpenMP/nvptx_unsupported_type_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/nvptx_unsupported_type_messages.cpp?rev=363717&r1=363716&r2=363717&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/nvptx_unsupported_type_messages.cpp (original) +++ cfe/trunk/test/OpenMP/nvptx_unsupported_type_messages.cpp Tue Jun 18 11:39:26 2019 @@ -1,13 +1,24 @@ // Test target codegen - host bc file has to be created first. // RUN: %clang_cc1 -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 %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -fsyntax-only +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -fsyntax-only +// RUN: %clang_cc1 -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 %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -fsyntax-only 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;} // expected-error {{'__float128' is not supported on this target}} +#ifndef _ARCH_PPC +// expected-error@+4 {{'__float128' is not supported on this target}} +#else +// expected-error@+2 {{'long double' is not supported on this target}} +#endif + T &operator+(T &b) { f += b.a; return *this;} }; struct T1 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits