| Issue |
176670
|
| Summary |
parameter of type libstdc++ std::experimental::simd of 4 x u64 is passed by implicit pointer in clang 21
|
| Labels |
clang
|
| Assignees |
|
| Reporter |
ImpleLee
|
The following code uses libstdc++ experimental simd. These parameters are supposed to be passed by simd registers.
All the code is available at https://godbolt.org/z/rq3GvWj4W .
```c++
#include <experimental/simd>
#include <cstdint>
namespace stdx = std::experimental;
template <class T, std::size_t N>
using simd_of = stdx::simd<T, stdx::simd_abi::deduce_t<T, N>>;
using simd_t = simd_of<std::uint64_t, 4>;
using vector_t [[gnu::vector_size(sizeof(std::uint64_t) * 4)]] = std::uint64_t;
auto f(simd_t x) { return x; }
auto g(vector_t x) { return x; }
using simd_32x4_t = simd_of<std::uint32_t, 4>;
auto f32(simd_32x4_t x) { return x; }
```
Both clang++ 20 and g++ 15 (the latest release) generates the following assembly at `-O3 -march=x86-64-v3` as desired.
```asm
f(std::experimental::parallelism_v2::simd<unsigned long, std::experimental::parallelism_v2::simd_abi::_VecBltnBtmsk<32>>):
retq
g(unsigned long vector[4]):
retq
f32(std::experimental::parallelism_v2::simd<unsigned int, std::experimental::parallelism_v2::simd_abi::_VecBltnBtmsk<16>>):
retq
```
But clang++ 21 (and the latest clang++ trunk) pass the `simd of 4 x u64` parameter by implicit pointer. Interestingly, the wrapped `4 x u64` and `simd of 4 x u32` are both passed by value.
```asm
f(std::experimental::parallelism_v2::simd<unsigned long, std::experimental::parallelism_v2::simd_abi::_VecBltnBtmsk<32>>):
push rbp
mov rbp, rsp
and rsp, -32
sub rsp, 32
mov rax, rdi
vmovaps ymm0, ymmword ptr [rbp + 16]
vmovaps ymmword ptr [rdi], ymm0
mov rsp, rbp
pop rbp
vzeroupper
ret
g(unsigned long vector[4]):
ret
f32(std::experimental::parallelism_v2::simd<unsigned int, std::experimental::parallelism_v2::simd_abi::_VecBltnBtmsk<16>>):
ret
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs