<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">