<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/110613>110613</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Flang][LICM] deferred-shape arrays are not vectorized in some cases
</td>
</tr>
<tr>
<th>Labels</th>
<td>
loopoptim,
flang:ir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
yus3710-fj
</td>
</tr>
</table>
<pre>
Flang can't vectorize some loops in [TSVC](https://www.netlib.org/benchmark/vectors) if arrays are `ALLOCATABLE`. For example, Flang can't vectorize the loop in `s271` of TSVC if I rewrite explicit-shape arrays to deferred-shape arrays.
```fortran
! s271_allocatable.f90
subroutine s271 (ld,n,a,b,c)
implicit none
integer ld, n, i
real, allocatable :: a(:), b(:), c(:) ! added ALLOCATABLE attribute
call init(ld,n,a,b,c,'s271 ')
do i=1,n
if (b(i) .gt. 0.) a(i) = a(i) + b(i) * c(i)
end do
call dummy(ld,n,a,b,c,1.)
end subroutine s271
```
```console
$ flang-new -v -O3 -flang-experimental-integer-overflow s271_allocatable.f90 -S -Rpass=vector -mcpu=a64fx
flang-new version 20.0.0git (https://github.com/llvm/llvm-project.git 2c770675ce36402b51a320ae26f369690c138dc1)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /path/to/build/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
"/path/to/build/bin/flang-new" -fc1 -triple aarch64-unknown-linux-gnu -S -fcolor-diagnostics -mrelocation-model pic -pic-level 2 -pic-is-pie -target-cpu a64fx -target-feature +outline-atomics -target-feature +v8.2a -target-feature +aes -target-feature +complxnum -target-feature +crc -target-feature +fp-armv8 -target-feature +fullfp16 -target-feature +lse -target-feature +neon -target-feature +perfmon -target-feature +ras -target-feature +rdm -target-feature +sha2 -target-feature +sve -fversion-loops-for-stride -flang-experimental-integer-overflow -Rpass=vector -resource-dir /path/to/build/lib/clang/20 -mframe-pointer=non-leaf -O3 -o /dev/null -x f95-cpp-input s271_allocatable.f90
```
The base addresses and the lower bounds of arrays aren't recognized as loop-invariant.
```llvm
11: ; preds = %.lr.ph, %25
%indvars.iv = phi i64 [ 1, %.lr.ph ], [ %indvars.iv.next, %25 ] ;; i
%12 = sub nsw i64 %indvars.iv, %.unpack322.unpack.unpack ;; i - lbound(b,1)
%13 = getelementptr float, ptr %.unpack266.pre, i64 %12
%14 = load float, ptr %13, align 4, !tbaa !12
%15 = fcmp fast ogt float %14, 0.000000e+00 ;; b(i) > 0
br i1 %15, label %16, label %25
16: ; preds = %11
%.unpack329 = load ptr, ptr %2, align 8, !tbaa !4 ;; a
%.unpack343.unpack.unpack = load i64, ptr %.elt342, align 8, !tbaa !4 ;; lbound(a,1)
%17 = sub nsw i64 %indvars.iv, %.unpack343.unpack.unpack ;; i - lbound(a,1)
%18 = getelementptr float, ptr %.unpack329, i64 %17
%19 = load float, ptr %18, align 4, !tbaa !14 ;; a(i)
%.unpack350 = load ptr, ptr %4, align 8, !tbaa !4 ;; c
%.unpack364.unpack.unpack = load i64, ptr %.elt363, align 8, !tbaa !4 ;; lbound(c,1)
%20 = sub nsw i64 %indvars.iv, %.unpack364.unpack.unpack ;; i - lbound(c,1)
%21 = getelementptr float, ptr %.unpack350, i64 %20
%22 = load float, ptr %21, align 4, !tbaa !16 ;; c(i)
%23 = fmul fast float %22, %14
%24 = fadd fast float %23, %19
store float %24, ptr %18, align 4, !tbaa !14
br label %25
25: ; preds = %16, %11
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%exitcond.not = icmp eq i64 %indvars.iv.next, %10
br i1 %exitcond.not, label %._crit_edge.loopexit, label %11
```
If I move `%.unpack329`, `%.unpack343.unpack.unpack`, `%.unpack350` and `%.unpack364.unpack.unpack` outside the loop manually, the loop is vectorized.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysWF9v2zgS_zTMy0CCRP2x_eCH2FkfCvSwwLW414IiRza3FKkjKSfdT38gJdtyogQNsEURm8P5Pz8Ph2TOyaNG3JJqR6qnBzb4k7HbX4MrVnmWtH89NEb82h4U00fgTBO68nBG7o2VfyM40yEoY3oHUgOpdt-__XdPqidC1yfve0eKR0IPhB6en59TjV7JJjX2SOihQc1PHbM_CT2M-hyhG5AtMGvZLwfMIpA6e_z69c_94_fH3dc_SJ2lcDAW8IV1vUJC9_CeY_40-hXdqjNHVzmpMzAtBA-DmS9g8dlKj4AvvZJc-sSdWI8X-96AwBatRXG3kZLsiWSP0986G_-3xnrL9ESlOQSLP5hShjPPGoVpu8nGXTc01gxeaoxMQOhaCUL3mtA9I3TfELrnhG5GbgDZje6BNhonotQej2ghCkKQBHnht8hUIMyMQ6hD8QiM0HUsySYwNHcrfl1B8J8JgQJm2QfmvZXN4HGeAADOlAKppX8njj2hqynO1SwqYUCS4imPAhMNQl0IXQfHZHAkPfoUsjR8ZRcaKZ5mC7qD5rZ4jFHImRnUAoSZVtFVMXTdr_d8zdOrbJB8VapXNV8EAjfaGXXJES2hDQhNND5DcobkzwKSkYIvPVrZofZMJVM9E3NG2yrzvAgfSL5B8p-eOUeKpxHqkHS8H0jxxOqyfRmN3gye0TppNNAszdLsKD28-V0epT8NTcpNR-hBqfPlI-mt-Qu5T4MU5atVVq8qjkVdZrSpclbQjCGt26Le1JuM58Va8Pyau-_MHtFHxDHLT3WZDPqnNs86UVIPL8lRDxPjySIT0BmBKrD3xskpjC_aeaYUiidpwxahh575E6EHb0L_GGSo4KGRE3x2gQDc6FYeR_4dcw6tl0a7keVgBi1CsxBSMI_wr_0e5GiGBbbJzOBsyIJsQn44J_RwicKiODE_BkHoIZ8Q8Q0Vco_iH1O4v7rYDcrLIFk8QkqKHSmzri5fmf2ICQilH6SOHq5wIZRC0vIcEm9lr_D92kUgttwoYxMh2VEb5yV3kHQWI2Kl0UmsKfSSQ9JLnig8owI6LqRLeomQ-IiThPcDRABfKS0yP4QDgO7M4JXUmDBvumjkLct5nVK2tMFwkZ-brlcveugWNy1fIrd9wmx3Xi_uDUq1fV4v7SmHS2SNRi_Re7Rtt7xl2WIwViyG4U6MLtLPCEk7dYYkHt1Ja2zivJUCf685vWlCFp0ZLMdESPveD3WEPw_qCT3QDJKutazDpDfBgCXFkw4eIWvHNmmCJoFnQg96UAqSF2g3VcL7PpG6H_wHR-xii_5-QmiYw3C0WXQOHTAtpknhGS00oT24MCPcRpBxrrDIzVHLv1EAc3GuSKQ-MyuZ9svzQGylkZTnsQsUO-gtChfPL0KrVNm0P4WDl9CKVpfzitBKanFm1qXyHHn7kwRZl2G4gnziH4UhDlr7uHMnl2p88VfVgS3YDy7ImZ2cRv1uaEC759HGXMvF1qB7xn8WlE7fpo-rSkhAxdSNJ_c-nx2_wUwRzRzRo8KAqN5baJVh0cOwuBmhdZ32Ng52kzs5nasqoyplmHijIS_GmUceNZSj67lvGAuf90qqqKTlXQ8tcx7M0Y_aRhNBNkuz-A8J3WXZJdLboFH8AdlFZWNB5qPiIKpYgyou67vlpcQTKOpFUFz6P9wlfnOLuvd2FjO9hbx-FXJ5cZotaCyLN6Wc9Mu6nFcFlS_K37FyBQBbAMDqUzhbcO4tzpbMrH8fZ8U48l4wtpqr2XyAsfUHGJtl_G4EnVmtsvcqWf5GjvlbhXX5iULWxWcKyd9mmGafKuSCc28LuWQm_0Qhq2xWSJrdUkTp-3Wk-Qd1rG_5vr9KBMGxl7XdoMbece0blE7R5-Wcf2xYLRPiNX9x4b_qd95YnHGUv428WSt6p9_Qarnf1Bcv8sUDKB4k441LCNDD8_uFnyvAF-m50SLVZpSWodni_95Kzk-q_FK9a0ed67lrpukPbqX_geKIaTiNA-N98_3orvYlXP47c47vC_dNoY5wuie_bkiLTFUwEueJe_rrH0F8hBi8C7PW9Y2iY3pgSv0Kam8PF-72nCHSB7EtxKbYsAfc5iu6WpVVuckeTttVQZt12yDN2lqsiiZfFVW95rnYrDLRbDYPckszWuZZlmd5vs6zNF9VpchKKjar1brNGCkz7JhUaZhZUmOPD9K5Abd5ntV58RBz6uL7EKXBM9N72cVbxZ5QGudFUjxKG0jV04PdxvtjMxwdKTMlnXc3zV56Fd-a4rtNmF-q3dcv-3-HEWXxtSU-AwUY3XIBUo_vTpw5dA-DVdvP3WkJPcQIXbxxxSDPW_r_AAAA__-lop6p">