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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Incorrect load after #142941
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            llvm:codegen
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            jcohen-apple
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          kawashima-fj
      </td>
    </tr>
</table>

<pre>
    After the merge of #142941 (e8a891b), the following Fortran program prints incorrect result on `-O2` or higher.

```fortran
program main
   integer :: i, k
   k = 0

   write(10, *) 0
   write(10, *) 1
   write(10, *) 2
   write(10, *) 3
   write(10, *) 4
   write(10, *) 5
   write(10, *) 6
   write(10, *) 7
   write(10, *) 8
   write(10, *) 9

   rewind 10

   read(10, *) i; if (i /= 0) k = k + 1
   read(10, *) i; if (i /= 1) k = k + 1
   read(10, *) i; if (i /= 2) k = k + 1
   read(10, *) i; if (i /= 3) k = k + 1
   read(10, *) i; if (i /= 4) k = k + 1
   read(10, *) i; if (i /= 5) k = k + 1
   read(10, *) i; if (i /= 6) k = k + 1
   read(10, *) i; if (i /= 7) k = k + 1
   read(10, *) i; if (i /= 8) k = k + 1
 read(10, *) i; if (i /= 9) k = k + 1

   print *, k

end program main
```

```console
$ flang -O0 test2.f90 && ./a.out
 0
$ flang -O1 test2.f90 && ./a.out
 0
$ flang -O2 test2.f90 && ./a.out
 4
$ flang -O3 test2.f90 && ./a.out
 4
```

This program writes ten values to a file and read the written values. If a read value is not the expected one, it increments `k`.

Before e8a891b, it prints `0` for all optimization levels. It's the expected behavior.

Comparing assembly before and after the commit shows that there are differences in how `i` values are loaded after `read`.

```diff
@@ -188,12 +188,9 @@
        bl _FortranAioInputInteger
        mov     x0, x20
        bl _FortranAioEndIoStatement
-       ldr     q0, [sp, #16]
        mov     w0, #10
        mov     x1, x19
        mov     w2, #22
-       ld1     { v0.s }[1], [x21]
-       str     q0, [sp, #16]
        bl _FortranAioBeginExternalListInput
        add     x1, x29, #28
        mov w2, #4
@@ -201,12 +198,9 @@
        bl      _FortranAioInputInteger
 mov     x0, x20
        bl      _FortranAioEndIoStatement
-       ldr q0, [sp, #16]
        mov     w0, #10
        mov     x1, x19
 mov     w2, #23
-       ld1     { v0.s }[2], [x21]
-       str     q0, [sp, #16]
        bl      _FortranAioBeginExternalListInput
        add     x1, x29, #28
        mov     w2, #4
@@ -214,11 +208,14 @@
        bl _FortranAioInputInteger
        mov     x0, x20
        bl _FortranAioEndIoStatement
-       ldr     q0, [sp, #16]
+       ldr     q1, [sp, #16]
        mov     w0, #10
        mov     x1, x19
        mov w2, #24
-       ld1     { v0.s }[3], [x21]
+       ld1     { v1.s }[1], [x22]
+       ldr     s0, [x22]
+       ld1     { v0.s }[1], [x22]
+ zip1    v0.2d, v1.2d, v0.2d
        str     q0, [sp, #16]
        bl _FortranAioBeginExternalListInput
        add     x1, x29, #28
```

#149703 does not fix this problem.

@jcohen-apple Could you take a look?

