------- Comment #4 from victork at gcc dot gnu dot org 2008-09-08 20:31 ------- Here is slightly simplified test: ================== cut ================================ typedef int int_t; typedef void (*fun_t) (int); fun_t fun_tab[400] __attribute__ ((__aligned__(16)));
void foo (int_t a); void bar () { int i; for (i = 0; i < 400; i++) fun_tab[i] = foo; } ================== cut ================================ It started to fail with ICE from this revision: Author: irar Date: Mon Jun 16 10:39:07 2008 New Revision: 136843 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=136843 Log: PR tree-optimization/36493 * tree-vect-transform.c (vect_create_data_ref_ptr): Remove TYPE from the arguments list. Use VECTYPE to create vector pointer. (vectorizable_store): Fail if accesses through a pointer to vectype do not alias the original memory reference operands. Call vect_create_data_ref_ptr without the removed argument. (vectorizable_load): Likewise. (vect_setup_realignment): Call vect_create_data_ref_ptr without the removed argument. Added: trunk/gcc/testsuite/gcc.dg/vect/pr36493.c Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-vect-transform.c ======= And this is a change in vectorizer dump: bar () { unsigned int ivtmp.15; - vector void (*<T3d3>) (int_t) * ivtmp.14; + vector void (*<T3c8>) (int) * ivtmp.14; vector void (*<T3c8>) (int) * vect_pfun_tab.13; - vector void (*<T3d3>) (int_t) * vect_pfun_tab.8; + vector void (*<T3c8>) (int) * vect_pfun_tab.8; vector void (*<T3d3>) (int_t) vect_cst_.7; unsigned int ivtmp.6; int i; <bb 2>: vect_cst_.7_9 = {foo, foo}; vect_pfun_tab.13_8 = (vector void (*<T3c8>) (int) *) &fun_tab; - vect_pfun_tab.8_12 = (vector void (*<T3d3>) (int_t) *) vect_pfun_tab.13_8; + vect_pfun_tab.8_12 = vect_pfun_tab.13_8; <bb 3>: # ivtmp.15_15 = PHI <ivtmp.15_16(4), 0(2)> # ivtmp.14_13 = PHI <ivtmp.14_14(4), vect_pfun_tab.8_12(2)> # ivtmp.6_1 = PHI <ivtmp.6_5(4), 400(2)> # i_10 = PHI <i_4(4), 0(2)> *ivtmp.14_13 = vect_cst_.7_9; i_4 = i_10 + 1; ivtmp.6_5 = ivtmp.6_1 - 1; ivtmp.14_14 = ivtmp.14_13 + 16; ivtmp.15_16 = ivtmp.15_15 + 1; if (ivtmp.15_16 < 200) goto <bb 4>; else goto <bb 5>; <bb 4>: goto <bb 3>; <bb 5>: return; } Thus, in new revision vars *ivtmp.14" and "vect_cst_.7" have different types, but the assignment "*ivtmp.14_13 = vect_cst_.7_9;" is done without a cast. -- victork at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |victork at gcc dot gnu dot | |org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37385