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