<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/96454>96454</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LICM] TSVC s113: LICM doesn't work for a load for an array with the constant index
</td>
</tr>
<tr>
<th>Labels</th>
<td>
missed-optimization,
llvm:analysis
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
yus3710-fj
</td>
</tr>
</table>
<pre>
LICM doesn't work for the loop in `s113` of [TSVC](https://www.netlib.org/benchmark/vectors).
This issue is related to #74262.
```fortran
do 1 nl = 1,ntimes
do 10 i = 2,n
a(i) = a(1) + b(i)
10 continue
call dummy(ld,n,a,b,c,d,e,aa,bb,cc,1.)
1 continue
```
```console
$ flang-new s113.f -Ofast -S -emit-llvm -v
flang-new version 19.0.0git (https://github.com/llvm/llvm-project.git f73ac218a666e2017565f2210b47332ddcf55f00)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /path/to/install/bin
Build config: +assertions
Found candidate GCC installation: /usr/lib/gcc/aarch64-redhat-linux/11
Selected GCC installation: /usr/lib/gcc/aarch64-redhat-linux/11
Candidate multilib: .;@m64
Selected multilib: .;@m64
:
$
```
```llvm
vector.body: ; preds = %vector.body, %vector.ph
%index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
%29 = load float, ptr %5, align 4, !tbaa !11 ;; this can be hoisted
%broadcast.splatinsert14 = insertelement <4 x float> poison, float %29, i64 0
%broadcast.splat15 = shufflevector <4 x float> %broadcast.splatinsert14, <4 x float> poison, <4 x i32> zeroinitializer
%30 = or disjoint i64 %index, 1
%31 = getelementptr float, ptr %6, i64 %30
%32 = getelementptr i8, ptr %31, i64 16
%wide.load = load <4 x float>, ptr %31, align 4, !tbaa !13
%wide.load13 = load <4 x float>, ptr %32, align 4, !tbaa !13
%33 = fadd fast <4 x float> %wide.load, %broadcast.splat15
%34 = fadd fast <4 x float> %wide.load13, %broadcast.splat15
%35 = getelementptr float, ptr %5, i64 %30
%36 = getelementptr i8, ptr %35, i64 16
store <4 x float> %33, ptr %35, align 4, !tbaa !11
store <4 x float> %34, ptr %36, align 4, !tbaa !11
%index.next = add nuw i64 %index, 8
%37 = icmp eq i64 %index.next, %n.vec
br i1 %37, label %middle.block, label %vector.body, !llvm.loop !15
```
We can say `a(i)` and `a(1)` never alias, but BasicAA doesn't.
FYI: It can be reproduced with the following C code. (Reproducer: https://godbolt.org/z/Kso3c7dsj)
```c
// C version
for (int nl = 0; nl < ntimes; nl++) {
for (int i = 2; i <= n; i++) {
a[i-1] = a[0] + b[i-1];
}
dummy(a, b, c, d, e, aa, bb, cc, 0.);
}
```
Actually, Flang generates LLVM IR like this C code.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV1uP6ygS_jXkpRTLgC_JQx467s2qtWe00pyjWe0jNjjhNIEs4E53__pVYTudvs30kSaKElOXD4oqis8iBL23Sm1IuSXl7UIM8eD85mkIvKb5sv-5aJ182ny7a34D6VSwhNURzs7fQ-88xIMC49wJtAVS5YFSTqocXA-k3P74_kdDylvCVocYT4HwG8J2hO3O53NmVTS6zZzfE7Zrle0OR-HvCds9qC46HwhbZyS_JfnNj4MOoEMYFOgAXhkRlYTogDBeF6xik930W-Xjt3c-emFHKaSPdEDBGiD8FihhjY36qMJbixx0smBoca0EEIStNGHrpMcBTQO2hXbSXOxpDp2zUdtBXWN0whiQw_H4RNjKyDQFawRhTUtY0xHWoEyhLAmTFMU0e4X-BvwS9Ydb0TkbnJlNWQG9EXa_tOoMmLCsh-W_exEiLL_DUh11XBrzcITlw-jxYv2gfNDOAl1neZbvdYR3ud3reBjarHNHwnYIM_0tT979VF3M0KuvuegYXYmqqhTLaV1WZc8Yzdui5pxJ2fVl2ef5JeQfwu9VJPwGhPDdoSqWg7237myXRtvhcbm3w1wsXgkJRyeVQfOTC_pxVN3ZEIUxSt5qjyrCdicRD4TtoiNsp0c1VqOe0r4dtJG4073ejx5bEYLyUTs7lc3ODVZCJ6zUUkQF_2wamJAEmk0TDcHjPugWdwjzuZvj8EoeRBzDIGxH6Yj7XRnVYZ3_XYDNZYnHwUSNnvwGMsK3pMiPVfFm2j8zAkz2XEtfqb9UBkk0Hu4MW0oKhG_h5JUM6UARVl7rWXMlOR3m2ies1Faqx-RyOmjQVYHNBvK3HpB6T5OUs1dm1WN8bYiTJdOXCaYTbpyQ0BsnkscpetSV-CyM3lsoRiAaWyHwn1LAkDCqiE2rExZaBQenQ1TyCr_1TshOhJiFE6bVYlHRIk06DpRRR2UjEN4U8Dgtgv8DTk4Hhy1jFI2LxSHuQv75FLRM4OEw9L1RY-TvwD9fWQr006VMGs0Zyp-Vd9rqqIXRz8pfrYnnaRHOg9Thp9M2jsmbcoNQ9NqcJvO9mncDM_A2HdUcfMK_9mYfeOvVlSunsy-trhzPWqospf5SA29Cf4fxSTnw-bxcgVL-JVj2BdhkOML1QkpILfyDnF7mnur-XWlc4xW_gEf5VxDLL2Sx_DSL1V9msXyfxRCdVx8tnfN3np8d5b_GKq6xqq9gvepCI4mQEuxwfncOVtd7UI-NoTueQP3vlel1O7PZg-pmt9aDpqMzqo1olcHhUUtpVNYa192_UrzrvBS7dpa4HcZQ_kmj_49KrS6IJ-SAM0lCHiisnEV0Eln1oDzulAg4UTtE2Iqgu5ubF375itHt_nuHd8VdnPupVyfv5NApCWcdD4mD9s4Yd9Z2Dw10TqoMmcnvs2G679_wFCdbZ-JEQJ8J2_0rON7VMvy8sI63NGq-9NAfmpkNTSQJ-ylbYU-bGGaO90B6bmBimklA2DZ910Dq7ZyvK_eZffJtemxwZNPoQ09kpeVWLykpbydeWm7zNEi8dNbhxTTXVH257GYqKlIu8AfJJqRWoVJJj5pRlXR5YqIz2gXrw8q46eIgjEkltUMaCXtllRdRBfj27Y_f4O53MPpejffllLqF3HC55muxUBta0zXL67pcLw6belV1bVlRUam6btVK8LrmNVdV2bFVUdCF3rCcFXnFirwsGF9nqy5nTPWKtX274qwkRa6OQpssFbfz-0V6sdisq6IsFukwhPQmxNhRh6Dk0p2iPurnkXsxbMuEsURo-I2wwjwFHVBe3i78JhHddtgHUuRGhxhe5ok6mvSShW9SmB18OUr0G2vzs9crMXEQfLQgvBdPLzWPtD4KrBhsBYvBm82vcXFkvRh-IGw37sDDhv0_AAD__7f1ARM">