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

Reply via email to