------- Comment #4 from ebotcazou at gcc dot gnu dot org 2008-06-26 11:02 ------- The new forward_propagate_comparison in tree-ssa-forwprop.c screws up the CFG:
<bb 2>: D.1416_13 = v_1(D) != v_1(D); is_nan_6 = (const boolean) D.1416_13; D.1402_28 = v_1(D) > 1.79769313486231570814527423731704356798070567526e+308; <bb 3>: is_p_inf_22 = (const boolean) D.1402_28; D.1403_29 = v_1(D) < -1.79769313486231570814527423731704356798070567526e+308; <bb 4>: is_m_inf_36 = (const boolean) D.1403_29; is turned into <bb 2>: is_nan_6 = v_1(D) != v_1(D); <bb 3>: is_p_inf_22 = v_1(D) > 1.79769313486231570814527423731704356798070567526e+308; <bb 4>: is_m_inf_36 = v_1(D) < -1.79769313486231570814527423731704356798070567526e+308; without any EH updating. The idiom used in tidy_after_forward_propagate_addr /* We may have turned a trapping insn into a non-trapping insn. */ if (maybe_clean_or_replace_eh_stmt (stmt, stmt) && tree_purge_dead_eh_edges (bb_for_stmt (stmt))) cfg_changed = true; wouldn't be sufficient here because statements are removed (is it really the job of the pass to remove statements?) But all this mess stems again from the non-canonical "boolean" type of Ada so it's probably worth trying to make it canonical at last... -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36554