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

--- Comment #13 from H.J. Lu <hjl.tools at gmail dot com> ---
(In reply to H.J. Lu from comment #12)
> (In reply to H.J. Lu from comment #9)
> > With Bm constraint on SSE *mov<mode>_internal, curr_insn_transform in
> > lra-constraints.c generates an extra
> > 
> > (insn 354 353 323 8 (set (reg:V4SF 192)
> >         (reg:V4SF 202 [192])) 1226 {*movv4sf_internal}
> >      (nil))
> > 
> > for input:
> > 
> > (insn 353 322 354 8 (set (reg:V4SF 202 [192])
> >         (reg:V4SF 201 [192])) 1226 {*movv4sf_internal}
> >      (nil))
> 
> 
> LRA is OK when Bm is properly defined as
> 
> (define_memory_constraint "Bm"
>   "@internal Vector memory operand."
>   (match_operand 0 "vector_memory_operand"))

It doesn't work since process_alt_operands in LRA will treat Bm as m:

                   case CT_MEMORY:
                      if (MEM_P (op)
                          && satisfies_memory_constraint_p (op, cn))
                        win = true;
                      else if (spilled_pseudo_p (op))
                        win = true;

and ignores vector_memory_operand.

Reply via email to