/* PR rtl-optimization/46614 */ /* { dg-do run } */ /* { dg-options "-O -fno-rename-registers -fsched2-use-superblocks -fschedule-insns2 -funroll-loops" } */ /* { dg-require-effective-target scheduling } */ extern void abort (void); struct S { unsigned char a; unsigned char b; unsigned int c; unsigned int e; unsigned char f; unsigned int g; }; void bar (struct S *x) { int i; struct S *p = x; struct S r[16]; unsigned j; for (i = 0; i < 16; i++) { r[i].c = p->b + p->c; j = p->c + p->f; r[i].a = j + p->b; r[i].f = p->f + p->e; r[i].g = p->b + p->c; } for (i = 0; i < 16; i++) { if (r[i].c != x[i].b + x[i].c || r[i].a != x[i].c + x[i].f + x[i].b || r[i].f != x[i].f + x[i].e || r[i].g != x[i].b + x[i].c) abort (); } for (i = 0; i < 16; i++) { r[i].b = p->c; if (r[i].b != x[i].c) abort (); } } int main () { int i; struct S x[16]; for (i = 0; i < 16; i++) x[i].b = x[i].c = x[i].e = x[i].f = 5; bar (x); return 0; }