[clang] [clang] Implement constexpr bit_cast for vectors (PR #66894)

via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 22 03:52:36 PDT 2023


================
@@ -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());
----------------
DaMatrix wrote:

I've come to the same conclusion as you that I don't think this is possible with non-byte-sized vectors. Since this is only an issue for OpenCL bool vectors, should I just have it fail with an unsupported exception when the number of bool elements isn't a multiple of the char size?

https://github.com/llvm/llvm-project/pull/66894


More information about the cfe-commits mailing list