<span style=" font-size:10pt;font-family:sans-serif">Hi Jeroen,</span><br><br><span style=" font-size:10pt;font-family:sans-serif">In working on
a scheme to represent Fortran alias information precisely,</span><br><span style=" font-size:10pt;font-family:sans-serif">we encounter a
situation in which two alias sets partially overlap.  We would</span><br><span style=" font-size:10pt;font-family:sans-serif">like to seek any
idea of representing such alias sets, particular, in the scheme of</span><br><span style=" font-size:10pt;font-family:sans-serif">the full restrict
alias approach in D68484.</span><br><br><span style=" font-size:10pt;font-family:sans-serif">Consider the following
Fortran code, </span><br><br><span style=" font-size:10pt;font-family:sans-serif">module m</span><br><span style=" font-size:10pt;font-family:sans-serif">  implicit
none</span><br><span style=" font-size:10pt;font-family:sans-serif">!set A: variables
*with* the TARGET attribute</span><br><span style=" font-size:10pt;font-family:sans-serif">  integer,
allocatable, target :: tgtA01, tgtA02, tgtA03</span><br><span style=" font-size:10pt;font-family:sans-serif">  integer,
pointer :: p_1_SetA, p_2_SetA, p_3_SetA</span><br><br><span style=" font-size:10pt;font-family:sans-serif">!set B: variables
*without* the TARGET attribute</span><br><span style=" font-size:10pt;font-family:sans-serif">  integer
:: tgtB01, tgtB02, tgtB03</span><br><br><span style=" font-size:10pt;font-family:sans-serif">  contains</span><br><span style=" font-size:10pt;font-family:sans-serif">  subroutine
init_ptr()</span><br><span style=" font-size:10pt;font-family:sans-serif">   
p_1_SetA = 0 ; p_2_SetA = 0 ; p_3_SetA = 0</span><br><span style=" font-size:10pt;font-family:sans-serif">  end subroutine
init_ptr</span><br><br><span style=" font-size:10pt;font-family:sans-serif">  subroutine
compute(n)</span><br><span style=" font-size:10pt;font-family:sans-serif">   
integer :: idx, n</span><br><br><span style=" font-size:10pt;font-family:sans-serif">   
call init_var(tgtB01)</span><br><span style=" font-size:10pt;font-family:sans-serif">   
call init_var(tgtB02)</span><br><span style=" font-size:10pt;font-family:sans-serif">   
call init_var(tgtB03)</span><br><br><span style=" font-size:10pt;font-family:sans-serif">   
associate(assoc_tgtA01 => tgtA01, assoc_tgtA02 => tgtA02, assoc_tgtB02
=> tgtB02)</span><br><span style=" font-size:10pt;font-family:sans-serif">   
  do idx = 1, n</span><br><span style=" font-size:10pt;font-family:sans-serif">   
    assoc_tgtA01 = assoc_tgtA01 * tgtB03 + assoc_tgtA02 * tgtA03
+ tgtB01 * assoc_tgtB02</span><br><span style=" font-size:10pt;font-family:sans-serif">   
  end do</span><br><span style=" font-size:10pt;font-family:sans-serif">   
end associate</span><br><span style=" font-size:10pt;font-family:sans-serif">  end subroutine
compute</span><br><span style=" font-size:10pt;font-family:sans-serif">end module</span><br><br><span style=" font-size:10pt;font-family:sans-serif">The alias analysis
in frontend can generate the following alias sets for</span><br><span style=" font-size:10pt;font-family:sans-serif">"tgtA01"
and "tgtA02".</span><br><br><span style=" font-size:10pt;font-family:sans-serif"> -------------------------------</span><br><span style=" font-size:10pt;font-family:sans-serif"> "tgtA01"
is aliased to:</span><br><span style=" font-size:10pt;font-family:sans-serif">   
"__m_NMOD__&&_m" "__m_NMOD_init_ptr" "__m_NMOD_compute"
"init_var"</span><br><span style=" font-size:10pt;font-family:sans-serif">   
"p_1_SetA" "p_2_SetA" "p_3_SetA"</span><br><span style=" font-size:10pt;font-family:sans-serif">   
"assoc_tgtA01" "tgtA01"</span><br><span style=" font-size:10pt;font-family:sans-serif"> -------------------------------</span><br><span style=" font-size:10pt;font-family:sans-serif"> "tgtA02"
is aliased to:</span><br><span style=" font-size:10pt;font-family:sans-serif">   
"__m_NMOD__&&_m" "__m_NMOD_init_ptr" "__m_NMOD_compute"
"init_var"</span><br><span style=" font-size:10pt;font-family:sans-serif">   
"p_1_SetA" "p_2_SetA" "p_3_SetA"</span><br><span style=" font-size:10pt;font-family:sans-serif">   
"assoc_tgtA02" "tgtA02"</span><br><span style=" font-size:10pt;font-family:sans-serif"> -------------------------------</span><br><br><span style=" font-size:10pt;font-family:sans-serif">If we express
this alias info with the scheme that we presented in the last LLVM</span><br><span style=" font-size:10pt;font-family:sans-serif">Developers' Meeting
(</span><a href=https://youtu.be/Vp4GklTXDys><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://youtu.be/Vp4GklTXDys</span></a><span style=" font-size:10pt;font-family:sans-serif">),
the optimizer manages to</span><br><span style=" font-size:10pt;font-family:sans-serif">move the loop
invariant code out of the loop body.  We think that the optimizer</span><br><span style=" font-size:10pt;font-family:sans-serif">can make use of
the alias information even though there is an overlap in the two</span><br><span style=" font-size:10pt;font-family:sans-serif">alias sets.  With
the D69542 patch (</span><a href=https://reviews.llvm.org/D69542><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://reviews.llvm.org/D69542</span></a><span style=" font-size:10pt;font-family:sans-serif">),
we would</span><br><span style=" font-size:10pt;font-family:sans-serif">like to know if
there is any way to express that with the intrinsics proposed in</span><br><span style=" font-size:10pt;font-family:sans-serif">the full restrict
patch.</span><br><br><span style=" font-size:10pt;font-family:sans-serif">We attach the
ll files for reference.</span><br><br><span style=" font-size:10pt;font-family:sans-serif">Note: The options
--unroll-max-count=0 --interleave-loops=false</span><br><span style=" font-size:10pt;font-family:sans-serif">-passes=default<O3>
-aa-pipeline=default are used in opt.</span><br><br><span style=" font-size:10pt;font-family:sans-serif">Attachments</span><br><span style=" font-size:10pt;font-family:sans-serif">0. alias-sets-from-fe.txt
- full alias sets generated from Fortran frontend</span><br><span style=" font-size:10pt;font-family:sans-serif">1. before-opt-without-alias-from-fe.ll
- IR before opt (NO alias info is emitted)</span><br><span style=" font-size:10pt;font-family:sans-serif">2. after-opt-without-alias-from-fe.ll
- IR after opt (NO alias info is emitted)</span><br><span style=" font-size:10pt;font-family:sans-serif">3. before-opt-with-alias-from-fe.ll
- IR before opt (noalias/alias.scope metadata is emitted)</span><br><span style=" font-size:10pt;font-family:sans-serif">4. after-opt-with-alias-from-fe.ll
- IR after opt (noalias/alias.scope metadata is emitted)</span><br><br><br><br><br><br><br><span style=" font-size:10pt;font-family:sans-serif">Thanks,</span><br><span style=" font-size:10pt;font-family:sans-serif">Kelvin</span><BR>