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

--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> ---
So, what kind of sorcery is this?

(insn 2 4 3 2 (set (reg/v:SI 83 [ x ])
        (reg:SI 5 di [ x ])) "pr95531.c":2:1 67 {*movsi_internal}
     (expr_list:REG_DEAD (reg:SI 5 di [ x ])
        (nil)))

(...)

(insn 7 6 8 2 (parallel [
            (set (reg:CCC 17 flags)
                (compare:CCC (reg/v:SI 83 [ x ])
                    (const_int 0 [0])))
            (set (reg:SI 82 [ <retval> ])
                (ctz:SI (reg/v:SI 83 [ x ])))
        ]) "pr95531.c":3:12 786 {*tzcntsi_1}
     (expr_list:REG_DEAD (reg/v:SI 83 [ x ])
        (nil)))
(insn 8 7 9 2 (set (reg:SI 82 [ <retval> ])
        (if_then_else:SI (eq (reg:CCC 17 flags)
                (const_int 0 [0]))
            (reg:SI 84)
            (reg:SI 82 [ <retval> ]))) "pr95531.c":3:12 1029 {*movsicc_noc}
     (expr_list:REG_DEAD (reg:SI 84)
        (expr_list:REG_DEAD (reg:CCC 17 flags)
            (nil))))

Combine does:

Trying 2 -> 7:
    2: r83:SI=r86:SI
      REG_DEAD r86:SI
    7: {flags:CCC=cmp(r83:SI,0);r82:SI=ctz(r83:SI);}
      REG_DEAD r83:SI
Successfully matched this instruction:
(parallel [
        (set (reg:CCZ 17 flags)
            (compare:CCZ (reg:SI 86)
                (const_int 0 [0])))
        (set (reg:SI 82 [ <retval> ])
            (ctz:SI (reg:SI 86)))
    ])
Successfully matched this instruction:
(set (reg:SI 82 [ <retval> ])
    (if_then_else:SI (eq (reg:CCZ 17 flags)
            (const_int 0 [0]))
        (reg:SI 84)
        (reg:SI 82 [ <retval> ])))
allowing combination of insns 2 and 7
original costs 4 + 4 = 16
replacement cost 12
deferring deletion of insn with uid = 2.
modifying other_insn     8: r82:SI={(flags:CCZ==0)?r84:SI:r82:SI}
      REG_DEAD r84:SI
      REG_DEAD flags:CCC
deferring rescan insn with uid = 8.
modifying insn i3     7: {flags:CCZ=cmp(r86:SI,0);r82:SI=ctz(r86:SI);}
      REG_DEAD r86:SI
deferring rescan insn with uid = 7.

Combine changes CCCmode comparison to CCZmode.

Reply via email to