prefetching was prefetching for register operations like BIT_FIELD_REF <ssa_name_1, 8, 8>. That's obviously just stupid.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2016-05-20 Richard Biener <rguent...@suse.de> PR tree-optimization/71185 * tree-ssa-loop-prefetch.c (gather_memory_references): Drop register operations. * gcc.dg/tree-ssa/pr71185.c: New testcase. Index: gcc/tree-ssa-loop-prefetch.c =================================================================== *** gcc/tree-ssa-loop-prefetch.c (revision 236497) --- gcc/tree-ssa-loop-prefetch.c (working copy) *************** gather_memory_references (struct loop *l *** 631,636 **** --- 631,639 ---- continue; } + if (! gimple_vuse (stmt)) + continue; + lhs = gimple_assign_lhs (stmt); rhs = gimple_assign_rhs1 (stmt); Index: gcc/testsuite/gcc.dg/tree-ssa/pr71185.c =================================================================== *** gcc/testsuite/gcc.dg/tree-ssa/pr71185.c (revision 0) --- gcc/testsuite/gcc.dg/tree-ssa/pr71185.c (working copy) *************** *** 0 **** --- 1,13 ---- + /* { dg-do compile } */ + /* { dg-options "-O3" } */ + /* { dg-options "-O3 -march=barcelona" { target x86_64-*-* i?86-*-* } } */ + + union U { struct S { int l; int m; } p; long long a; } b; + int a, c; + + void + foo () + { + for (; b.p.m; b.a += c) + a = b.p.l / 65536.0 * 65536.0; + }