alexander-shaposhnikov updated this revision to Diff 529801. alexander-shaposhnikov added a comment.
Add missing parentheses Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D152403/new/ https://reviews.llvm.org/D152403 Files: clang/lib/Sema/SemaType.cpp clang/test/SemaCUDA/neon-attrs.cu Index: clang/test/SemaCUDA/neon-attrs.cu =================================================================== --- /dev/null +++ clang/test/SemaCUDA/neon-attrs.cu @@ -0,0 +1,21 @@ +// CPU-side compilation on ARM with neon enabled (no errors expected). +// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature +neon -aux-triple nvptx64 -x cuda -fsyntax-only -verify=quiet %s + +// CPU-side compilation on ARM with neon disabled. +// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature -neon -aux-triple nvptx64 -x cuda -fsyntax-only -verify %s + +// GPU-side compilation on ARM (no errors expected). +// RUN: %clang_cc1 -triple nvptx64 -aux-triple arm64-linux-gnu -fcuda-is-device -x cuda -fsyntax-only -verify=quiet %s + +// Regular C++ compilation on ARM with neon enabled (no errors expected). +// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature +neon -x c++ -fsyntax-only -verify=quiet %s + +// Regular C++ compilation on ARM with neon disabled. +// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature -neon -x c++ -fsyntax-only -verify %s + +// quiet-no-diagnostics +typedef __attribute__((neon_vector_type(4))) float float32x4_t; +// expected-error@-1 {{'neon_vector_type' attribute is not supported on targets missing 'neon' or 'mve'}} +typedef unsigned char poly8_t; +typedef __attribute__((neon_polyvector_type(8))) poly8_t poly8x8_t; +// expected-error@-1 {{'neon_polyvector_type' attribute is not supported on targets missing 'neon' or 'mve'}} Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -8161,10 +8161,18 @@ /// match one of the standard Neon vector types. static void HandleNeonVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S, VectorType::VectorKind VecKind) { + bool IsTargetCUDAAndHostARM = false; + if (S.getLangOpts().CUDAIsDevice) { + const TargetInfo *AuxTI = S.getASTContext().getAuxTargetInfo(); + IsTargetCUDAAndHostARM = + AuxTI && (AuxTI->getTriple().isAArch64() || AuxTI->getTriple().isARM()); + } + // Target must have NEON (or MVE, whose vectors are similar enough // not to need a separate attribute) - if (!S.Context.getTargetInfo().hasFeature("neon") && - !S.Context.getTargetInfo().hasFeature("mve")) { + if (!(S.Context.getTargetInfo().hasFeature("neon") || + S.Context.getTargetInfo().hasFeature("mve") || + IsTargetCUDAAndHostARM)) { S.Diag(Attr.getLoc(), diag::err_attribute_unsupported) << Attr << "'neon' or 'mve'"; Attr.setInvalid(); @@ -8172,8 +8180,8 @@ } // Check the attribute arguments. if (Attr.getNumArgs() != 1) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << Attr - << 1; + S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) + << Attr << 1; Attr.setInvalid(); return; } @@ -8183,7 +8191,8 @@ return; // Only certain element types are supported for Neon vectors. - if (!isPermittedNeonBaseType(CurType, VecKind, S)) { + if (!isPermittedNeonBaseType(CurType, VecKind, S) && + !IsTargetCUDAAndHostARM) { S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType; Attr.setInvalid(); return;
Index: clang/test/SemaCUDA/neon-attrs.cu =================================================================== --- /dev/null +++ clang/test/SemaCUDA/neon-attrs.cu @@ -0,0 +1,21 @@ +// CPU-side compilation on ARM with neon enabled (no errors expected). +// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature +neon -aux-triple nvptx64 -x cuda -fsyntax-only -verify=quiet %s + +// CPU-side compilation on ARM with neon disabled. +// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature -neon -aux-triple nvptx64 -x cuda -fsyntax-only -verify %s + +// GPU-side compilation on ARM (no errors expected). +// RUN: %clang_cc1 -triple nvptx64 -aux-triple arm64-linux-gnu -fcuda-is-device -x cuda -fsyntax-only -verify=quiet %s + +// Regular C++ compilation on ARM with neon enabled (no errors expected). +// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature +neon -x c++ -fsyntax-only -verify=quiet %s + +// Regular C++ compilation on ARM with neon disabled. +// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature -neon -x c++ -fsyntax-only -verify %s + +// quiet-no-diagnostics +typedef __attribute__((neon_vector_type(4))) float float32x4_t; +// expected-error@-1 {{'neon_vector_type' attribute is not supported on targets missing 'neon' or 'mve'}} +typedef unsigned char poly8_t; +typedef __attribute__((neon_polyvector_type(8))) poly8_t poly8x8_t; +// expected-error@-1 {{'neon_polyvector_type' attribute is not supported on targets missing 'neon' or 'mve'}} Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -8161,10 +8161,18 @@ /// match one of the standard Neon vector types. static void HandleNeonVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S, VectorType::VectorKind VecKind) { + bool IsTargetCUDAAndHostARM = false; + if (S.getLangOpts().CUDAIsDevice) { + const TargetInfo *AuxTI = S.getASTContext().getAuxTargetInfo(); + IsTargetCUDAAndHostARM = + AuxTI && (AuxTI->getTriple().isAArch64() || AuxTI->getTriple().isARM()); + } + // Target must have NEON (or MVE, whose vectors are similar enough // not to need a separate attribute) - if (!S.Context.getTargetInfo().hasFeature("neon") && - !S.Context.getTargetInfo().hasFeature("mve")) { + if (!(S.Context.getTargetInfo().hasFeature("neon") || + S.Context.getTargetInfo().hasFeature("mve") || + IsTargetCUDAAndHostARM)) { S.Diag(Attr.getLoc(), diag::err_attribute_unsupported) << Attr << "'neon' or 'mve'"; Attr.setInvalid(); @@ -8172,8 +8180,8 @@ } // Check the attribute arguments. if (Attr.getNumArgs() != 1) { - S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << Attr - << 1; + S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) + << Attr << 1; Attr.setInvalid(); return; } @@ -8183,7 +8191,8 @@ return; // Only certain element types are supported for Neon vectors. - if (!isPermittedNeonBaseType(CurType, VecKind, S)) { + if (!isPermittedNeonBaseType(CurType, VecKind, S) && + !IsTargetCUDAAndHostARM) { S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType; Attr.setInvalid(); return;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits