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

Reply via email to