https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120782

--- Comment #8 from Robin Dapp <rdapp at gcc dot gnu.org> ---
The vlse comes from a vec_duplicate:V2DI that has a reg pointing to a
"real(kind=4)", so a float.

What's interesting, though, is that the MEM is supposedly 64-bit aligned (see
below, A64).

(insn 285 282 287 13 (set (reg:V2DI 474)
        (vec_duplicate:V2DI (mem:DI (reg:DI 202 [ ivtmp.4273 ]) [0 MEM
<unsigned long> [(real(kind=4) *)_173]+0 S8 A64])))
"module_ra_rrtm.fppized.f90":5172:83 3602 {*vec_duplicatev2di}
     (nil))

We expand the vec_duplicate as vlse64.v eventually.  I audited several other
uses of vlse for broadcast and they appear safe (at first sight) to me.  There
is one split where we create a new stack slot for broadcasting a 64-bit value
on rv32 but even that should be ok.

So just from this issue here I'd be wary to unconditionally require
TARGET_VECTOR_MISALIGN_SUPPORTED for zero-stride broadcast.

I'm not very accustomed with the alignment attributes of a MEM but shouldn't
they be correct/reliable?  Guess I need to dig some more but from my current
understanding I wouldn't rule out a frontend/middle-end issue either.

Reply via email to