sdesmalen-arm wrote:

> This currently doesn't touch the __ARM_FEATURE_SVE_BITS define or the 
> arm_sve_vector_bits attribute

We actually need to be a bit more careful to guard against code that uses the 
`arm_sve_vector_bits` types in streaming[-compatible] contexts when the 
streaming and non-streaming vector lengths are not the same.

For example:
```
typedef svint32_t int32x16_t __attribute__((arm_sve_vector_bits(512)));

int32x16_t foo_512(int32x16_t a, int32x16_t b) __arm_streaming {
  return a + b;
}
```

Compiling this with `-msve-vector-bits=512 -msve-streaming-vector-bits=256`, 
Clang will create `foo_512` with `vscale_range(2, 2)`, and to extract the <16 x 
i32> value from the scalable function argument, it will generate:
```call <16 x i32> @llvm.vector.extract.v16i32.nxv4i32(<vscale x 4 x i32> 
%a.coerce, i64 0)```

This is effectively undefined if vscale is not >= 4.

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

Reply via email to