http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52395
--- Comment #12 from rguenther at suse dot de <rguenther at suse dot de> 2012-02-28 09:02:04 UTC --- On Mon, 27 Feb 2012, jamborm at gcc dot gnu.org wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52395 > > --- Comment #10 from Martin Jambor <jamborm at gcc dot gnu.org> 2012-02-27 > 16:25:15 UTC --- > (In reply to comment #4) > > Martin, can we make sure that 'base' as passed to build_ref_for_offset > > is not artificially constructed by any of its callers? Thus, that it is > > at most the result of stripping some handled-component-refs from an > > existing reference tree (that was not wrapped inside an ADDR_EXPR) in the > > IL? > > As you noticed in PR 52402 IPA-SRA code does not use this function and > IPA-CP only does so when the address argument is a global declaration, > which should be always handled well by expand, I hope. > > However, I believe it's the plain ordinary SRA which can introduce, > accesses which the base did not have before. Consider function foo in > the following testcase: > > -------------------------------------------------- > typedef long long __m128i __attribute__ ((__vector_size__ (16), > __may_alias__)); > typedef unsigned int uint32_t; > extern void abort (); > > typedef struct > { > __m128i b; > int a; > } s_1a; > > typedef s_1a s_1m __attribute__((aligned(1))); > > typedef struct > { > char c; > s_1m s; > } __attribute__((packed)) s_2; > > void __attribute__((noinline, noclone)) > foo (s_1m *p) > { > __m128i v1 = {1,1}; > s_1a l; > > l = *p; > l.b = v1; > *p = l; > } > > int > main (int argc, char **argv) > { > __m128i v2 = {3,4}; > long long z[2]; > s_2 x; > > > x.s.b = v2; > foo (&x.s); > __builtin_memcpy (&z, &x.s.b, sizeof (x.s.b)); > > if (z[0] != 1 || z[1] != 1) > abort (); > > return 0; > } > -------------------------------------------------- > > The original foo: > > l = *p_2(D); > l.b = { 1, 1 }; > *p_2(D) = l; > > is basically converted into (optimized dump): > > p_2(D)->b = { 1, 1 }; > > so we have introduced a non-BLKmode access into a base which did not > have it previously. I am not sure whether this fits your definition > of base which was already there or not. On the other hand, this > testcase passes with the patch from comment 6 (but fails with PR 50444 > fix reverted) and SRA never creates anything more beastly than this, > i.e. forwarding scalar loads/stores across aggregate assignments. > > Does that answer your question? Yes, I think so. Richard.