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.

Reply via email to