<div dir="ltr">Hi all,<div><br></div><div>Following Analysis is regarding horizontal add across single vector.</div><div><br></div><div>Test case for AARCH64:</div><pre class="" style="white-space:pre-wrap;width:50em;color:rgb(0,0,0)">#include <arm_neon.h>
unsigned hadd(uint32x4_t a) {
  return a[0] + a[1] + a[2] + a[3];
}</pre><div><span style="color:rgb(0,0,0);white-space:pre-wrap">Currently,</span><span style="color:rgb(0,0,0);white-space:pre-wrap"> we emit scalar instructions for above code.</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">IR for above code will involve - </span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">4 'extractelement' - to extract elements from vector 'a'. </span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">3 'adds' - to perform add</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">1 return statement.</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">Lets say, we somehow vectorize this kind of code.</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">The IR will probably have something like :</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">1. Extract a[0] and put it in vec1 <2 x i32>, 0</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">2. Extract a[1] and put it in vec1 <2 x i32>, 1</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">2. Extract a[2] and put it in vec2 <2 x i32>, 0</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">3. Extract a[3] and put it in vec2 <2 x i32>, 1</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">4. Add vec1 and vec2, sum in vec3 <2 x i32></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">5. Extract vec3[0] in sum1 </span></div><div><font color="#000000"><span style="white-space:pre-wrap">6. Extract vec3[1] in sum2</span></font></div><div><font color="#000000"><span style="white-space:pre-wrap">7 add sum1 and sum2 in sum3</span></font></div><div><font color="#000000"><span style="white-space:pre-wrap">8. return sum3</span></font></div><div><font color="#000000"><span style="white-space:pre-wrap"><br></span></font></div><div><font color="#000000"><span style="white-space:pre-wrap">So overall instructions - 6 'extractlement', 4 'insertelement', 1 vector add, 1 scalar add and 1 return statement. We have vectorized add operation.</span></font></div><div><font color="#000000"><span style="white-space:pre-wrap"><br></span></font></div><div><font color="#000000"><span style="white-space:pre-wrap">This indicates code getting worse than its scalar form (if i am not missing something).</span></font></div><div><font color="#000000"><span style="white-space:pre-wrap"><br></span></font></div><div><font color="#000000"><span style="white-space:pre-wrap">This was related to PR 20035, where it was advised to handle add across single vector in SLP vectorizer.</span></font></div><div><font color="#000000"><span style="white-space:pre-wrap"><br></span></font></div><div><font color="#000000"><span style="white-space:pre-wrap">If my analysis is correct, we can never have a more profitable horizontal add across a single vector in vectorized form (Unless if i am missing something, perhaps may be 'insertelement and extractelement can be bundled together in single instruction', not sure on this).</span></font></div><div><font color="#000000"><span style="white-space:pre-wrap"><br></span></font></div><div><font color="#000000"><span style="white-space:pre-wrap">As there is an ARM vector instruction available - </span></font><span style="color:rgb(0,0,0);white-space:pre-wrap">ADDV.4S for addition across a sinle vector and if such code cannot be made profitable by vectorizing it in SLP, isn't it better to handle in SelectionDAG phase?</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">Please correct me if i am wrong and suggest better form of vectorized IR.</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">Suggestions/Comments/Corrections are most awaited !!</span></div><div><br></div><div>-- <br><div class="gmail_signature">With regards,<br>Suyog Sarda<br></div>
</div></div>