http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48037

Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ebotcazou at gcc dot
                   |                            |gnu.org

--- Comment #3 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-03-09 
12:01:10 UTC ---
> As of the register moves you are seeing, we have the long-time known problem
> that we fail to allocate registers in a way to have the function return
> value in-place.  Maybe we are just confusing IRA with the explicit move
> to that register?
> 
> (insn 13 11 18 2 (set (reg:V2DF 72)
>         (vec_concat:V2DF (reg:DF 67)
>             (reg:DF 69))) t.c:8 1557 {*vec_concatv2df}
>      (expr_list:REG_DEAD (reg:DF 69)
>         (expr_list:REG_DEAD (reg:DF 67)
>             (nil))))
> 
> (insn 18 13 21 2 (set (reg/i:V2DF 21 xmm0)
>         (reg:V2DF 72)) t.c:10 1127 {*movv2df_internal}
>      (expr_list:REG_DEAD (reg:V2DF 72)
>         (nil)))
> 
> why is combine not able to change this to
> 
> (insn 13 11 18 2 (set (reg/i:V2DF 21 xmm0)
>         (vec_concat:V2DF (reg:DF 67)
>             (reg:DF 69))) t.c:8 1557 {*vec_concatv2df}
>      (expr_list:REG_DEAD (reg:DF 69)
>         (expr_list:REG_DEAD (reg:DF 67)
>             (nil))))
> 
> ? (it doesn't even try this combination)

Probably because of the check in cant_combine_insn_p (SSE_FIRST_REG is likely
spilled on x86).

Reply via email to