https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77919
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Reduced testcase: struct A { A (double) {} _Complex double i; }; typedef int __attribute__ ((vector_size (16))) B; typedef struct { B b; } C; struct D { D (const B &x) : b (x) {} B b; }; static inline B foo (const double *x) { C *a; a = (C *) x; return a->b; } static inline D baz (const A &x) { return foo ((double *) &x); } D b = baz (0); (In reply to Eric Botcazou from comment #5) > I agree that the early return is awkward here. What happens if you just > fall through in this case? It will force the CONCAT into memory. I'll try the falling through for the case when bitpos == 0 and bitsize is the whole CONCAT size if mode1 != GET_MODE (op0) and will add logging when that happens to see how often and when that happens.