https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106032
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Component|tree-optimization |rtl-optimization --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The tree level looks ok. THe only difference is 12/13 has: if (c.0_1 < 0) goto <bb 3>; [67.00%] else goto <bb 4>; [33.00%] <bb 3> [local count: 679839639]: e_15 = *d.1_2; <bb 4> [local count: 59055800]: While 11 does: if (c.0_1 < 0) goto <bb 3>; [67.00%] else goto <bb 4>; [33.00%] <bb 3> [local count: 679839639]: d.1_2 = d; e_15 = *d.1_2; <bb 4> [local count: 59055800]: That is the load from the global d is now unconditional but the load from *d is still conditional. I see ce2 is doing ifcvt on that and changing it to be an unconditional load. IF-THEN-JOIN block found, pass 1, test 3, then 4, join 5 (insn 57 56 58 2 (parallel [ (set (reg:SI 89) (ashiftrt:SI (reg:SI 90 [ c ]) (const_int 31 [0x1f]))) (clobber (reg:CC 17 flags)) ]) "/app/example.cpp":7:9 758 {ashrsi3_cvt} (expr_list:REG_DEAD (reg:SI 90 [ c ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (expr_list:REG_EQUAL (ashiftrt:SI (mem/c:SI (symbol_ref:DI ("c") [flags 0x2] <var_decl 0x7ff174377d80 c>) [1 c+0 S4 A32]) (const_int 31 [0x1f])) (nil))))) (insn 58 57 16 2 (parallel [ (set (reg:SI 91) (and:SI (reg:SI 89) (mem:SI (reg/f:DI 83 [ d.1_2 ]) [1 *d.1_2+0 S4 A32]))) (clobber (reg:CC 17 flags)) ]) "/app/example.cpp":7:9 533 {*andsi_1} (expr_list:REG_DEAD (reg:SI 89) (expr_list:REG_DEAD (reg/f:DI 83 [ d.1_2 ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))))