<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74262>74262</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LICM] TSVC s113: not vectorized because LICM doesn't work
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:optimizations,
flang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
yus3710-fj
</td>
</tr>
</table>
<pre>
Flang can't vectorize the loop in `s113` of [TSVC](https://www.netlib.org/benchmark/vectors) while Clang can vectorize the loop written in C.
```fortran
! Fortran version
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
```
```c
// C version
for (int nl = 0; nl < ntimes; nl++) {
for (int i = 1; i < n; i++) {
a[i] = a[0] + b[i];
}
dummy(a, b, c, d, e, aa, bb, cc, 0.);
}
```
```console
$ flang-new -v -Ofast s113.f -S -Rpass=licm\|vector
flang-new version 18.0.0 (https://github.com/llvm/llvm-project.git 1c1227846425883a3d39ff56700660236a97152c)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /path/to/install/bin
Found candidate GCC installation: /path/to/lib/gcc/aarch64-unknown-linux-gnu/11.2.0
Selected GCC installation: /path/to/lib/gcc/aarch64-unknown-linux-gnu/11.2.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
"/path/to/install/bin/flang-new" -fc1 -triple aarch64-unknown-linux-gnu -S -fcolor-diagnostics -mrelocation-model pic -pic-level 2 -pic-is-pie -ffast-math -target-cpu generic -target-feature +neon -target-feature +v8a -fstack-arrays -fversion-loops-for-stride -Rpass=vector -O3 -o s113.s -x f95-cpp-input s113.f
$ clang -Ofast s113.c -Rpass=licm\|vector
/path/to/s113.c:16:11: remark: hoisting load [-Rpass=licm]
16 | a[i] = a[0] + b[i];
| ^
/path/to/s113.c:15:3: remark: vectorized loop (vectorization width: 4, interleaved count: 2) [-Rpass=loop-vectorize]
15 | for (int i = 1; i < LEN; i++) {
| ^
```
It can be reproduced with the following C code which is the same program as the above C code essentially.
```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.
LICM is necessary for vectorization because LoopAccessAnalysis can't analyze `a[0]` correctly.
It seems that LICM doesn't work due to the linear expression in indices of arrays.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8V1uP264S_zTkZURkYzuXhzwkzj9HK-3_VGqrvmM8julisAAnu_30R2Ane2l2V304tazEzAwD_OYKd04eNeKGFDtS7Gd88K2xm6fBZcs0oc3PWWXqp81BcX0EwTVhSw8nFN5Y-QvBtwjKmB6kBrJIXJpmZJGAaYAUu-_ffpSk2BO2ar3vHcm2hB0IO5zP57lGr2Q1N_ZI2KFCLdqO2wfCDqNuR9gazq1UCOVl6VvLnq30HnVYvpyTZE-S7fS7SMa3MdZbricqS-EwEuCE1kkzMSA-tYEUtAKS7SElrNRedujeSiQgowQLEi-ZAJywlQxbD_wwSOOA7aCaOFf5NAFhtJd6wJc6BFcK6qHrnghbqTouwUpOWFkRVgrCykDDQIvESA3kdP5K-xvlVzhuYiQu6ATrQPkamsZYCJvX_gJNQrLd-F3CBFEkELaL7xrIcnfZyovpcgI228XPEnT8vDktYFnsJCn2E5bFLomDiOXIIdlFnCz3l4kX7AI6AfUSAjoQUIMAG_CRM7IiL4nQXZRddX2CmdHOqAu8LIcm-CnVeAZ6Avql4c5DiId5A_Qb0K89d45keyVFR4qSLMvRnSeQr5Mn7CFdzZN5Ar8Fz1H6dqjmwnSEHZQ6Xf5ob81PFH5-lB5SkTK2XOWLnBWrVcazOls3TbFYJslikbBswdfLtGDi6jLfuT2iJ9kWOLeiXeR00A_anDVVUg-P9KiHSbC1yGvoTI0qiPfGyceRdaed50phvZc2sAg79Ny3hB28IewgR3YIdzm51sEMug6hXcuae4T_lCVMYtwHB_xdi5JVACEY7vD-VtkhTedsPlnuGyoUHuv_l_7yeoBuUF4GFdkW5sGj8qRb5G928ZEQEMY-xI0drq5CGAPaiBSot7JX-L7pogM2wihjaS35URvnpXBAO4vKiIgFjSaFXgqgvRRU4QkVsHEgHe0lAm2CV9OO-xaojy5DRT_AETXaMHGiNcj9YDEEq0ajb9FPKw60cZ6LB8qt5U8OaDP5Pg2p3dHGWOq8lTU-R88YM0C_ZEDNGF4O6CM064KKvqdS98Ml7J5DU8QS8jImxWcB-cYI4ySSbdNF-EmD7SzGkpVtoTXSeamPoAyvQ-V7o3z_nJcXQJYlvPf8Wc57X8_0kOKfT05TkGybvT7MtcrWY4klbHUhRUeBs6x9GyTzkDyl9mgV8hPWIMygYxJhMZu_xMGYnl41v0KkuHmSj8rG_T___ahwwE2Fz1jcSut3PnYYFYLF3pp6EFjDWfo2thqNUcqcg4FLEKbG0JmIFqSLXMc7hN6ao-Ud8JHGK3PCizQ6h9pLrtTT7R7lr9ZfdgUyjD4vwTR93yEj79kl_2Id3go_BEDDvLE5jUmIe3Rwf__jX7j7Cko-hFZRuskQr8C_vyv_DRbUKNA5bp8iUq89vULBB4dwb0y_FUFuq7l6ctJdW2EeCL8wNL8XeEIDLIy1KPzV4HceHGIXnIN7iGvXBt2o42zsA9QDgjdjZys1cgv42Ft0sRmQ4a2lQBda6zFfzmf1JqvX2ZrPcJMuk3SRr9NiNWs3RV6vi6bBpGjWPE-TospxgVWe5VlarEU9kxuWsCxlSZ4k6TpdzXmRpCxvMMF1LViVkzzBjks1D51FaNJn0rkBN8ucLdhM8QqVizcGxmILkm1N72U34eZiESsJY7FWhVGxn9lNbFOq4ehInijpvHtW76VX8Q4SoAkuFu4OMVWHdKKNf5mWrmb5HcbZYNXmzxqmUGLD4Rxhh3i-_wUAAP__JtHFGQ">