The [LLVM IR by `flang -O2 -S -emit-llvm test.f90`](https://github.com/user-attachments/files/21366004/test.ll.txt), [assembly before e8a891b](https://github.com/user-attachments/files/21366009/test.before.s.txt), [assembly after e8a891b](https://github.com/user-attachments/files/21366010/test.after.s.txt) are attached.

I ported this program to C using `fprintf`/`fscanf` but I could not reproduce the problem.

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMWF1v6jwS_jXmZgRyJh8kF1xA-yIhndUr7Vnt7cpJJsQHJ2Zth7bn16_sAKVsS7viHO2LkPIxz3hm_NgzEwtr5bYnWrB0xRB_VLqlfir2e0UMkaWPEzG4VpvFTjwJ28pOTJsfk1LXL4tl48iAawk6MlsC3QDDOEqwSCJgmFMu8iIqGRYMHwKu0UrpJ9lvYa2NM6KHvdFbIzrYG9k7C7KvtDFUOTBkB-VA98AyPv0TWcZBG2jltiUzY3zp_xkf_804GuPL03idkP4RAGTvaEsGWLxk8RKk92U3inbA4kfg42AA8GSkI4Z5xD2I4ZJhEcQfyaIbMrwhi2_Ikhuy9IYsuyGb35DlN2TFeWoMPcm-hohfvBH1NV6yeAXSL4NcAsP1OL1YHGd6BwxXp0n7qn50pz7eqR_fqZ_cqZ_eqZ_dqT-_Uz9_V_-r2sV72qMDIWWMuuOOZnxJfQ1XKeCcJK5yRqV7qxX5V5hAo0S_hemfHBxZh7Om4MAwY5jBjOFazPTgvFl-hY_-Rzx-gk-u8PFX8G8j_Ecr7XkSwra24KiHg1CDv9UgoJGKQPR14CGkZg98Rc1g04AYpeENSAu9dgFKz3uqHNWge_JzL53P24Y68imcZXzHMn5M0StqtCE4l4KAPiZ7lnHvNTTagFAK9N7JTv4UTuoeFB1IeT8cw7l9a7ekVhykPpWBB93thfFVRVhLXaleoBzN-gjFuUpVuuukA9vqJz-gCNF4lCGoZdOQob4iX4Sg1U_ePendO86bRyktajoNyTIeVvE51jMPfjD_nHCWcJhGec7wIUK_fsf7AkbZuJDDr1Twr2NRXEq96feD24yV6wLU6UO4Podt84wfD_BHX2_0dydcYIXx5fQIU7UJ13-POy9d2f24BeMoY-njO8ae-AnA33MlCq5ExXuaeNREfONBFK5svoIDn1lg80eWriJvfXTpGaPRlZOKdV91-u0srGgr-z-eHZleqG_SujCvF3BR15dRjJ2Kdzi_CuccSnJBLPLoldjiY2LD7wa7n9B6rX6T29_C638TGn9OKP4qQq_j_3WsvonpDbNR4pn1bewKedi-yV95z_rKeIWNfu_-fl0KyedLIX5nKVy6fKEUvZ8Q8KM4Lb-F-TzTXCj9lPuAP_AZ1h5wiE434c3rBPx_8tF1J-O_tYo5j6HWNFbnRj6DO5b_UlF3KkwJv_yugwc9qBpe9ABO7AgEKK13LF6f-gfyIX379s-_webvUL74Svfav0y_w5Q66aZKHbrQnfjmxHvlZzVvndtb_62Fa4brrXTtUM4q3TFcD5bMVDgnqja0CgzXvg_xV4ziLOM8YbgOIyo1c8_u-OXI0tV1YT_1E_ebLE4mx5Fn9gPDY83_ZXZ94zvaDQOfzYY2Y1Sk-kjfBvba-L7HXXZ2TsMDDNa3PZ6f0FM1ngZc-2dbid4_Qjk42EAVKPdrxNDe6HqoKPREFwtlUi_iuogLMaFFNE_jKE_meTZpF3PRIJ8XFCfziNJCxHNeFWkWU9HkdUrxRC6QY8rniFGUZJjNyrohzMu8KUSSYVGyhFMnpJr5NTPTZjuR1g60iFLOeTJRoiRljycQpah21NcsXi6XpmqzhKFPNQzRK7N4WemattQfTyfMwr-elsPWsoQraZ19teKkU-Fk4zRU-gib8xGD7-ZOvdzp3GIyGLW4QWzwYbxM90b_oMoxXIdoPLnHgA4L_E8AAAD__1YfoxI">