<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74409>74409</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AliasAnalysis][LICM] A question about loop hoist optimization: moving the first-level pointer out of the loop in a two-level pointer
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
hlyix
</td>
</tr>
</table>
<pre>
In this case
```cpp
void loopHoist(float **a) {
#pragma clang loop unroll(disable)
for (int i = 0; i < 1000; i++) {
a[115][i] = i;
}
}
```
and its IR:
```
; Function Attrs: mustprogress nofree norecurse nosync nounwind uwtable
define dso_local void @_Z9loopHoistPPf(float** nocapture readonly %0) local_unnamed_addr #0 {
%2 = getelementptr inbounds float*, float** %0, i64 115
br label %4
3: ; preds = %4
ret void
4: ; preds = %1, %4
%5 = phi i64 [ 0, %1 ], [ %10, %4 ]
%6 = trunc i64 %5 to i32
%7 = sitofp i32 %6 to float
%8 = load float*, float** %2, align 8, !tbaa !8
%9 = getelementptr inbounds float, float* %8, i64 %5
store float %7, float* %9, align 4, !tbaa !12
%10 = add nuw nsw i64 %5, 1
%11 = icmp eq i64 %10, 1000
br i1 %11, label %3, label %4, !llvm.loop !14
}
```
Memory SSA form
```
define dso_local void @_Z9loopHoistPPf(float** nocapture readonly %0) local_unnamed_addr #0 {
%2 = getelementptr inbounds float*, float** %0, i64 115
br label %4
3: ; preds = %4
ret void
4: ; preds = %4, %1
; 2 = MemoryPhi({%1,liveOnEntry},{%4,1})
%5 = phi i64 [ 0, %1 ], [ %10, %4 ]
%6 = trunc i64 %5 to i32
%7 = sitofp i32 %6 to float
; MemoryUse(2) MayAlias
%8 = load float*, float** %2, align 8, !tbaa !8
%9 = getelementptr inbounds float, float* %8, i64 %5
; 1 = MemoryDef(2)
store float %7, float* %9, align 4, !tbaa !12
%10 = add nuw nsw i64 %5, 1
%11 = icmp eq i64 %10, 1000
br i1 %11, label %3, label %4, !llvm.loop !14
}
```
i found AA think below two vars is alias:
```
%8 = load float*, float** %2
float** %0
```
because of this two vars alias, the LICM cannot hoist `%8 = load float*, float** %2` out of loop
I just wonder whether float ** will alias with float *, first point to a ptr, second point to a float value.
Can I use a custom Alias Analyser to make ptrs with different levels no alias?
```
if (getPointerLevel(LocA.Ptr->getType()) !=
getPointerLevel(LocB.Ptr->getType())) {
return AliasResult::NoAlias;
}
```
Dose this changes legal in Alias Analysis? Or will you have a better suggestion?
Thanks!
If I want to hoist a[115] out of loop.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsV01v2zgT_jX0ZZBAoiR_HHyQ7QZvgPZt0HYvewkoaSSxpUmVpOz1_vrFkHaspskihx720MCIJc33M3zGI-Gc7DTimhUbVuxmYvS9seteneRfs8o0p_W9Bt9LB7VwyJIdS0o2T-KnHob45GBkA8qY4X9GOs_4slVGeGC8ZLwUjK-ALTZRFQCA8WywotsLqJXQXbCEUVujFOPLRjpRKWR8dbVojQXGl1J7kMCyHSQs24TLLaRJEu8Y34TPs2j0J1ixSdOCFTtWbCQrdsGJZNk0q8XuXN_TxaXQ8234L3QD0ju4_8Sy8mW9bAN3o669NBpK761jWQn70fnBms6ic6BNaxFBG4v1aB1duZOuQZtRH6VuYDz6AEJw2GArNULjzKMytVAQ8GZ58vjn6gn1h4f2AnzEHbSpxeBHi2BRNEarEzBeJARQcPM4ai322DyKpiF4s2QKHOMFDyh16FHhHrUfvAWpKzPqxsE10hamUWOILch5DgT52V1lQYkKFcnzKZ4ZgUOQDRYbFyJeVQAs-lDu1CR_0SSlqFNTxosiCIdehnRYsYHkrJUCHQa6Ljbh_iLIgyC6YLyYBw_ejrqOPsipNyAzPomzCFpOetMOJIqW3pyRuSoug6Iyovk3ADk9E0p2GpYxrdRXQtD3cuJs9Yb-XH2H8JfOUBkXT84bi3ChbLF4brS6ZpM_yyadgpAmIR_RNKDHI2h3vIbiW0inqmkkYL0fAL9f1GIPAp-vp0am0YBETyco--HukpVSh_1tGCaUWv4WNn_AvbEn-Py5pBmzf1HzN_3eQr_8QqzrEIwFRIgfesn4kgqMTFXygB_1O-3tiTrEt1FEXtLwYPXraPxreUyVxZr-cMj4klNHP4hTqaRw_2mqU-bppCc7bM_5_x4FSSmhJTihLGnh0d-gQmWO4I8GDsI6kI4qF-7Vn_23tzzo_8Ta11OrsBajQzBt3MWecooJ8S34HuH9_fYD1EJr46GnmQTk5u1ZzRMwo6cgBNw0_j18HZ2Ho9ENWjj26Hu0MF3y4CiViunAUfp-KtxCK63zMBja37wBAYO39NxhbXQzFUSzg1Aj3sI0ha3QcA8EgoB6dN7sIRAOSi3UyaEl-734huT7nEMj2xYtag8KD6ho7bq08G7q-xnmsqVds0P_QHmhfU_GjC_fm7q8ffD2hmXvOvRfTgPRn9hDKydPWXYZOC_abl6z_WljtehHq2N9n9CNytOZy8r_mzhjrlvrayd6Zxye1_Ze6A4dKOyEAql_QE0SEvDRxu6dzAi9OBDCFXqPFtzYdehoj31C7Esv9DdH1U4BjKekhXs4itjKeACve_f0aN1G_VmzzppVthIzXKeLJF3ky3mxmPXrOqkLvqrSecrnS2xEukjytJlXdZ03olnVM7nmCc9SnhRJViyyxW0l5lm1yvMFb1PeZBnLE9wLqW7DHDC2m0nnRlwv8jxZzcK0cOGVh3ONRwhCxjm9Adk12dxUY-dYnijpvLt68dKr8K4UUHwCMbxWEP2o0BK-jxE0EBVVHcZQxMMMXu7l3yJCWsLeHKTuAnsDR27CQY2EQHvBjMTBidQgiPw_qs1Gq9a990MYTfyO8btO-n6sbmuzZ_yOsj9_3QzWfMXaM34XanaM3wVM_gkAAP__kb7tYg">