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

--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
Initially we generate

(insn 36 35 37 (set (reg:XF 95)
        (float_extend:XF (reg:SF 96))) "t.c":6:3 -1
     (expr_list:REG_EH_REGION (const_int 1 [0x1])
        (expr_list:REG_EQUAL (const_double:XF 1.8446744073709551616e+19
[0x0.8p+65])
            (nil))))

(insn 37 36 38 (set (reg:XF 94)
        (plus:XF (reg:XF 94)
            (reg:XF 95))) "t.c":6:3 -1
     (expr_list:REG_EH_REGION (const_int 1 [0x1])
        (nil)))

but then when creating BBs we end up with

(insn 36 35 37 12 (set (reg:XF 95)
        (float_extend:XF (reg:SF 96))) "t.c":6:3 -1
     (expr_list:REG_EQUAL (const_double:XF 1.8446744073709551616e+19
[0x0.8p+65])
        (nil)))
(insn 37 36 38 12 (set (reg:XF 94)
        (plus:XF (reg:XF 94)
            (reg:XF 95))) "t.c":6:3 -1
     (expr_list:REG_EH_REGION (const_int 1 [0x1])
        (nil)))
;;  succ:       17 [never]  count:0 (precise) (ABNORMAL,EH)

so it seems we retain the GIMPLE BB structure which just had

  _3 = (double) 18446744073709551614;
;;    succ:       7
;;                5

rather than splitting the EH into the now two possibly throwing stmts?

Maybe it's also specially handled because of the REG_EQUAL note?  At least
find_many_sub_basic_blocks via control_flow_insn_p doesn't consider
insns with a REG_EH_REGION note as ending a BB but it only checks
can_throw_internal which may or may not be enough here.

Reply via email to