<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/185744>185744</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Functions returning non-trivially-copyable C++ types miscompile for GPU (HIP etc.)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AMDGPU,
clang:codegen
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
efriedma-quic
</td>
</tr>
</table>
<pre>
See https://github.com/llvm/llvm-project/pull/185091#discussion_r2897983863 for original context (this comment is adapted from there).
The regression test clang/test/CodeGenHIP/sret-nontrivial-copyable.hip is currently getting miscompiled. The CHECK lines don't show it (_ZN7WrapperC2Ev is the actual relevant constructor), but there's a problem.
The signature of make() looks like this:
```
declare void @_Z4makev(ptr addrspace(5) dead_on_unwind writable sret(%struct.NontrivialPtr) align 8)
```
The signature of the constructor is this:
```
define dso_local void @_ZN7WrapperC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %this) unnamed_addr #0 align 2
```
The constructor is expected to construct the result of make() in-place. This is a problem because copying NontrivialPtr requires calling the copy constructor. C++ rules do not allow calling a copy constructor here (and some types might not have a copy constructor at all).
Ultimately, I think we need to change the signature of make(): the pointer needs to be an addrspace(0) pointer. See `ItaniumCXXABI::classifyReturnType`. See also https://github.com/llvm/llvm-project/commit/39ec9de7c23063b87f5c56f4e80c8d0f8b511a4b.
CC @VigneshwarJ @AlexVlx @arsenm
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVc1u2zgXfRp6cxGBoiRLWmjhuHWb78MUwUzbKboxKPJK4oQiVf448dsPqDhp2kkXBQyYFHV_zrlHh9x7NRrEjlTXpHqz4TFM1nU4OIVy5lffohKb3spz9xciTCEsnhQ7wg6EHUYVpthnws6EHbQ-Pf1dLc7-gyIQdlii1oQd8qaibU5YIZUX0XtlzdGxpq3bpmi2BQzWgXVqVIZrENYEfAhAWBMm5UHYeUYTQHngki8BJQzOzhAmdEhYmxG6I3T3cUJwODpc00NAH0BobkbCDmlD2GFvJb5D8_7mlrCDdxiujDXBqZPi-krY5cx7jdmkllRLROfQBH2GEUNQZoRZeWHnRWmUGUCqt3__dv9_0MqgB2kNYXUAP9l7UGv7x68f6r8dXxZ0e_b2lLKGCYGLELkGhxpP3IQE2AcXRbCOsJawPfQxPMGrPXBYnO01zi-QpqnxEB2CHWDmd0hYQ1gL2to7D1rdISTy0qzWGLKllx_dSRSaO4STVRJISY9fy5ThRFizBAdcSucXLlLKKuWUyOXRmmM098pIuHcqJKIgMbiWrR7bzz48s3kbEhTgWo0GUmM_tfAaikTNCyoe2folhEEZBOntUVvB9QssP1B-gWRsNBIHMNaYqPVTXyDR4YAOjcCEiLAm36a-CavW0qyFaAyfUR4TK0BYQS_B7HVEPwHAhwVFUmyw349WpA591OGn6SlztWguMIOPSfnqxeyhR8GjTxWWc1LjD2SDw29ROfQguNbp-JHN5fyyowz2hF0Tdg0u6lWyYGwArrW9fw7k_wmDpMSkZ24keDsjhPOCHmY1TmHNMPETvhbI1-Tfv9FPOqiZB9TnpPKbNF9zB_cIBi8cTdyMuDb_C4WTYrceL1aZgG6N9Cm0R-DmB_HSROnlvQySf5EtvQncqDjvv3zZXd8kbRU7oZMLDuc_MURnPp4XJFv6GMC1t7_vesmxVFoULYpWYi1YQbdF39RDJartUGJDRSPp0PRVnvOyv9Cz3ycJf06G7Kd77v6XtjuND5_1Q1py59HMG9kVsi1avsEur-sir4uaVpupK_qBlf3QCipqLPK255TmDFHwRrKyphvVMcq2tMgpo3lFy6wfBt6UVVmxLWWM9aSkOHOlswQos27cKO8jdnlT1WW50bxH7dergrGeizs0khS73R9v3t1-IowRtieMPZpusRNW4ogmPa_ebFy3ktTH0ZOSauWD_14lqKCxO0QjgrLGg1snkdRorLm6yFyfnz36WcdPQnwy5vUmeXf7Kan1_c0tYBAZYe0mOt399hhX7P7x-krwTx37NwAA___1Q1-6">