On Tue, 13 Dec 2011, Kirill Yukhin wrote: > Hi guys, > While looking at Spec2006/401.bzip2 I found such a loop: > for (i = 1; i <= alphaSize; i++) { > j = weight[i] >> 8; > j = 1 + (j / 2); > weight[i] = j << 8; > } > > Which is not vectorizeble (using Intel's AVX2) because division by two > is not recognized as rshift: > 5: ==> examining statement: D.3785_6 = j_5 / 2; > > 5: vect_is_simple_use: operand j_5 > 5: def_stmt: j_5 = D.3784_4 >> 8; > > 5: type of def: 3. > 5: vect_is_simple_use: operand 2 > 5: op not supported by target. > 5: not vectorized: relevant stmt not supported: D.3785_6 = j_5 / 2; > > However, while expanding, it is successfully turned into shift: > (insn 42 41 43 6 (parallel [ > (set (reg:SI 107) > (ashiftrt:SI (reg:SI 106) > (const_int 1 [0x1]))) > (clobber (reg:CC 17 flags)) > ]) 1.c:7 -1 > (expr_list:REG_EQUAL (div:SI (reg:SI 103) > (const_int 2 [0x2])) > (nil))) > > `Division by power of 2` conversion into shift seems to be beneficial at all. > My question is, what is in your opinion best way to do such a conversion? > Obvious solution will be to introduce dedicated pass which will > convert all such a cases. > We also may try to implement dedicated expand, but I have no idea, how > to specify in the name (if possible) that second operand is something > fixed.
This sounds like a job for the pattern recognizer inside the vectorizer. Richard.