I have a simple reduction test. (attachment to follow) I'm compiling it with: ../ppc_build/gcc/cc1 -mcpu=G4 -maltivec -O3 -ftree-vectorize reductest.c
If the types are all unsigned, the loop is vectorized. If the types are all signed, the vectorizer bails because it doesn't know some pattern and there are suspicious unsigned types in the log: reductest.c:8: note: Detected induction. reductest.c:8: note: === vect_mark_stmts_to_be_vectorized === reductest.c:8: note: init: phi relevant? ivtmp.30_19 = PHI <ivtmp.30_18(2), 512(0)>; reductest.c:8: note: init: phi relevant? sum_22 = PHI <sum_13(2), 0(0)>; reductest.c:8: note: init: phi relevant? i_21 = PHI <i_15(2), 0(0)>; reductest.c:8: note: init: phi relevant? a_20 = PHI <a_14(2), a_6(0)>; reductest.c:8: note: init: stmt relevant? <L0>: reductest.c:8: note: init: stmt relevant? D.1686_9 = *a_20 reductest.c:8: note: init: stmt relevant? D.1687_10 = (short unsigned int) D.1686_9 reductest.c:8: note: init: stmt relevant? sum.0_11 = (short unsigned int) sum_22 reductest.c:8: note: init: stmt relevant? D.1689_12 = D.1687_10 + sum.0_11 reductest.c:8: note: init: stmt relevant? sum_13 = (short int) D.1689_12 reductest.c:8: note: vec_stmt_relevant_p: used out of loop. reductest.c:8: note: mark relevant 0, live 1. reductest.c:8: note: init: stmt relevant? a_14 = a_20 + 2B reductest.c:8: note: init: stmt relevant? i_15 = i_21 + 1 reductest.c:8: note: init: stmt relevant? ivtmp.30_18 = ivtmp.30_19 - 1 reductest.c:8: note: init: stmt relevant? if (ivtmp.30_18 != 0) goto <L6>; else goto <L2>; reductest.c:8: note: init: stmt relevant? <L6>: reductest.c:8: note: worklist: examine stmt: sum_13 = (short int) D.1689_12 reductest.c:8: note: vect_is_simple_use: operand D.1689_12 reductest.c:8: note: def_stmt: D.1689_12 = D.1687_10 + sum.0_11 reductest.c:8: note: type of def: 2. reductest.c:8: note: worklist: examine use 2: D.1689_12 reductest.c:8: note: mark relevant 0, live 1. reductest.c:8: note: worklist: examine stmt: D.1689_12 = D.1687_10 + sum.0_11 reductest.c:8: note: vect_is_simple_use: operand D.1687_10 reductest.c:8: note: def_stmt: D.1687_10 = (short unsigned int) D.1686_9 reductest.c:8: note: type of def: 2. reductest.c:8: note: worklist: examine use 2: D.1687_10 reductest.c:8: note: mark relevant 0, live 1. reductest.c:8: note: vect_is_simple_use: operand sum.0_11 reductest.c:8: note: def_stmt: sum.0_11 = (short unsigned int) sum_22 reductest.c:8: note: type of def: 2. reductest.c:8: note: worklist: examine use 2: sum.0_11 reductest.c:8: note: mark relevant 0, live 1. reductest.c:8: note: worklist: examine stmt: sum.0_11 = (short unsigned int) sum_22 reductest.c:8: note: vect_is_simple_use: operand sum_22 reductest.c:8: note: def_stmt: sum_22 = PHI <sum_13(2), 0(0)>; reductest.c:8: note: Unsupported pattern. reductest.c:8: note: not vectorized: unsupported use in stmt. reductest.c:8: note: unexpected pattern. reductest.c:8: note: vectorized 0 loops in function. I have not yet checked out the 4.1 tip or mainline to try this there... -- Summary: autovectorizer converts signed types to unsigned, then can't match patterns Product: gcc Version: 4.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: eplondke at gmail dot com GCC host triplet: x86_64-unknown-linux-gnu GCC target triplet: powerpc-linux and others http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29170