<html><body>
<p><font size="2" face="sans-serif">Hi,</font><br>
<br>
<font size="2" face="sans-serif">I have the following C loop to vectorize:</font><br>
<br>
<font size="2" face="sans-serif">struct box {</font><br>
<font size="2" face="sans-serif"> double* source;</font><br>
<font size="2" face="sans-serif">};</font><br>
<br>
<font size="2" face="sans-serif">void test(double* restrict result, struct box my_struct, int len)</font><br>
<font size="2" face="sans-serif">{</font><br>
<font size="2" face="sans-serif"> for (int i=0 ; i<len; i++) {</font><br>
<font size="2" face="sans-serif"> result[i] = my_struct.source[i] * my_struct.source[i];</font><br>
<font size="2" face="sans-serif"> }</font><br>
<font size="2" face="sans-serif">}</font><br>
<br>
<font size="2" face="sans-serif">There are two references in the loop, result[i] (restrict) and my_struct.source[i] (readonly). The compiler should easily figure out that they do not alias.</font><br>
<br>
<font size="2" face="sans-serif">Compiling for x86, the loop alias analysis works just fine:</font><br>
<font size="2" face="sans-serif"> AST: Alias Set Tracker: 2 alias sets for 2 pointer values.</font><br>
<font size="2" face="sans-serif"> AliasSet[0x7fd8e2f32290, 1] must alias, No access Pointers: (double* %arrayidx5, 18446744073709551615)</font><br>
<font size="2" face="sans-serif"> AliasSet[0x7fd8e2f322e0, 1] must alias, No access Pointers: (double* %arrayidx, 18446744073709551615)</font><br>
<br>
<font size="2" face="sans-serif">Compilin</font><font size="2" face="sans-serif">g for PPC with -target powerpc64le-ibm-linux-gnu, the two addresses now alias:</font><br>
<font size="2" face="sans-serif"> AST: Alias Set Tracker: 1 alias sets for 2 pointer values.</font><br>
<font size="2" face="sans-serif"> AliasSet[0x7f931bd5bdc0, 2] may alias, No access Pointers: (double* %arrayidx5, 18446744073709551615), (double* %arrayidx, 18446744073709551615)</font><br>
<br>
<font size="2" face="sans-serif">BasicAA is used for both targets by default. The difference is that in PPC, the IR obtained from Clang takes an i64 as parameter instead of a double* for my_struct. This parameter is then coerced into double* using an inttoptr instruction. The code in BasicAliasAnalysis.cpp which is triggered for x86 is the following:</font><br>
<br>
<font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">// Function arguments can't alias with things that are known to be</font><br>
<font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">// </font><font size="2" face="sans-serif">unambigously</font><font size="2" face="sans-serif"> identified at the function level.</font><br>
<font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">if</font><font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">((</font><font size="2" face="sans-serif">isa<Argument></font><font size="2" face="sans-serif">(</font><font size="2" face="sans-serif">O1</font><font size="2" face="sans-serif">)</font><font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">&&</font><font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">isIdentifiedFunctionLocal</font><font size="2" face="sans-serif">(</font><font size="2" face="sans-serif">O2</font><font size="2" face="sans-serif">))</font><font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">||</font><br>
<font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">(</font><font size="2" face="sans-serif">isa<Argument></font><font size="2" face="sans-serif">(</font><font size="2" face="sans-serif">O2</font><font size="2" face="sans-serif">)</font><font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">&&</font><font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">isIdentifiedFunctionLocal</font><font size="2" face="sans-serif">(</font><font size="2" face="sans-serif">O1</font><font size="2" face="sans-serif">)))</font><br>
<font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">return</font><font size="2" face="sans-serif"> </font><font size="2" face="sans-serif">NoAlias</font><font size="2" face="sans-serif">;</font><br>
<br>
<font size="2" face="sans-serif">isIdentifiedFunctionLocal(V) returns true for a noalias argument (such as result), but the other address (my_struct) must be a function argument in order to return NoAlias, which is not the case anymore for PPC (since my_struct is now the result from an inttoptr instruction). If I understand, the problem is that we cannot trust the fact that locals do not alias with restrict parameters (because the compiler could generate some locals which alias)? If someone has suggestions about this, that would help a lot.</font><br>
<br>
<font size="2" face="sans-serif">Thanks,</font><br>
<font size="2" face="sans-serif">Olivier</font></body></html>