A silly little testcase which the vectorizer doesn't vectorize:

unsigned char qa[128];
unsigned char qb[128];
unsigned char qc[128];
unsigned char qd[128];

void autovectqi (void)
{
        int i;

        for (i = 0; i < 128; i ++)
                qd[i] = qa[i] ^ qb[i] + qc[i];
}

   Revision 116799 with '-O3 -fomit-frame-pointer -S -dp -ftree-vectorize
-march=prescott' produces:

autovectqi:
        xorl    %edx, %edx      # 54    *movsi_xor      [length = 2]
.L2:
        movzbl  qb(%edx), %eax  # 20    *movqi_1/3      [length = 4]
        addb    qc(%edx), %al   # 21    *addqi_1_lea/2  [length = 3]
        xorb    qa(%edx), %al   # 23    *xorqi_1/1      [length = 3]
        movb    %al, qd(%edx)   # 24    *movqi_1/7      [length = 3]
        addl    $1, %edx        # 26    *addsi_1/1      [length = 3]
        cmpl    $128, %edx      # 27    *cmpsi_1_insn/1 [length = 6]
        jne     .L2             # 28    *jcc_1          [length = 2]
        ret                     # 51    return_internal [length = 1]


   If I change 'qb[i] + qc[i]' to e.g. 'qb[i] & qc[i]' the vectorizer works
fine.

;; Function autovectqi (autovectqi)
[snip lots of stuff]
autovecttest.c:11: note: Access function of PHI: {0, +, 1}_1
autovecttest.c:11: note: Analyze phi: qd_23 = PHI <qd_20(4), qd_4(2)>;
autovecttest.c:11: note: virtual phi. skip.
autovecttest.c:11: note: === vect_analyze_operations ===
autovecttest.c:11: note: examining phi: ivtmp.28_1 = PHI <ivtmp.28_2(4), 
128(2)>;
autovecttest.c:11: note: examining phi: i_24 = PHI <i_21(4), 0(2)>;
autovecttest.c:11: note: examining phi: qd_23 = PHI <qd_20(4), qd_4(2)>;
autovecttest.c:11: note: ==> examining statement: <L0>:
autovecttest.c:11: note: irrelevant.
autovecttest.c:11: note: ==> examining statement: D.1860_8 = qa[i_24]
autovecttest.c:11: note: num. args = 4 (not unary/binary op).
autovecttest.c:11: note: vect_is_simple_use: operand qa[i_24]
autovecttest.c:11: note: not ssa-name.
autovecttest.c:11: note: use not simple.
autovecttest.c:11: note: ==> examining statement: D.1861_9 = (signed char) 
D.1860_8
autovecttest.c:11: note: vect_is_simple_use: operand D.1860_8
autovecttest.c:11: note: def_stmt: D.1860_8 = qa[i_24]
autovecttest.c:11: note: type of def: 2.
autovecttest.c:11: note: no optab.
autovecttest.c:11: note: vect_is_simple_use: operand (signed char) D.1860_8
autovecttest.c:11: note: not ssa-name.
autovecttest.c:11: note: use not simple.
autovecttest.c:11: note: not vectorized: relevant stmt not supported: D.1861_9 
= (signed char) D.1860_8
autovecttest.c:11: note: bad operation or unsupported loop bound.
autovecttest.c:11: note: vectorized 0 loops in function.
autovectqi ()
{
  unsigned int ivtmp.28;
  int pretmp.22;
  int i;
  unsigned char D.1867;
  signed char D.1866;
  signed char D.1865;
  unsigned char D.1864;
  unsigned char D.1863;
  unsigned char D.1862;
  signed char D.1861;
  unsigned char D.1860;

<bb 2>:

  # ivtmp.28_1 = PHI <ivtmp.28_2(4), 128(2)>;
  # i_24 = PHI <i_21(4), 0(2)>;
<L0>:;
  D.1860_8 = qa[i_24];
  D.1861_9 = (signed char) D.1860_8;
  D.1862_12 = qb[i_24];
  D.1863_15 = qc[i_24];
  D.1864_16 = D.1863_15 + D.1862_12;
  D.1865_17 = (signed char) D.1864_16;
  D.1866_18 = D.1865_17 ^ D.1861_9;
  D.1867_19 = (unsigned char) D.1866_18;
  qd[i_24] = D.1867_19;
  i_21 = i_24 + 1;
  ivtmp.28_2 = ivtmp.28_1 - 1;
  if (ivtmp.28_2 != 0) goto <L5>; else goto <L2>;

<L5>:;
  goto <bb 3> (<L0>);

<L2>:;
  return;

}
[cut]

-- 
Rask Ingemann Lambertsen

Reply via email to