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];
    }
}

Reply via email to