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

--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
So here is the reason why it regressed:
Before the patch, ce1 is able to find the ifcvt.
After the patch, gcc is not to find the ifcvt until ce2.

Since ce2 happens after combine.
Nothing "combines":
(insn 41 40 145 7 (set (reg:SI 147 t)
        (ge:SI (reg:SI 164 [ _8 ])
            (reg:SI 166 [ _13 ]))) "/app/example.cpp":44:10 discrim 1 14
{cmpgesi_t}
     (expr_list:REG_DEAD (reg:SI 166 [ _13 ])
        (expr_list:REG_DEAD (reg:SI 164 [ _8 ])
            (nil))))
(insn 145 41 146 7 (set (reg:SI 190)
        (reg:SI 147 t)) "/app/example.cpp":43:16 288 {movt}
     (nil))
(insn 146 145 147 7 (set (reg:SI 191)
        (neg:SI (reg:SI 190))) "/app/example.cpp":43:16 152 {negsi2}
     (nil))

Into:

(set (reg:SI 195)
    (neg:SI (ge:SI (reg:SI 164 [ _8 ])
            (reg:SI 166 [ _15 ]))))
or
(insn 177 175 178 (parallel [
            (set (reg:SI 1 r1 [189])
                (neg:SI (reg:SI 147 t)))
            (clobber (reg:SI 147 t))
        ]) "/app/example.cpp":43:16 296 {mov_neg_si_t}
     (expr_list:REG_DEAD (reg:SI 147 t)
        (expr_list:REG_UNUSED (reg:SI 147 t)
            (nil))))

Like it was done before the patch.

Now on the trunk late_combine2 might be able to do it but I have not checked.
late_combine happens before pass_if_after_combine too; though I wonder if it
should happen afterwards ...

Reply via email to