<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Have a look at the code in HorizontalReduction::getReductionCost and HorizontalReduction::emitReduction.<br>
<br>
You don't need 4 extracts. This can be modeled at the IR level as a combination of shufflevector and vector add instruction on a <4 x i32> vector. TargetTransformInfo::getReductionCost can return the appropriate cost (for example, one for AArch64::getReductionCost(add, <4 x i32>)) if codegen can implement this sequence of instructions more efficiently.<br>
<br>
For a <4 x i32> reduction you need only need two vector shuffles, two vector adds and one vector extract to get the scalar result.<br>
<br>
vadd <0, 1, 2, 3><br>
         <2, 3, x, x> // shuffled<br>
=><br>
<br>
<0+2, 1+3, x, x><br>
<br>
<br>
vadd <0+2, 1+3, x x><br>
         <1+3, x, x x> // shuffled<br>
=> <br>
<br>
<0+2+1+3, x, x, x><br></blockquote><div><br></div><div>Ahh!! Shuffle vector comes to the rescue. Thanks Arnold for pointing out. I ignored it completely in above explanation.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
What it takes to get your example working in the SLPVectorizer is:<br>
<br>
* Get the matching code up to snuff. I think, we should replace the depth first search matcher by explicitly matching the trees we expect in HorizontalReduction::matchReduction. The code should just look for:<br>
    <br>
   (+ (+ (+ v1 v2) v3) v4)<br>
    and maybe<br>
    (+ ( + v1 v2) (+ v3 v4))<br>
    <br>
    explicitly for v1, .., vn identical operations.<br>
<br>
* Allow a tree of size of one (the vector loads) if the tree feeds a reduction.<br>
<br>
* Adjust the cost model AArch64::getReductionCost<br>
<br>
* AArch64 CodeGen would have to recognize the shuffle reduction if it does not do so already<br>
<br>
<br></blockquote></div><div class="gmail_extra"><br></div>Seems everything boils down to properly identifying the reduction chain. I did look at your patch provided in earlier thread (similar discussion), it was working for reduction chain of 4 elements (+(+(+( v1, v2) v3) v4). However, when i tried it for 8 elements, it was asserting. I will look into it. Thanks for getting back on this. <br clear="all"><div><br></div>-- <br><div class="gmail_signature">With regards,<br>Suyog Sarda<br></div>
</div></div>