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

    <tr>
        <th>Summary</th>
        <td>
            [flang] TBAA information is incorrect after LLVM inlining
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            flang,
            TBAA,
            flang:codegen
      </td>
    </tr>

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

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

<pre>
    The per function TBAA information created for the Fortran dummy arguments may become invalid after LLVM inlining.  I am not sure if we have existing issue for this.

I started from the following Fortran source:
```
subroutine test(x, y, i)
  real, target :: x(4), y(4)
  integer, value :: i
  call inner(x, y)
  call inner(y, x(i:i))
contains
  subroutine inner(x, y)
    real :: x(:), y(:)
 x(1:4) = y(1:4)
  end subroutine inner
end subroutine test

program main
  interface
     subroutine test(x, y, i)
 real, target :: x(4), y(4)
       integer, value :: i
     end subroutine test
  end interface
  real :: x(4), y(4)
  x = 1.0
 y = 2.0
  call test(x, y, 1)
  print *, x
  print *, y
end program main
```

[repro1.ll.gz](https://github.com/llvm/llvm-project/files/15082727/repro1.ll.gz) - LLVM IR on entry to LLVM produced by `flang-new -Ofast alias.f90 -c -march=skylake` with an added `noinline` attribute for `test_`.

[repro2.ll.gz](https://github.com/llvm/llvm-project/files/15082729/repro2.ll.gz) - modified LLVM IR to demonstrate the problem.

After inlining and other optimization passes applied to `repro1.ll` the LLVM IR for `test_` looks like this:
```
; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite)
define void @test_(ptr nocapture %0, ptr nocapture %1, i32 %2) local_unnamed_addr #0 {
  %4 = load <4 x float>, ptr %1, align 4, !tbaa !3
  store <4 x float> %4, ptr %0, align 4, !tbaa !9
  %5 = sext i32 %2 to i64
  %6 = add nsw i64 %5, -1
  %7 = getelementptr [4 x float], ptr %0, i64 0, i64 %6
  %8 = load <4 x float>, ptr %7, align 4, !tbaa !3
  store <4 x float> %8, ptr %1, align 4, !tbaa !9
  ret void
}
!3 = !{!4, !4, i64 0}
!4 = !{!"dummy arg data/_QFtestFinnerEy", !5, i64 0}
!5 = !{!"dummy arg data", !6, i64 0}
!6 = !{!"any data access", !7, i64 0}
!7 = !{!"any access", !8, i64 0}
!8 = !{!"Flang function root _QFtestPinner"}
!9 = !{!10, !10, i64 0}
!10 = !{!"dummy arg data/_QFtestFinnerEx", !5, i64 0}
```

TBAA tags `!3` and `!9` indicate no aliasing for the instructions they are attached to.  This is obviously incorrect for `store %4` and `%8`.  I was not able to write a test that would force LLVM to incorrectly reorder the store and the load, so did it manually in `repro2.ll`.  The incorrect behavior may be seen with:
`flang-new -O0 repro2.ll; ./a.out`:
```
 2. 2. 2. 2.
 1. 1. 1. 1.
```

Expected result (`flang-new -O0 repro1.ll; ./a.out`):
```
 2. 2. 2. 2.
 2. 2. 2. 2.
```

@tblah, FYI
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV1tv4zoO_jXKC9HAlu1cHvKQnk6AAc5iLxgssE8D2qJtbWUpkOQmmV-_kGwnbpOeM4M9ReDqQn68SSSFzslGE-1Y8cyKlwX2vjV29_YDX1u0clEacdl9awmOZKHudeWl0fDteb8HqWtjO4wLlSX0JKA2FnxLcDDWW9Qg-q67ANqm70h7Bx1eoKTKdARSv6GSArD2ZOH33__9N5BaSS11swT4CtiBNh5cbwlkDSeCFt8I6Cydl7oB6VxPo0Dplix5Ycl--H4F59FGfazpokK1UcqcAt-kmjO9rYhlIw9bJeMvTl1fWtN7qQk8Oc_45sz4b3AJH8n4dqACsIQqrHm0DXkIcNkezoxv8kA1sAzjkUNqTw3ZsPWGqqeJR04EFSoFUutAc5W6fbgb1QnCJMv2Ua2JsDLao9RuYpvZ8yn0YM3chjC8WTHOBuqwnbJsH0wDlr1EimlhQiQt7iXHvQ870cezCB6taSx20KHUc8fZGiu66XsH8UmYfj1K8e9PQwV3Jt4MGbbulP7o4s8UOEenpsvxPMIlzvl1PhyEO6PTGcTRSu2B8f1wSh6tXm7RuHf5hysxfotnS0dr0qVSy-YHK14Y37TeH108HgfGD430bV8uK9MxflDqbfr3dLTmv1R5xg-1VOQYP6RFsuFrvmb88A6Vb-FpyAlf_wVGA2lvL-DNsHa0RvQVCSgvwFZJrVA3T5pO8PT3Gp0HVBLdst4m8FTBU4e2aln24l4vCl-JrRI4Sd8CakAhSAQIbWLuiZvovZVl74fkwlZJcPJ3tkqWj_zA_0o_bCc_8LkfOiNkLUlcHeINCOqMdt6ip5jfjtaUirp3Ku5jZp2SKqAWYHxLFszRy07-GFL3EZ0jB3g8qiDDm2DyNRjBIQF_Ev3BJaCMeXWg5CvFNPxZOmXZMxym6rH33gZK6Hrn47Ej50Cb2hLBFAnQxlLVWxdG7qIr0KbXJ6kFnKRSlnxvNXTUGRuuDtqmoy6AWkJxstLT9SYIqgPgm5ECWD7qzjdHb0GbCo8-lBjGiyTciLvVNOaSjIcxDwFRpkL1vdcaOxLfUQgLjGcJsPXzdMcYL_J4X5VBASz7LYcz1MqgZ9mXScqEjUo2GvIwZDz1JWL4n10ztzdBkfcYUcIMKPkcaDtTqohKOTr7q0Uh4HKVz4hWkQiFAO1OYS9yBtSndEa2jmQNeVIUinvUpHi-aRluxHsFA9Z1ECTN4DY_46_1_-Ovzc85flbafTwz4wlev4wDnmZRV8bTEHKeTgj5zcYZcf6emHF-bYpAoEfGD9__eQiH8hDr45cL43xELB4iFn-KOPGvHvKv7vhRXyInYFWRczeA9UOA9UOAj7ybh7ybO95DSN-33tIa42H0yD_GXoXPEbbvEdJklJcmDwWmya8G4PzHAXhUFWND7LFxITnG0xgKiRbjdBumUgtZhXytzVChQlKeGmYZknkfPeDCQlCPQinCqo1ZeQnwrZUOpANTvknTO3UBqStjLVV-ysvj4Q_JYa5AsQnlK3TVJ3SxrcZSUbj6MVMCxkYCfIseTqZXsZGvxqwfEsQkR13AkrGCBq0HcUFMmIXLG_zlDAgpQHroUPeooqLXqsKHqhLtoZkFJbX4Jo0d3wjgiHQs1POaMi_1CdzwsmdYMn7Apel9sPiTMgR8ef2NK-ny-vuD-H45H6kKDwpLrlehfdo81iZ9pA3f_oJCdyuP27A88aXCNvj78J-vC7HLxDbb4oJ26TrNtskqKVaLdpesS86zMk2ThNZVlWT5uirWtdjmmOcbXi7kjic8T3Ke8TRJCr4sNlVepqWocFWvMSOWJ9ShVMvQuiyNbRbx5bXbbDd8u1BYknLx9ch59MdweRjn4U5cJ8NWtq-MoIZ0WC9eFnYX-6GybxzLEyWddzcxXnoV36UDb_Fy_-wM9-F6gB48JBe9VbtfbsqifaEriyb-LwAA__-dKFlF">