https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92956
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
To reproduce, one can use e.g.
./gfortran -B ./ -fopenmp -O3 -flto -flto-partition=1to1 -fno-use-linker-plugin
async_target-2.f90 -fdump-tree-strlen -r -nostdlib -I
../x86_64-pc-linux-gnu/libgomp/ -B ../x86_64-pc-linux-gnu/libgomp/ -B
../x86_64-pc-linux-gnu/libgomp/.libs/ -v -save-temps
(if the test is copied into the gcc/ subdirectory of build dir).
The
vectp.52_27 = &MEM[(struct array01_real(kind=4) *)_7 clique 1 base
0].dtype.rank;
MEM <vector(2) signed char> [(signed char *)vectp.52_27 clique 1 base 0] = {
1, 3 };
the warning warns about has been created by SLP vectorization of
MEM[(struct array01_real(kind=4) *)_7 clique 1 base 0].dtype.rank = 1;
MEM[(struct array01_real(kind=4) *)_7 clique 1 base 0].dtype.type = 3;
It can be reproduced e.g. with -O3 on x86_64-linux:
struct T { char a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p; };
struct S { long l; struct T t; };
void
foo (long l, struct S *p)
{
p->l = l;
p->t.a = 2;
p->t.b = 3;
p->t.c = 4;
p->t.d = 5;
p->t.e = 6;
p->t.f = 7;
p->t.g = 8;
p->t.h = 9;
p->t.i = 10;
p->t.j = 11;
p->t.k = 12;
p->t.l = 13;
p->t.m = 14;
p->t.n = 15;
p->t.o = 16;
}
Here slp2 pass changes:
+ vect_cst__20 = { 2, 3, 4, 5, 6, 7, 8, 9 };
p_2(D)->l = l_3(D);
- p_2(D)->t.a = 2;
- p_2(D)->t.b = 3;
- p_2(D)->t.c = 4;
- p_2(D)->t.d = 5;
- p_2(D)->t.e = 6;
- p_2(D)->t.f = 7;
- p_2(D)->t.g = 8;
- p_2(D)->t.h = 9;
+ vectp.4_21 = &p_2(D)->t.a;
+ MEM <vector(8) char> [(char *)vectp.4_21] = vect_cst__20;
This is valid GIMPLE IL, but like in PR92765, the warning code makes
assumptions that aren't valid in GIMPLE, after early opts where GCC for
__builtin_object_size (, [13]) purposes disables some optimization to ensure
the access paths are meaningful, later passes don't preserve it and for
ADDR_EXPR all that matters is the value,
i.e. what offset from the base needs to be added, what COMPONENT_REFs are there
or aren't doesn't mean anything.