amyk updated this revision to Diff 359358. amyk added a comment. Update patch and touched base with Nemanja.
- Removed the scalar vector test files that we already test for. - Update CHECKs in LIT tests accordingly. - Remove unnecessary `Sema` parameter in added function. - Keep two test files for initialization of `vector bool` and `vector pixel` with and without parentheses. The test without parentheses are separated in its own file rather than unified in a single file so we can successfully compile the parenthesized version of the test when we have `faltivec-src-compat=mixed`. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106120/new/ https://reviews.llvm.org/D106120 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaCast.cpp clang/lib/Sema/SemaExpr.cpp clang/test/CodeGen/vector-bool-pixel-altivec-init-no-parentheses.c clang/test/CodeGen/vector-bool-pixel-altivec-init.c
Index: clang/test/CodeGen/vector-bool-pixel-altivec-init.c =================================================================== --- /dev/null +++ clang/test/CodeGen/vector-bool-pixel-altivec-init.c @@ -0,0 +1,92 @@ +// RUN: %clang_cc1 -target-feature +altivec -target-feature +vsx \ +// RUN: -faltivec-src-compat=mixed -triple powerpc-unknown-unknown -S \ +// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=MIXED +// RUN: %clang_cc1 -target-feature +altivec -target-feature +vsx \ +// RUN: -faltivec-src-compat=mixed -triple powerpc64le-unknown-unknown -S \ +// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=MIXED +// RUN: %clang_cc1 -target-feature +altivec -target-feature +vsx \ +// RUN: -faltivec-src-compat=xl -triple powerpc-unknown-unknown -S \ +// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=XL +// RUN: %clang_cc1 -target-feature +altivec -target-feature +vsx \ +// RUN: -faltivec-src-compat=xl -triple powerpc64le-unknown-unknown -S \ +// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=XL +// RUN: %clang -mcpu=pwr8 -faltivec-src-compat=mixed --target=powerpc-unknown-unknown \ +// RUN: -S -emit-llvm %s -o - | FileCheck %s --check-prefix=MIXED +// RUN: %clang -mcpu=pwr9 -faltivec-src-compat=mixed --target=powerpc-unknown-unknown \ +// RUN: -S -emit-llvm %s -o - | FileCheck %s --check-prefix=MIXED +// RUN: %clang -mcpu=pwr8 -faltivec-src-compat=xl --target=powerpc-unknown-unknown \ +// RUN: -S -emit-llvm %s -o - | FileCheck %s --check-prefix=XL +// RUN: %clang -mcpu=pwr9 -faltivec-src-compat=xl --target=powerpc-unknown-unknown \ +// RUN: -S -emit-llvm %s -o - | FileCheck %s --check-prefix=XL + +// Vector bool type +vector bool char vbi8_1; +vector bool char vbi8_2; + +vector bool short vbi16_1; +vector bool short vbi16_2; + +vector bool int vbi32_1; +vector bool int vbi32_2; + +vector bool long long vbi64_1; +vector bool long long vbi64_2; + +// Vector pixel type +vector pixel p1; + +//////////////////////////////////////////////////////////////////////////////// +void test_vector_bool_pixel_init() { + // vector bool char initialization + vbi8_1 = (vector bool char)('a'); + // MIXED: <i8 97, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0> + // XL: <i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97> + char c = 'c'; + vbi8_2 = (vector bool char)(c); + // MIXED: [[INS:%.*]] = insertelement <16 x i8> + // MIXED: store <16 x i8> [[INS:%.*]] + // XL: [[INS_ELT:%.*]] = insertelement <16 x i8> + // XL: [[SHUFF:%.*]] = shufflevector <16 x i8> [[INS_ELT]], <16 x i8> poison, <16 x i32> zeroinitializer + // XL: store <16 x i8> [[SHUFF]] + + // vector bool short initialization + vbi16_1 = (vector bool short)(5); + // MIXED: <i16 5, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> + // XL: <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5> + short si16 = 55; + vbi16_2 = (vector bool short)(si16); + // MIXED: [[INS:%.*]] = insertelement <8 x i16> + // MIXED: store <8 x i16> [[INS:%.*]] + // XL: [[INS_ELT:%.*]] = insertelement <8 x i16> + // XL: [[SHUFF:%.*]] = shufflevector <8 x i16> [[INS_ELT]], <8 x i16> poison, <8 x i32> zeroinitializer + // XL: store <8 x i16> [[SHUFF]] + + // vector bool int initialization + vbi32_1 = (vector bool int)(9); + // MIXED: <i32 9, i32 0, i32 0, i32 0> + // XL: <i32 9, i32 9, i32 9, i32 9> + int si32 = 99; + vbi32_2 = (vector bool int)(si32); + // MIXED: [[INS:%.*]] = insertelement <4 x i32> + // MIXED: store <4 x i32> [[INS:%.*]] + // XL: [[INS_ELT:%.*]] = insertelement <4 x i32> + // XL: [[SHUFF:%.*]] = shufflevector <4 x i32> [[INS_ELT]], <4 x i32> poison, <4 x i32> zeroinitializer + // XL: store <4 x i32> [[SHUFF]] + + // vector bool long long initialization + vbi64_1 = (vector bool long long)(13); + // MIXED: <i64 13, i64 0> + // XL: <i64 13, i64 13> + long long si64 = 1313; + vbi64_2 = (vector bool long long)(si64); + // MIXED: [[INS:%.*]] = insertelement <2 x i64> + // MIXED: store <2 x i64> [[INS:%.*]] + // XL: [[INS_ELT:%.*]] = insertelement <2 x i64> + // XL: [[SHUFF:%.*]] = shufflevector <2 x i64> [[INS_ELT]], <2 x i64> poison, <2 x i32> zeroinitializer + // XL: store <2 x i64> [[SHUFF]] + + // vector pixel initialization + p1 = (vector pixel)(1); + // MIXED: <i16 1, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> + // XL: <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> +} Index: clang/test/CodeGen/vector-bool-pixel-altivec-init-no-parentheses.c =================================================================== --- /dev/null +++ clang/test/CodeGen/vector-bool-pixel-altivec-init-no-parentheses.c @@ -0,0 +1,88 @@ +// RUN: not %clang_cc1 -target-feature +altivec -target-feature +vsx \ +// RUN: -faltivec-src-compat=mixed -triple powerpc-unknown-unknown -S \ +// RUN: -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=MIXED-ERR +// RUN: not %clang_cc1 -target-feature +altivec -target-feature +vsx \ +// RUN: -faltivec-src-compat=mixed -triple powerpc64le-unknown-unknown -S \ +// RUN: -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=MIXED-ERR +// RUN: %clang_cc1 -target-feature +altivec -target-feature +vsx \ +// RUN: -faltivec-src-compat=xl -triple powerpc-unknown-unknown -S \ +// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=XL +// RUN: %clang_cc1 -target-feature +altivec -target-feature +vsx \ +// RUN: -faltivec-src-compat=xl -triple powerpc64le-unknown-unknown -S \ +// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=XL +// RUN: not %clang -mcpu=pwr8 -faltivec-src-compat=mixed --target=powerpc-unknown-unknown \ +// RUN: -S -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=MIXED-ERR +// RUN: not %clang -mcpu=pwr9 -faltivec-src-compat=mixed --target=powerpc-unknown-unknown \ +// RUN: -S -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=MIXED-ERR +// RUN: %clang -mcpu=pwr8 -faltivec-src-compat=xl --target=powerpc-unknown-unknown \ +// RUN: -S -emit-llvm %s -o - | FileCheck %s --check-prefix=XL +// RUN: %clang -mcpu=pwr9 -faltivec-src-compat=xl --target=powerpc-unknown-unknown \ +// RUN: -S -emit-llvm %s -o - | FileCheck %s --check-prefix=XL + +// Vector bool type +vector bool char vbi8_1; +vector bool char vbi8_2; + +vector bool short vbi16_1; +vector bool short vbi16_2; + +vector bool int vbi32_1; +vector bool int vbi32_2; + +vector bool long long vbi64_1; +vector bool long long vbi64_2; + +// Vector pixel type +vector pixel p1; + +//////////////////////////////////////////////////////////////////////////////// +void test_vector_bool_pixel_init_no_parentheses() { + // vector bool char initialization + vbi8_1 = (vector bool char)'a'; + // MIXED-ERR: error: invalid conversion between vector type '__vector __bool unsigned char' + // XL: <i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97> + char c = 'c'; + vbi8_2 = (vector bool char)c; + // MIXED-ERR: error: invalid conversion between vector type '__vector __bool unsigned char' + // XL: [[INS_ELT:%.*]] = insertelement <16 x i8> + // XL: [[SHUFF:%.*]] = shufflevector <16 x i8> [[INS_ELT]], <16 x i8> poison, <16 x i32> zeroinitializer + // XL: store <16 x i8> [[SHUFF]] + + // vector bool short initialization + vbi16_1 = (vector bool short)5; + // MIXED-ERR: error: invalid conversion between vector type '__vector __bool unsigned short' + // XL: <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5> + short si16 = 55; + vbi16_2 = (vector bool short)si16; + // MIXED-ERR: error: invalid conversion between vector type '__vector __bool unsigned short' + // XL: [[INS_ELT:%.*]] = insertelement <8 x i16> + // XL: [[SHUFF:%.*]] = shufflevector <8 x i16> [[INS_ELT]], <8 x i16> poison, <8 x i32> zeroinitializer + // XL: store <8 x i16> [[SHUFF]] + + // vector bool int initialization + vbi32_1 = (vector bool int)9; + // MIXED-ERR: error: invalid conversion between vector type '__vector __bool unsigned int' + // XL: <i32 9, i32 9, i32 9, i32 9> + int si32 = 99; + vbi32_2 = (vector bool int)si32; + // MIXED-ERR: error: invalid conversion between vector type '__vector __bool unsigned int' + // XL: [[INS_ELT:%.*]] = insertelement <4 x i32> + // XL: [[SHUFF:%.*]] = shufflevector <4 x i32> [[INS_ELT]], <4 x i32> poison, <4 x i32> zeroinitializer + // XL: store <4 x i32> [[SHUFF]] + + // vector bool long long initialization + vbi64_1 = (vector bool long long)13; + // MIXED-ERR: error: invalid conversion between vector type '__vector __bool unsigned long long' + // XL: <i64 13, i64 13> + long long si64 = 1313; + vbi64_2 = (vector bool long long)si64; + // MIXED-ERR: error: invalid conversion between vector type '__vector __bool unsigned long long' + // XL: [[INS_ELT:%.*]] = insertelement <2 x i64> + // XL: [[SHUFF:%.*]] = shufflevector <2 x i64> [[INS_ELT]], <2 x i64> poison, <2 x i32> zeroinitializer + // XL: store <2 x i64> [[SHUFF]] + + // vector pixel initialization + p1 = (vector pixel)1; + // MIXED-ERR: error: invalid conversion between vector type '__vector __pixel ' + // XL: <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> +} Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -7742,7 +7742,7 @@ // initializers must be one or must match the size of the vector. // If a single value is specified in the initializer then it will be // replicated to all the components of the vector - if (VTy->getVectorKind() == VectorType::AltiVecVector) { + if (ShouldSplatAltivecScalarInCast(VTy)) { // The number of initializers must be one or must match the size of the // vector. If a single value is specified in the initializer then it will // be replicated to all the components of the vector Index: clang/lib/Sema/SemaCast.cpp =================================================================== --- clang/lib/Sema/SemaCast.cpp +++ clang/lib/Sema/SemaCast.cpp @@ -2624,6 +2624,19 @@ } } +bool Sema::ShouldSplatAltivecScalarInCast(const VectorType *VecTy) { + bool SrcCompatXL = this->getLangOpts().getAltivecSrcCompat() == + LangOptions::AltivecSrcCompatKind::XL; + VectorType::VectorKind VKind = VecTy->getVectorKind(); + + if ((VKind == VectorType::AltiVecVector) || + (SrcCompatXL && ((VKind == VectorType::AltiVecBool) || + (VKind == VectorType::AltiVecPixel)))) { + return true; + } + return false; +} + void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle, bool ListInitialization) { assert(Self.getLangOpts().CPlusPlus); @@ -2678,9 +2691,9 @@ // AltiVec vector initialization with a single literal. if (const VectorType *vecTy = DestType->getAs<VectorType>()) - if (vecTy->getVectorKind() == VectorType::AltiVecVector - && (SrcExpr.get()->getType()->isIntegerType() - || SrcExpr.get()->getType()->isFloatingType())) { + if (Self.ShouldSplatAltivecScalarInCast(vecTy) && + (SrcExpr.get()->getType()->isIntegerType() || + SrcExpr.get()->getType()->isFloatingType())) { Kind = CK_VectorSplat; SrcExpr = Self.prepareVectorSplat(DestType, SrcExpr.get()); return; @@ -2963,8 +2976,8 @@ } if (const VectorType *DestVecTy = DestType->getAs<VectorType>()) { - if (DestVecTy->getVectorKind() == VectorType::AltiVecVector && - (SrcType->isIntegerType() || SrcType->isFloatingType())) { + if (Self.ShouldSplatAltivecScalarInCast(DestVecTy) && + (SrcType->isIntegerType() || SrcType->isFloatingType())) { Kind = CK_VectorSplat; SrcExpr = Self.prepareVectorSplat(DestType, SrcExpr.get()); } else if (Self.CheckVectorCast(OpRange, DestType, SrcType, Kind)) { Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -6109,6 +6109,12 @@ void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, bool IsDereference, SourceRange Range); + // Checks if we have a valid AltiVec vector type, and splats the + // value into the vector accordingly. If a 'vector bool' or + // 'vector pixel' type is used with the -faltivec-src-compat=xl + // option, these types also splat the scalar value. + bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy); + /// ActOnCXXNamedCast - Parse /// {dynamic,static,reinterpret,const,addrspace}_cast's. ExprResult ActOnCXXNamedCast(SourceLocation OpLoc,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits