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

    <tr>
        <th>Summary</th>
        <td>
            LLVM 19.1.6 [[clang::preserve_most]] targeting x86-32 can clobbers result register
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          Nick-Kooij
      </td>
    </tr>
</table>

<pre>
    Consider the following function, attributed with `[[clang::preserve_most]]`:

````
extern void bar( int* );

[[clang::preserve_most]] [[clang::noinline]] int foo( int x ) {
 bar( &x );
    return x * x;
}
````

When targeting x86-32, this emits the following incorrect code, which saves and restores the result register (EAX) breaking the return value:

````
<int foo(int)>:
        push    edx
                push    ecx
                push    eax ; RESULT REGISTER SAVED
                push    edi
                push    esi
        push    edx
                push    ecx
        push    ebp
                push    edi
                push    esi
        push    ebp
                push    esp
                push    ebx
        lea     eax, [esp + 0x38]
                push    eax
        call     <L0>
                IMAGE_REL_I386_REL32    ?bar@@YAXPAH@Z
<L0>:
        add     esp, 0x4
                mov     eax, dword ptr [esp + 0x38]
        imul    eax, eax
                pop     ebx
        pop     esp
                pop     ebp
                pop     esi
        pop     edi
                pop     ebp
                pop     ecx
        pop     edx
                pop     esi
                pop     edi
        pop     eax ; RESULT CLOBBERED
                pop     ecx
        pop     edx
                ret
````

The following attached project, should print "64" and exit.  x86-32 builds instead print the arbitrary value of whatever was in the EAX register when bar was called.

*Note:* I'm using LLVM through clang-cl under Visual Studio, bug I suspect the issue is more fundamental than the compiler driver.

## Steps to reproduce:
* Obtained [LLVM-19.1.6-win64.exe](https://github.com/llvm/llvm-project/releases/download/llvmorg-19.1.6/LLVM-19.1.6-win64.exe) from the official Assets.
* Install on **Windows 11** with **Visual Studio 2022 17.12.3**
* Must build a *x86-32* target
  * x64 targets link and run properly
* [PreserveMostBug.zip](https://github.com/user-attachments/files/18391006/PreserveMostBug.zip)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVttu2zgTfhr6ZhCDomTZuvCFnNj9gz9pi6TbdvemoMSxxZYmBR5sd59-QUmuc3LaLjYQYokznMM3H2fInZMbjTgnkwWZXI148I2x87ey_nbxf2Pk11FlxPf5pdFOCrTgG4S1Ucrspd7AOujaS6MJuwTuvZVV8ChgL30DJKedzUWtuN6QtCRp2Vp0aHf4ZWucJ5Or-OQ0ymj35PT00BIPHq2GnZECKm4Jm4HUnrASCCtIuhg2_YITeKakjdRKahzkUntYGzO4gEP0AGQaXRxdE5YfTo4BACz6YHWnXMJhCGh69TwRQstPDWrw3G7QR-AOs_wiZRE230gHuJXePcFW6tpYi7WH2giMqvtG1g04vkMHXAuw6Lyx2G-06ILyYHEjnUcLhM2W5eeYRmWRf4sWe7Uu5h1XAc_hTtLLEx4d4gVJl702EFq0wTWEFigOAxAP_h6I69fF_AAkXcDd8v6Pmw9wt3xzff9heQf35cfl1asbhXxV7OS_CfPBQtX-p-5_Ys69Lq6O0SnkPWqRCWSyQNcCYQugh3QWSfw61IORmitFaAEkvbyhsaax_AWhxfVt-Wb55W558-U6neXxJWVRkq4i-zNKMvpn-fl9-T-S0b96ivQGfpCCCzGkwy6BHrIXA9qa3SkJsTdWQOvtmXQILeQ2qNOGIY_naZr2EVTD9zlkB-1Xpacq9t_niv4rtuoncZ3j40PP56TiSVyPD9HlzbvFYnl37vz8VjgW_YuN7MOjJsW953WDAlprvmLtY5lcY4KKK7GJEMbyjDDWNSw8SD-GoflBFaQSDqR2HvlRP_YobivpLbff-zYFZg37hnvcoYU9jzs6tWX5-dTu9rG_VrxXiDRHMR6aGyvfGt81O1bCNWHTLQQXg7-5-XgLvrEmbBroZsNFrSDoOOc-She4gnsfhDQxqyps4BpccG1sydG_dC7E_7A1FuMoFHyL2nMFvuF9iLXZtlKhBWHlDu2PiFLCUrj32DrwBiy21ohQHxsyK-Fd5bnUKOLRiGFeJMU4GecXe6nzbIyHbm6xWeN967rMVoStNtI3oRrXZkvYSqnd8efiR3FWFhVyh46wlTB7rQwXg5Kxm8EJYauXXbIC1tZsu8zMei1ryRWUzqF34yHua-08VwqMjkORsPKT1MLsHSRJ_z3cDbr3RxgDo4xBMh0nbJz28sHmbXC-JwvwuPM4O8thnnb07UZwng1LDpTU3_ohGXQkZ4tWfR8Mksni_XBHuDXOL8Jm_Ldsf4pocGgvesLHOkcM11J1WCaztEgojdC9ZJkVIzFPRZEWfITzZJrm04Rls3zUzBMhsnWdTUVV1ZRPaMYqMUuma5rNClEnxUjOGWUTmiSMUTqj-XhSIS94kiBHkU4mgmQUt1yqcazi2NjNqCPmPIknbzZSvELljtc7O-8IUYWNIxlV0nl32uelVzjvTkVf--fXppfuVk9vNVBzDbUyVYXWPb2XjIJV89-mbZdRB3Sf1G7O_gkAAP__k6UVnA">