================
@@ -3083,6 +3083,19 @@ ScalarExprEmitter::VisitUnaryExprOrTypeTraitExpr(
                 E->getTypeOfArgument()->getPointeeType()))
             .getQuantity();
     return llvm::ConstantInt::get(CGF.SizeTy, Alignment);
+  } else if (E->getKind() == UETT_VectorElements) {
+    // For scalable vectors, we don't know the size at compile time. We can use
+    // @llvm.vscale to calculate it at runtime.
+    if (E->getTypeOfArgument()->isSizelessVectorType()) {
+      auto *VecTy = dyn_cast<llvm::ScalableVectorType>(
+          ConvertType(E->getTypeOfArgument()));
+      uint64_t NumUnscaledElements = VecTy->getMinNumElements();
----------------
lawben wrote:

the argument here is the vector type that was passed to 
`__builtin_vectorelements()`. the call to `@llvm.vscale` is independent of the 
type, as it is a system-wide thing, so it does not need the type. 

scalable vectors are represented as `<vscale x NUM_ELEMENTS_PER_MINIMUM_VECTOR 
x TYPE>`. so if we get `vscale`, we still need to figure out the `NUM_ELEMENTS` 
part so we can get the actual number of elements on this system by multiplying 
it with. as that depends on the vector type passed to the builtin, as the 
number of elements depends on the element's type. for SVE, LLVM assumes a 
minimum 16-byte vector, so a `<vscale x 4 x i32`> has `4 * vscale` but a 
`<vscale x 8 x i16>` has `8 * vscale`. 

I hope this clarifies the code. if so, I'll probably add a comment to explain.

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

Reply via email to