<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/56107>56107</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Wrong code generation for byval vectorcall HVA
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          jmaebe
      </td>
    </tr>
</table>

<pre>
    ```
#include <xmmintrin.h>

typedef union
{
  __m128 M128_F32;
  __m128d M128_F64;
} TM128;

typedef struct
{
  TM128 V1;
  TM128 V2;
  TM128 V3;
  TM128 V4;
} THVA;

__attribute__((vectorcall)) THVA HVATest(TM128 A1, TM128 A2, TM128 A3, THVA InputHVA, TM128 A4, int Op)
{
  return InputHVA;
}

TM128 a1;
TM128 a2;
TM128 a3;
THVA inputhva;
TM128 a4;
THVA res;

int main()
{
  inputhva.V1.M128_F32[0]=1.0;
  inputhva.V1.M128_F32[1]=2.0;
  inputhva.V1.M128_F32[2]=3.0;
  inputhva.V1.M128_F32[3]=4.0;
  res = HVATest(a1, a2, a3, inputhva, a4, 1);
  if (res.V1.M128_F32[0] != 1.0)
    return 1;
  if (res.V1.M128_F32[1] != 2.0)
    return 2;
  if (res.V1.M128_F32[2] != 3.0)
    return 3;
  if (res.V1.M128_F32[3] != 4.0)
    return 4;
  return 0;
}
```

Compiling this program with clang 14.0 on macOS with -O0 results in the program exiting with error code 1. The reason is that on the caller side, the `inputhva` global variable parameter gets copied on the stack, but not in the parameter area. Instead, it ends up as a temp in the caller frame, and a pointer to this temp is then passed as `InputHVA` parameter.

Next, on the callee side, the code generator assumes the parameter was in fact passed by value on the stack, and it copies the passed pointer and whatever comes after it on the stack into the result.

If you compile it with higher optimisation levels, it works fine because of constant propagation.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyNVUuPozgQ_jXkYg0yhqTTBw49nW3NHGb7sK3eY2SgAM8YjGyTdP79lg0hhGSlSIRAPb766uEiU8UpDTZ0vOguoC8Bi0Wby74AEsSvX00jWqtFG9ZB_Ndo4e_21EEBJelbodpR8fR9eCBkv28itiW_8LZ_i1kQLzTFqNokkyp42pEPJ71IrgIZq_vc3kTyLuQzmoUYRexWFN-KFgR-fL4s4u_33GIFst7Cfh8gPbY9QG6VzrmUAXvGy7sR_H2AsagfoF-igL2OYV7Y7Dn2z87lZ9v11oW8KBP3jDUn750DX6arwfa6vTjOyM9JD2D8UpVRwJaCS0U8IeFw6wNfmiXXZhrMokqOccNF6wt0S_uMG35G4TQU6-80WO-CeBeFdNaY_7GNBlv2iC0bbONHbOPBNrmyxQRx_HeznnLfTe77yOOhSWOtnMS3LXKpzwKWBB0R6k7WqIlcAJf6uV6ETP2NHoCJZjDsPgx7AIbNYOL7MPEDMPEMJrkPk1wV2IvonQFe7CN_f1VNJ6RoK2JrYUinVaV5Q47C1iSXHOURBiWqxSHM3_8ZFN_eqWtkL63BZqEnTI7wJaxD83agtdIkV7jyopB8oJkGbhALI9maWwfrnN2BB02MKMB124mQ5jQGG0oqqTIuyYFrwTOJ4TgGA4tOFSCJXHUCijOcsTz_44BwtZBW2Ynj5MSRR4hn3VjghR85S6AtDOk7wg3hxELTnd1GdqVz9iPZFmjRKTyZKLZqqNzg4fKCFiMZg3wQCslPKwXzmCiE8yb8DV_WIc_LAVfl8DWsoAXNcUEisOkbMIusjty3o-S5PTPITlgz2cNNaVwSmLQv3BnHe5zzcgZH7BEcwLXQReOlUwh7BeZWqvKvw0RcJfazJCfVO3ccMnCufi5qUdWIpDorGmG4xQ8dkRhImrEXR6X_GFKKFkgGOe8NJlAiDDaM4z7EYet45f3CVZHGxXP8zFdWWAnpv1rh-M3r5dBLLFp2OrgRmj4xbgetei3T2toO1y5-LN7wqpBhn4XIGV-kPJz_vmHU3-iMrwLLj4uava03EX1a1SnN1kkMWfScbcp1XuRbzmmUJCWUTyXfZnQleYbZpXicA8ZaOBIPgc94uFciZZQxuom2UUIpXYfrfFPGRV5mG8YihA4SCvgNkKHjESpdrXTqKWV9ZVAphbHmosRGiqoF8OEQn-MxUjr93XDIYOUjp575f5ADheg">