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

    <tr>
        <th>Summary</th>
        <td>
            [X86] Incorrect union parameter value during function calls
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            miscompilation,
            ABI
      </td>
    </tr>

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

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

<pre>
    ## 1. Problem
clang does not seem to be correctly passing union parameters in X86 backend.

## 2. How to reproduce
test.c
```c++
#include <stdbool.h>
#include <stdio.h>

typedef union{struct{float v0;double v1;}v0;struct{double v0;double v1;}v1;}t0;
typedef float t1;
typedef union{signed short v0[4];}t2;
typedef struct{unsigned int v0;union{bool v0;}v1;}t3;
typedef union{double v0[5];bool v1[16];}t4;

void __attribute__((noinline)) func(t0 v0, t1 v1, t2 v2, t3 v3, t4 v4)
{
        printf("%.2f\n", v0.v1.v0);
        printf("%llx\n", (unsigned long long)v0.v1.v0);
        return;
}

int main()
{
        t0 v0;
        t1 v1;
        t2 v2;
        t3 v3;
        t4 v4;
        v0.v1.v0 = 1326003572768462080.0;
        v0.v1.v1 = -9216063831952089088.0;
        v1 = -9222032222277231616.0f;
        v2.v0[0] = 32753;
        v2.v0[1] = -32714;
        v2.v0[2] = 23982;
        v2.v0[3] = -31049;
        v3.v0 = 4294967295U;
        v3.v1.v0 = 0;
        v4.v1[0] = 0;
        v4.v1[1] = 1;
        v4.v1[2] = 1;
        v4.v1[3] = 1;
        v4.v1[4] = 0;
        v4.v1[5] = 1;
        v4.v1[6] = 1;
        v4.v1[7] = 1;
        v4.v1[8] = 0;
        v4.v1[9] = 1;
        v4.v1[10] = 1;
        v4.v1[11] = 0;
        v4.v1[12] = 0;
        v4.v1[13] = 0;
        v4.v1[14] = 1;
        v4.v1[15] = 0;
        printf("%.2f\n", v0.v1.v0);
        printf("%llx\n", (unsigned long long)v0.v1.v0);
        func(v0, v1, v2, v3, v4);
}
```
clang test -o test
./test
```
1326003572768462080.00
1266e93955c35500
0.00
0
```

expect result:
```
1326003572768462080.00
1266e93955c35500
1326003572768462080.00
1266e93955c35500
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVsGO66gS_RqyQW1BYWyzyKLTedG7u9mMdHctG5OEGQKRwZ7bfz_CxIk77bY00kgTRTauU3VOUaCC2nt9skptEd8hvt_UfTi7bmu09drWlgrBN41rP7YIGAKGaYZ_61xj1AWRPSKv0tT2hFunPLYuYK_UBQeHG4Wl6zolg_nA1yhiT7i32ll8rbv6ooLqPNYW_6wK3NTyT2XbLDHenkkOMvx_91dk7NS1c20vVcKD8iGTN9-CpL9EsIv_iUFbafpWYcTefGgb50x2Rux_3-DazdGk8nFVrTqmzFG586HrZUDl7mhcHfBAENu1rm-MwgNFbIfK_Wi7-03gkuPtHSL2WS6xB_oFuOcR16zF_uy6MQu-yxHf3_jgS9g9nd7eIrW9ZT8xxuIkyzw19m0Gj4nxHU_aiYIivqPFI5v8TpGeg9Mtfn-vQ-h00wf1_o6gQlBZp63RViEQCAQ-9lYiqAKJEvCGA43UcQB4gHHA8MDGQY6HPIYllfIuJ66dtuE48gMCnsER8Tc7frzhgWQDzSK7mKX4HGPMr1kMgupeQuPsaXwgEN9wdSr0nX1Yyv28EnENLrW2o9ZC9mnuM7pUg7lhrMXcMNZkbhhrMzNMmWLE9pgyKAhhvISyqPICSEUysuBNR-8XAbQgBasYFRxIJUhVPbnfHQEIg_grS2C0oEVGjp88IRu3DkF8P8YwKDlb8qCTxwuDkuZLLjC5ABMVLHmwBwkl-ac1GthUjRxELooSBP_92eFesc_TzbNxu98nsYjeJ0CXUFhF2Sqar-ry1dhiFS1X0WpVV6zGUrIO0_VawjrM1uF8XZsvRv_XTeTWCVMbTD0wNcDU_VLr-9pipjNxfkzHQxO_uPGd7BmCw-PrKWixPUwYFIUSTHAuGeeT9YGTRcb0VL-uSgbcKd-bgNjrvyT-zyOeJDftlrWCiXqjtrQkggrKC745b2XOoIFjUQBrlGQFzY-tkIpQSdq8JfVGb4FATgAEKaEgPJNVqVSVc0XhWJdNhXKiLrU2mTHDJXPdaaO979W2YqyqNqZulPHjFQzgdhtC7PVnVaQtgwAu2kt3uWpTh3gAT-bX3Y845vtNt43UL01_8ignRvvgH2JBBzNe8SIl3-Mf9nY7e76T4aE2vcJt38ULW9x6UQ7L2hi_6TuzPYdw9XHN4IDgcNLh3DeZdBcEh6h2e71cO_eHkgHBYZynR3AYp_p3AAAA__9gFa7d">