<div dir="ltr">Hello everyone,<div><br></div><div style>Proceeding with an effort to optimize pointer-arg-to-struct-with-data-pointer arrangement, I'm taking a shot at writing a specific AA pass. I've got a scaffold up modelling after BasicAA and bumped into a few issues. Here's a snippet of IR I'm dealing with. Slice is the wrapper structure and "data" pointer is element 0 and we're looking at two of them.</div>
<div style><br></div><div style>---- IR ----</div><div style><br></div><div style>  define void foo(%Slice* noalias %a, %Slice* noalias %b)</div><div style><div><br></div><div>  store %Slice* %a, %Slice** %v</div><div>  store %Slice* %b, %Slice** %v1</div>
</div><div style>  ; ...</div><div style><div><br></div><div>  %v6 = load %Slice** %v</div><div><div>  %v14 = load %Slice** %v1</div></div><div><div>  ; ...</div><div></div></div></div><div style><br></div><div style><div>
  %gep9 = getelementptr inbounds %Slice* %v6, i32 0, i32 0</div><div>  %v10 = load double** %gep9</div><div style>  ; v13 = <index calculation></div><div style>  ; ...</div><div>  %addr = getelementptr double* %v10, i64 %v13<br>
</div><div><div>  %getitem = load double* %addr</div></div><div>  ;...</div><div><br></div><div><div>  %gep18 = getelementptr inbounds %Slice* %v14, i32 0, i32 0</div><div>  %v19 = load double** %gep18</div><div><div>  ; v22 = <index calculation></div>
</div><div>  ; ...</div><div>  %addr23 = getelementptr double* %v19, i64 %v22</div><div>  %getitem24 = load double* %addr23</div></div><div><br></div><div><div>---- /IR ----</div></div><div><br></div><div><br></div><div style>
Right now I'm forwarding alias() calls to base class and just observing the current alias analysis result. Here's a portion of the output</div><div style><br></div><div style>---- Debug ----</div><div style><br></div>
<div style><div> LocA  %gep9 = getelementptr inbounds %Slice* %a, i64 0, i32 0</div><div> LocB  %gep18 = getelementptr inbounds %Slice* %b, i64 0, i32 0</div><div>  Aliases? 0</div><div><br></div><div> LocA  %addr = getelementptr double* %v10, i64 %v11</div>
<div> LocB  %gep18 = getelementptr inbounds %Slice* %b, i64 0, i32 0</div><div>  Aliases? 0</div><div><br></div><div> LocA  %gep9 = getelementptr inbounds %Slice* %a, i64 0, i32 0</div><div> LocB  %addr23 = getelementptr double* %v19, i64 %v11</div>
<div>  Aliases? 0</div><div><br></div><div> LocA  %addr = getelementptr double* %v10, i64 %v11</div><div> LocB  %addr23 = getelementptr double* %v19, i64 %v11</div><div>  Aliases? 1</div><div><br></div><div> LocA  %gep18 = getelementptr inbounds %Slice* %b, i64 0, i32 0</div>
<div> LocB  %addr23 = getelementptr double* %v19, i64 %v11</div><div>  Aliases? 0</div><div><br></div><div> LocA  %addr = getelementptr double* %v10, i64 %v11</div><div> LocB  %addr23 = getelementptr double* %v19, i64 %v11</div>
<div>  Aliases? 1</div><div><br></div><div style>---- /Debug ----</div><div style><br></div><div style>The results raise a few questions:</div><div style><br></div><div style>1. For whatever reason, the only type of instruction making it to alias() is GEP. Looking at BasicAA code, it seems I should also expect load()s and some of those are definitely present in IR. How come I'm not seeing them?</div>
<div style><br></div><div style>2. It seems that current AA has no problem disambiguating Slice pointer from data pointer, but has issues distinguishing two data pointers, even tho two Slice pointers are marked as noalias. This is the spot I want to augment. My planned logic is to</div>
<div style><br></div><div style>  a) Mark data pointer loads (pointer itself, not elements) with special metadata (say, !sliceaa.data)</div><div style>  b) Find parent Slice structure</div><div style>  c) If Slices don't alias, data pointers don't alias as well. This is very simplistic and wrong in many situations, but it should be good for starters.</div>
<div style><br></div><div style>What would be the proper way to look for those "parent" slice structs? Closest thing I found so far is in memory dependency analysis where I retrieve the parent block (or parent function) and iterate all instructions until I, say, find result value which is the same as the source value in a load and so on. Is there a better way?</div>
<div style><br></div><div style><br></div><div style>Thanks,</div><div style><br></div><div style><br></div><div style>Dimitri.</div></div></div></div>