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.

Any help is appreciated.

Thanks, K

Reply via email to