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

--- Comment #9 from Hongtao.liu <crazylht at gmail dot com> ---
(In reply to Hongtao.liu from comment #8)
> ix86_expand_sse_fp_minmax failed since rtx_equal_p (cmp_op0, if_true) is
> false, 
> 
> 249(reg:DF 86 [ _1 ])  (if_true)
> 250(reg:DF 83 [ _2 ])  (if_false)
> 251(reg:DF 82 [ _1 ])  (cmp0_op0)
> 252(reg:DF 83 [ _2 ])  (cmp1_op1)
> 
> but here if_true is just a copy from cmp_op0 but with different REGNO,
> rtx_equal_p seems too conservative here.
> 

But if_convert didn't maintain DF_CHAIN info, and and backend can't get
DF_REG_DEF_* info to figure out if_true is just a single_set of cmp_op0.


With -march=x86-64-v2, gcc generates 

        movsd   (%rdi), %xmm2
        movsd   (%rsi), %xmm1
        movapd  %xmm2, %xmm0
        movapd  %xmm1, %xmm3
        cmpltsd %xmm1, %xmm0
        maxsd   %xmm2, %xmm3
        blendvpd        %xmm0, %xmm2, %xmm1
        movsd   %xmm3, (%rsi)
        movsd   %xmm1, (%rdi)
        ret

Which can be further optimized: cmpltsd + blendvpd -> minsd

Reply via email to