http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48377
--- Comment #31 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-04-07 13:35:04 UTC --- (In reply to comment #30) > This is certainly a valid testcase: > > struct S { long long x; int a; double b[10000]; int c; } s; > double *p = &s.b[0]; > int > foo (double *q) > { > int i, j = 0; > for (i = 0; i < 10000; i++) > j += *q++; > return j; > } > int > main (void) > { > return foo (p); > } > > and without the target hook, vectorizer would think it can peel the loop and > get it naturally aligned (assuming it isn't inlined at least etc. to see that > q > points to &s.b[0] initially). > > I think the bug is in the ABIs that do that kind of thing, but it is too late > to fix the ABIs up. The question is what we should do in the middle-end. If the above would happen for strict-alignment targets then *p would simply trap. The only consistent way for the middle-end would be to simply assume all pointer-to-doubles are only aligned to 4 bytes, thus use the minimal alignment that can happen (without using GCC extensions).