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

    <tr>
        <th>Summary</th>
        <td>
            [Flang] TSVC s314, s3111: not vectorized because the loops are not recognized as reduction loops
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            vectorization,
            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 `s314` and `s3111` 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
      x = a(1)
      do 10 i = 2,n
        if(a(i) .gt. x) x = a(i)
   10 continue
      call dummy(ld,n,a,b,c,d,e,aa,bb,cc,x)
   1  continue
```

```c
// C version
for (int nl = 0; nl < ntimes; nl++) {
  x = a[0];
  for (int i = 1; i < n; i++) {
    if (a[i] > x) {
      x = a[i];
    }
 }
  dummy(a, b, c, d, e, aa, bb, cc, x);
}
```

```console
$ flang-new -v -Ofast s314.f -S -Rpass=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 s314.s -x f95-cpp-input s314.f
$ clang -Ofast s314.c -Rpass=vector
/path/to/s314.c:17:3: remark: vectorized loop (vectorization width: 4, interleaved count: 2) [-Rpass=loop-vectorize]
   17 | for (int i = 0; i < LEN; i++) {
      | ^
```

One reason is fast-math flag (#74263), but even if fast-math flag is set, the loop isn't vectorized.
There seems to be a redundant store in the IR from Flang and that prevents from the pattern match.

* IR from Flang (manually added fast-math flag)

```
.lr.ph: ; preds = %.lr.ph.preheader, %26
 %indvars.iv = phi i64 [ 2, %.lr.ph.preheader ], [ %indvars.iv.next, %26 ]
 %22 = phi float [ %18, %.lr.ph.preheader ], [ %27, %26 ]
  %gep = getelementptr float, ptr getelementptr ([1000 x float], ptr @_QMmodEa, i64 -1, i64 999), i64 %indvars.iv, !dbg !21
  %23 = load float, ptr %gep, align 4, !dbg !21, !tbaa !15
  %24 = fcmp fast ogt float %23, %22, !dbg !21
  br i1 %24, label %25, label %26, !dbg !21

25: ; preds = %.lr.ph
  store float %23, ptr %12, align 4, !dbg !23, !tbaa !15
  br label %26, !dbg !21

26: ; preds = %25, %.lr.ph
  %27 = phi float [ %23, %25 ], [ %22, %.lr.ph ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !24
  %exitcond.not = icmp eq i64 %indvars.iv, %21, !dbg !21
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !dbg !21
```

* IR from Clang

```
for.body4: ; preds = %for.body, %for.body4
  %indvars.iv = phi i64 [ 0, %for.body ], [ %indvars.iv.next, %for.body4 ]
  %x.120 = phi float [ %0, %for.body ], [ %x.2, %for.body4 ]
  %arrayidx = getelementptr inbounds [32000 x float], ptr @a, i64 0, i64 %indvars.iv
  %1 = load float, ptr %arrayidx, align 4, !tbaa !5
  %cmp5 = fcmp fast ogt float %1, %x.120
  %x.2 = select i1 %cmp5, float %1, float %x.120
 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, 32000
  br i1 %exitcond.not, label %for.cond.cleanup3, label %for.body4, !llvm.loop !11
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0WFuP4yoS_jXkpWTLxrfkIQ-d9GR1pN0d7ZnReR0RwA5nMHgBJ5n99SvwJZd298weaVutbkMVH8VXFxcm1opGcb5FxQ4VryvSu5M22x-9zao0ieo_V0fNfmwPkqgGKFEIVw7OnDptxH84uBMHqXUHQgEqE5ulOSoTIIqNwzT1Y10DKnZfv_yxR8UrwuuTc51F2QvCB4QPl8slVtxJcYy1aRA-HLmip5aY7wgfhr0swhu4nITksJ9MWTLjYoRzXHlz9jFKXlHyMv4tk-G31sYZosZZnMJhmIAzN1boUQDhh2lIQUlA2SukCO-VEy239xrXICMIr1OEN89rExBBjv3aeyGAqBFe-3XCnyxuXAxX_3QDFPeAaQJUKydUz-9xKJESWN-2PxBeSxa2wXuC8P6I8J4ivPdz3M-FyTDrp68P4PAEPpO1yCCduPO-g_0jcbU24I1XbiIuQdlueN7DSGCYQHgXfjeAqt1ky3T8Ypf4SMlmwR2uGP2R7cLjHlR4XMTzRENgutgJVLwCyj4NRD8o3W8sHjcGQNXrOLg9zaR7WsHTCp5W8HSD5xvIIBlEQRY4n4BnqJ9wrZXVcnILzqH20R8pfoHoDNHnmlgHPuviGqIvEP3eEWtR9jqkxuiSecnoKUjXcRIn8CYRG-FO_TGmukX4IOV5-hd1Rv_JqYsb4SClKcbVOi9zXKzXGclYtqnroqySpCwTnJVkU6UFpnOEfSWm4Q5lL0CIoacyj3r1XemLiqRQ_TVqVD8qngwnDFrNuPTqnbbiOoh-U9YRKTl7FcaLED50xJ0QPjiN8EEMYl86xBiIB90r5ssEE4w4Dn_b72FUI86H61sUKY6eBO-tw_um4kOaxjge_fWFS04dZ_8v_P18gLaXTniI7AViH0d50pb5kxUfKQHC-EPe8GEOFYQxRDVNIXJGdJK_77oQdjXVUpuICdIobZ2gFqLWcKlp4CIKLoVOUIg6QSPJz1wCHgbCRp3gENU-lqOWuBNELoRMRLseGq648QvHuZoT1xsOCO8U12pp_rwmENXWEfo9IsaQHxaieoz9yL8mbFRrE1lnBOPPOQPR5wwiPSSVhegK9aaIaNdFQnX9lGy3hKThdXSfiXQ5DZ-oH1RR9pJWKHvJvMMMD--87OX2ZmPDaw3h9TQVCIWLYO7kNXNfWYRy3EhOzpwB1b0KyYZDlSt2szEeKZqRfZWbXwAVoGr_tsYmtxr790___KjKQgBAxacPitpnxcFwYrUCYeHm7VqSxu-LcFbluMx84fCls3fAz_5dXj8rCwuWO6906z_sU2vC4qmocMPBct5acBqOHAgYznrFiHJgnTbcdwse6LffoTa6haHZ8T2MOxEHnfFmODsIvWJHnONGQUscPT22GfjlCQbhdUtUT6T8AYQxzp4OM5fJReZiaeIuONqz3xnObPAMwsUgijvDT5wwbjwdCBe4nLO9EIqdibGxOIdF3UmAKHMfFKElWUKB0KDtg84DQqz41c17wC18_BjP-LXUxE2r0_Wv7YKrJWA_0fAuQDfccclbrlznzLCJX-IHjyIfR8UuTZIErqPesFUQ5sm3f_2j1exTeDl7LqJ0etpsNmPkBY7uzz5Yl7Kjd2eK0zsDcRbsk5qwR7MG40MnIEWjhkR9ABnG7kiI_58W96h5QK1p24VwAd24iVq_50QXfs-yowGRDkheRZIjl2FYPA7LZYDhLy4-CLxppyGDnmwbCUjx--fP3j3_0fyygeWigcMh31gaAm05UG-MFs-h-ZgoT-H5lB5DD8kYqP4Cyl6WIyl9OlJ-B8ivwlGtWKz0gCZ8CPB_vxeTBX5GexsC95gP3o-_USPcN84a_jg_0LZM_GK7elf1wvXsg4pWaxP7K2W-6LpJOp7uprzE-Zuiljwt-6ViNu_x5NtrnOJkOVx-ss81xj_BDl2JYNeF2ibU0Xeu1oNl-N06NhewZLli3fZK3y9Qkxlvs3TKyvuiRNuu-KgsjZE4EPdA5PB6sKFJHYPSg3n9x9Xz6B7jr-fZX8mrOTQC-b-eTN7VQUAlJ6rvsjfSIZAHfv2tKh5buzR9zq0V22Zsk23Iim_TKknLfFPl2eq0zeiGlFl9TEq2riijdL0uOCs2NUsLeiTVSmxxgrMUJ3mS4E2SxaSoNmmyTmid06yqSpQnvCVCxsECbZqVsLbnW9955atgrw3fgjB-6DjD3WGPMA5XBD8qXldmG26Hx76xKE-ksM7ecJ1wMnxWCn2Qv3t__fLHPrTInoTh21D2At4jd_3ukVPS29snHQvE8KBkONWNCkrEhh6Ohl44aK16I7f_223W33_82S3Ch3D8_wYAAP___Mpspg">