This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

-ftree-vectorize can't vectorize plus?


   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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]