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

    <tr>
        <th>Summary</th>
        <td>
            [Arm Windows][JIT] Diverged behavior of Jitted code on Arm Windows (Surface Laptop 7)
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          Jason821-prog
      </td>
    </tr>
</table>

<pre>
    Hello

I'm running into an issue that could indicate a potential hidden bug in LLVM JIT on Arm Windows.

A little background about how I found this issue. I worked on a programming language a while ago, which is supported on x64 Win, x64 Linux and Mac (both x64 and Arm64). With the release of the new surface laptop, I made an attempt to port it to Arm Windows. It worked mostly fine except one failed unit test, which can be boiled down to the following problem. (To clarify, the same unit test with exactly the same source code won't fail on all other supported platforms).
I tried a few versions of LLVM, including 10.0.0, 12.0.0 and 17.0.1, none of them works as expected on Arm Windows, unfortunately.

Here is the IR produced by my own custom language.
```
; ModuleID = 'my cool jit'
source_filename = "my cool jit"

@a = internal constant [8 x float] [float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00]

declare float @access_global_array(ptr)

define float @my_proxy_function() {
entry:
  %0 = load float, ptr getelementptr (float, ptr @a, i32 5), align 4
  ret float %0
}
```

As simple as it is, this does nothing fancy but declaring a global variable (float array of 8) and access one of them in a function call. However, this will return an incorrect value, unfortunately. It returns 1, rather than 5.

So I spend some time mess around with the IR code and found out that if I call an externally defined function (defined in c) in my LLVM produced code, it works as expected by returning 5. Here is the new IR with the externally defined function.
Below are the newly produced LLVM IR. FYI, the externally defined function is an empty function that does nothing but return a value. which is not even caught by the produced code.
```
; ModuleID = 'my cool jit'
source_filename = "my cool jit"

@a = internal constant [8 x float] [float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00]

declare float @access_global_array(ptr)

define float @my_proxy_function() {
entry:
  %calltmp = call float @access_global_array(ptr @a)
 %calltmp1 = call float @access_global_array(ptr getelementptr (float, ptr @a, i32 5))
  %0 = load float, ptr getelementptr (float, ptr @a, i32 5), align 4
  ret float %0
}
```

Then I build a debug version LLVM and found the program hits a failed assert, which already indicates something is wrong in the middle of the program. Here is a screenshot of my visual studio hitting that failed assert.
<img width="957" alt="image" src="https://github.com/llvm/llvm-project/assets/173625219/4a306de1-df95-4009-892c-9d35bcb97e15">

If someone could take a look, it is greatly appreciated.

Thanks.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsV0GP27oR_jXyZRBBoizbOviQjbuIg-SSF_Shp4AiRxbfUqRAjuz1vy-Gstd2-_YVuRVoF4tdcUSOvvk483EoYzQHh7jN6qes3i3kRL0P2y8yercR5Ycx-MOi9fq8_YzW-qzYZcXH-e8-E-sBwuSccQcwjjxIBybGCYF6SaD8ZDUYp42ShCBh9ISOjLTQG63RQTvxQvj69e_f4Mv-B3gHH8MAvxun_Snm91_7CNYQWYRWqpdD8JPTIFs_EfT-BHvokoV6E2cIOezh5MMLavYqgQMJchgYq5XuMMkDQzr1xiLIg8_EJx6oHkyEOI2jDzSvfV0tGRFP4Mevxk2vIJ2Gb1JBJjatpz69YdvHMKyWmWhy-N1QD9QjBLQoI4Lv0tDhCeIUOqkQrBzJj-x5D4PUyARKIhxGAvLAGMCkx3taYE_X0AYfyZ6hMw4BXxWOBN4hdNJY1DA5XoyRbsEp6aBFaH2aoP3JsXfG1Xlr_YnpGYNvLQ45B_fDg7IymO7MPnhelAPePMOJw8RXqRjH2_vop6AQlNcIJ-8ysaYEKu2FteCpx3BH82gldT4Mkam7pBdQMKhBQocnOGKIxrvILHK6MBrjlJ00Iy6LvMgLtpWCn9JWlOu8yEs2OuZkpn9IzEWQEfB1RHXZ4zt6ecHkOh9ocpLQnh_S8DMG5AzhSPffmSo9KdTQnmE4A9Oppkh-eMux6-pVcfmdh9UTfPN6srjfQVbtgGvpDMp7C38YysR6njfz-LMzFh3zOk8VD1PFPb5sWcg0yzjC4KQF5V0k6Qiy-mkDr9BZLymrdzxOz1DkRfrBTDwVicXZXr5jF-_Yq3fsy3fs9Tv21Tv29aO93t0HrpHzFC9TmQalMMafB-tbaX_KEOQ5E5uRQiaax4Wpet7WDeefY_Cv55_d5BQZTt5NJhrI1k_zAnQUzll1WQ6QibpIlFsv9YVe8QlGCnBAQosDOuJRJjYPbxlkyuNKQM2oxCeQ1hwcLK--A9IVmaivubPe_XlOzToZIZphZFGLrB0mzoVrImiPEZynnkumk06doZ0IZubYJmFmC44yGNlafIMMiT-uocQFl9fML9yXlmGhvdIGSlqbw2d_wiOGNxAnYy2HNQWXjgunfAioCI7STvjvxcdiN0-PkIo5yKQd1EsH9UNt_uZhD3FEpyH6AYHMgDAwSDmfF6erJO-_z9LEccwHBx8k6dAyHewTdEaHr3MR2TPMaaJv4WVic7UZB4ppMY5FIJ1mb8LA30mbTH-iPO35EhuzX-dwry58Tuy_3zD_BZYLC09o_Qm4CC7r7fmGI6Haf8_h-R_7q5T_VXgmJgKGkc43Y2LoIY04ga67OW9hfjtGnSfAI3IqTIeeOFz-7AM3_9fH_wF95HqiYUzEp9r6zygu6niBcuek_CUvv6rAzX-nqv_o0cEe2slY7og0cud86Ynm0r5J2aXEuNuF3lBkTZ77QRkjhrtmUNqAUp_fWvSYdHMubJbq4FNjnzwORmv71sRe_N8US0JUAdHF3hNPGs5wNHGSFiJN2nhGQuw3ScgDnqsCVJ_McICT0dRn1S4ToqnXmRAgLc1jM8gDsiUGNVt6ojFyqonnTDwfDPVTmys_ZOLZ2uP1H19i_kBFmXjmL1LMxHO5rlaiFmWTieelrIqVxvKD7pr6w7Iomg-bRqgPja7qVrXNGsuaZaT628P1p0ts8fk3X3RIvvCNwnr_chF8E-EQUHJnLMcxoDKSUOePGyvdS8wXelvppmrkArflumzKlSibZtFvmw7FRhZypVYbVXVdW1SrdVdova7rYt3KhdmKQiyLlajKdVGVTV6KtehqXVQNNitVFtmywEEamzMVuQ-HRbofbZvVsqoXVrZoY7r9CcFHTnrJ0da7Rdgm-trpELNlYU2kePNChmy6Nt73zvUuq5--7H-wfu7MEcOBTzns5dH4wHnxxRBdlP9f-m4upN8u96Kv6V4E60w0iynY7S_vc4qC93mO8rgV_wwAAP__i9yzxQ">