[PATCH] D91262: [AArch64][SVE] Allow C-style casts between fixed-size and scalable vectors

Cullen Rhodes via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 13 10:38:56 PST 2020


c-rhodes added inline comments.


================
Comment at: clang/lib/Sema/SemaCast.cpp:2217-2218
 
-  // Allow reinterpret_casts between vectors of the same size and
-  // between vectors and integers of the same size.
   bool destIsVector = DestType->isVectorType();
----------------
nit: not sure we need to change this


================
Comment at: clang/lib/Sema/SemaCast.cpp:2763-2767
+  if (SrcType->isVectorType() || DestType->isVectorType())
+    if (Self.isValidSveBitcast(SrcType, DestType)) {
+      Kind = CK_BitCast;
+      return;
+    }
----------------
I think braces are recommended on the outer if as well, see: https://llvm.org/docs/CodingStandards.html#don-t-use-braces-on-simple-single-statement-bodies-of-if-else-loop-statements

Although I suppose it could also be written as:

```
if ((SrcType->isVectorType() || DestType->isVectorType()) &&
    Self.isValidSveBitcast(SrcType, DestType)) {
  Kind = CK_BitCast;
  return;
}```


================
Comment at: clang/lib/Sema/SemaCast.cpp:2222-2227
+    // Allow bitcasting if either the source or destination is a scalable
+    // vector.
+    if (SrcType->isSizelessBuiltinType() || DestType->isSizelessBuiltinType()) {
+      Kind = CK_BitCast;
+      return TC_Success;
+    }
----------------
joechrisellis wrote:
> c-rhodes wrote:
> > This is a bit ambiguous, it'll allow bitcasting between things like a fixed predicate and any sizeless type which I don't think makes sense. I think it'll also allow bitcasting between any scalable and GNU vectors regardless of vector length, e.g.:
> > 
> > ```
> > typedef int32_t int32x4_t __attribute__((vector_size(16)));
> > 
> > void foo() {
> > svint32_t s32;
> > int32x4_t g32;
> > g32 = (int32x4_t)s32;
> > s32 = (svint32_t)g32;
> > }
> > ```
> > 
> > the above should only work when `-msve-vector-bits=128` but will currently be allowed for any N.
> Ah, you're dead right. I think the next diff should fix this, but if there are any more inconsistencies/ambiguities I'll fix them too. :) 
> Ah, you're dead right. I think the next diff should fix this, but if there are any more inconsistencies/ambiguities I'll fix them too. :) 

I suppose it's outside of the scope of this ticket, but I think we'll still need to address support for explicit conversions between scalable vectors and GNU vectors like in the example I gave.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:7209-7210
+  auto ValidScalableConversion = [](QualType FirstType, QualType SecondType) {
+    if (!FirstType->getAs<BuiltinType>())
+      return false;
+
----------------
Missing a check for `isSizelessBuiltinType`


================
Comment at: clang/test/SemaCXX/aarch64-sve-explicit-casts-fixed-size.cpp:22-68
+#define TESTCASE(from, to) \
+    void from##_to_##to() {\
+        from a;            \
+        to b;              \
+                           \
+        b = (to) a;        \
+    }
----------------
nit: could simplify this a little further by wrapping the macro, e.g. (moving existing `TESTCASE` to `CAST`):
```#define TESTCASE(ty1, ty2) \
    CAST(ty1, ty2)         \
    CAST(ty2, ty1)```


================
Comment at: clang/test/SemaCXX/aarch64-sve-explicit-casts-fixed-size.cpp:24-25
+    void from##_to_##to() {\
+        from a;            \
+        to b;              \
+                           \
----------------
nit: can just pass these as args `void from##_to_##to(from a, to b) {\`


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D91262/new/

https://reviews.llvm.org/D91262



More information about the cfe-commits mailing list