<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58718>58718</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Miscompilation on i686 windows with opaque pointers + LTO
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
glandium
</td>
</tr>
</table>
<pre>
(For some reason, it doesn't happen outside LTO)
This function call: https://searchfox.org/mozilla-central/rev/2809416b216b498ec3d8b0e65c25a135f4f5f37d/js/src/frontend/Parser.cpp#537-538
(declaration in: https://searchfox.org/mozilla-central/rev/2809416b216b498ec3d8b0e65c25a135f4f5f37d/js/src/frontend/ErrorReporter.h#111-112)
ends up compiled as:
```
movl %edi, 4(%ebx)
movl %esi, (%ebx)
movl 12(%ebp), %ecx
movl %ecx, 8(%ebx)
movl $32, 12(%ebx)
movl %eax, 16(%ebx)
movl -56(%ebp), %eax
movl %eax, 20(%ebx)
pushl %ebx
calll 0x14f73040
```
(where `%ebx` has a copy of `%esp`)
The same code, compiled with opaque pointer disabled, is compiled as:
```
movl %edi, 4(%ebx)
movl %esi, (%ebx)
movl 12(%ebp), %ecx
movl %ecx, 8(%ebx)
movl $32, 12(%ebx)
movl %eax, 16(%ebx)
movl -56(%ebp), %eax
movl %eax, 20(%ebx)
calll 0x14faf0a0
```
Note the `push` is not there.
At the IR level, it looks like this (with opaque pointers):
```
%46 = alloca inalloca <{ ptr, %"class.mozilla::UniquePtr.84", i32, i32, ptr, ptr }>, align 4
%47 = load ptr, ptr %7, align 4
%48 = call noundef ptr @"?DeclarationKindString@frontend@js@@YAPBDW4DeclarationKind@12@@Z"(i8 noundef zeroext %2) #7
%49 = getelementptr inbounds <{ ptr, %"class.mozilla::UniquePtr.84", i32, i32, ptr, ptr }>, ptr %46, i32 0, i32 1
store ptr %25, ptr %49, align 4
store ptr %0, ptr %46, align 4
%50 = getelementptr inbounds <{ ptr, %"class.mozilla::UniquePtr.84", i32, i32, ptr, ptr }>, ptr %46, i32 0, i32 2
store i32 %3, ptr %50, align 4
%51 = getelementptr inbounds <{ ptr, %"class.mozilla::UniquePtr.84", i32, i32, ptr, ptr }>, ptr %46, i32 0, i32 3
store i32 32, ptr %51, align 4
%52 = getelementptr inbounds <{ ptr, %"class.mozilla::UniquePtr.84", i32, i32, ptr, ptr }>, ptr %46, i32 0, i32 4
store ptr %48, ptr %52, align 4
%53 = getelementptr inbounds <{ ptr, %"class.mozilla::UniquePtr.84", i32, i32, ptr, ptr }>, ptr %46, i32 0, i32 5
store ptr %47, ptr %53, align 4
call void (ptr, ...) @"?errorWithNotesAt@ErrorReportMixin@frontend@js@@QBAXV?$UniquePtr@VJSErrorNotes@@U?$DeletePolicy@VJSErrorNotes@@@JS@@@mozilla@@IIZZ"(ptr nonnull inalloca(<{ ptr, %"class.mozilla::UniquePtr.84", i32, i32, ptr, ptr }>) %46)
```
For some reason, after `GlobalOptPass`, the call is transformed to:
```
call void (ptr, ...) @"?errorWithNotesAt@ErrorReportMixin@frontend@js@@QBAXV?$UniquePtr@VJSErrorNotes@@U?$DeletePolicy@VJSErrorNotes@@@JS@@@mozilla@@IIZZ"(ptr nonnull %46)
```
(it lost the `inalloca`)
and it's when starting to lower to assembly that the push is inserted, presumably because it now thinks it's calling the function as if `%46` was the first argument and the vararg was empty.
The reason it requires LTO is probably that LTO brings in the full declaration of `errorWithNotesAt` and that has an effect on the `Function` the passes see.
Cc: @nikic
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztV0tz2zYQ_jXUBWMNCb4POshW3EnatG6ebW4gCUpIIIABQMvOr-8uSMlSReXUTD2demQSBHYX37cLLBaVbh4XAS1utSFWbzkxnFmtAnpDhCON5hbauSMb1nVcEd07KxpOfnn3W0DLIFwF4fLdRljS9qp2QitSMymDeEk2znUWGgG9hZ_lzNSbVj_MtVnD91Z_E1Kyq5orZ5iEHsPv4UmLsEyirKLwn5QFr-OmqEKepTVNWRSnbdKmbZw3IPrZol1Tw7M1WjmusPeOGcvNvO66gMZpnF-lcTHABJINryUzzOMU6l9E-cIYbd7wThsHYDcANYqiqyiiB6eCnCV9R2q97YTkDWEe5sAkC8ef_9zqe0ngL6ApbwRGLgGu-FU9HOwdC1kvdFkGYQxjHY552ZTXD-eWoA9Gi-9Nl8QUZZ5sTmNi3lKUXZa6SrMpWGwC1mCMhufGut5u5ChVjZq4YrEvfIiSNo_DJJx0MxjbbbjhBHsG9SyEfWEJgyh1j0S3-yHb-cZhf3BiGWytWjccgR1iuhNuQ3THvvacdFrA6jCkEZZVMOh3oP0__v9s_E9izdqQTcf6V-04cRsfa1wyGGkIhtIOew2fj1r-ufSd5OUbIvk9l2PqlFp_sUSKL2gIdHH5nIfbIrILcUUqSUaCeEUAta4Z5KyxEcQ3QX5NOmdGNwSUQmqzdj6mLLQZL98rAXPdOTMvYEn4OIj4-DUagBcJ8lUQv8AvJsVawRoaQHgUuUchNWtOVGiaX1AovAJ6G5zWq4a3gwbsLcAR366eMvHPQjVvnRFqDaOHHJmEkDlBOgn_XN5drz4mf9OAAVhSXuCTp1aI4jDVN240f3CIBDMqvOP8GF3p0a2545JvIbcjNKEq1LY_1rej25JsFCThvhHtAVqnIcmMgjj7k1Y54e0T8fBsjvPYpOEzZE9P6WAXCMZHSgO3CTrRM6QTn9M52BlAXyBDnyGZ6aWWFMd86AU-8TPkk07zyY_5xBN8fDa716LBXD7OOZ_PfYLZ5zWOhd1HyPN4gtilg4GjWu-1eICyczLL_X69_OMDGIAD88AXuj-8euv1vblB8v0gtQKPOn6npagfpwXh9-rtobl3qf94-fLTmDWRsNJK9cBtf7zgsfnjQlPuw1JOnnoTFxHWYmEEEj9JXTH5W-fuAIkvsW780esjA2csFOnKttpsoV5y-uK5-t-P5Hc9jGcl1ifW7UucQ-CPqlamGihj4O5nCZS9CjYLMw4OaXAs6O4gINCAMPBtJR_BEBusYbWEoRAKrmFuKGM7w22_ZShX8Zr1lmOBpPQOKyMFVdI4D4bFzwB2DvdJqK_FvrAGTlCI7aDLiwgDFJhZ95hZCALG7nuoEszaS_Ft5x5PajWsxYeFhRAM_9oLAIfXWQTdGVhfBzrYWWFdgmxGUODb40vkUPKfLRUAOaBhbrggKMLblteOaLX3-e1IEIW949CXllh-Wlze1HhNhUAr8UXUZMYXUZbltCiKOJk1i7gp45LNnHCSL14LO1wXRnDAMSsyuGWoRu_s1G0Dy9JrJDrrjVycXobXIN5Xc7AIH1Le719X4KXPwAU-hbU9xwtuWuRRMdssOM3CMszDsq2qnEZxVGdZQcuyruM2KwCoZBWXdhGk17BoFd8RbwIXcLqaiQUNKY2iMArzJI-SedWELKk5z9qQtpQm4Aa-ZULOEQfe0Wdm4SFV_Rq3ihTW2adB8CgkcM79dGCf9W6jzWItITii38783AuP_S88nurj">