================
@@ -7095,6 +7096,40 @@ class APValueToBufferConverter {
     return true;
   }
 
+  bool visitVector(const APValue &Val, QualType Ty, CharUnits Offset) {
+    const auto *VT = Ty->castAs<VectorType>();
+    unsigned VectorLength = Val.getVectorLength();
+
+    if (VT->isExtVectorBoolType()) {
+      // Special handling for OpenCL bool vectors: we need to pack the vector
+      // of 1-bit unsigned integers into a single integer with the 
corresponding
+      // bits set, then write out the resulting integer.
+
+      CharUnits VecWidthBits = Info.Ctx.getTypeSizeInChars(VT) * 8;
+
+      APSInt Bits(VecWidthBits.getQuantity());
+      for (unsigned I = 0; I != VectorLength; ++I) {
+        const APValue &SubObj = Val.getVectorElt(I);
+        assert(SubObj.isInt() && "Bool vector element isn't an int?");
+        Bits.setBitVal(I, !SubObj.getInt().isZero());
----------------
zygoloid wrote:

Hm, it concerns me that the documentation says: "When <N*M> isn’t evenly 
divisible by the byte size the exact memory layout is unspecified (just like it 
is for an integral type of the same size). This is because different targets 
could put the padding at different positions when the type size is smaller than 
the type’s store size."

Can we reliably constant-evaluate a `bit_cast` from a vector of a number of 
bits that's not a multiple of the byte size?

https://github.com/llvm/llvm-project/pull/66894
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to