https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92303
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- richi's change basically on the testcase just changed 6 times in the function: hl_.v_ = a11_334; - accvhi4__777 = hl_.hilo_.hi_; - accvlo4__778 = hl_.hilo_.lo_; + _612 = BIT_FIELD_REF <a11_334, 32, 0>; + _613 = BIT_FIELD_REF <a11_334, 32, 32>; or so (plus different SSA_NAME_VERSION). That is given: typedef unsigned char rc_vec4_type_ __attribute__((__vector_size__(4))); struct { rc_vec4_type_ hi_, lo_; } hilo_; } RC_hl_type_; so I don't really see anything wrong on that, a11_334 has type typedef unsigned char rc_vec_t __attribute__((__vector_size__(8))); and this is a valid way to extract low or high half of a vector. Simplified testcase that still hangs in LRA: /* { dg-do compile } */ /* { dg-require-effective-target lp64 } */ /* { dg-options "-O2 -mcpu=ultrasparc -mvis" } */ typedef unsigned char rc_vec_t __attribute__((__vector_size__(8))); typedef short rc_svec_type_ __attribute__((__vector_size__(8))); typedef unsigned char rc_vec4_type_ __attribute__((__vector_size__(4))); void foo (unsigned int, unsigned int); void bar (rc_vec_t *pv) { rc_vec_t v = {}; for (int i = 0; i < 64; i++) { typedef union { rc_vec_t v_; struct { rc_vec4_type_ hi_, lo_; } hilo_; } RC_hl_type_; RC_hl_type_ hl_ = (RC_hl_type_) v; rc_vec4_type_ a = hl_.hilo_.hi_; rc_vec4_type_ b = hl_.hilo_.lo_; union U { rc_vec4_type_ v; unsigned int u; }; foo (((union U) { .v = a }).u, ((union U) { .v = b }).u); v = pv[i]; } }