https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61893
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Fixing bit-ccp with Index: tree-ssa-ccp.c =================================================================== --- tree-ssa-ccp.c (revision 213040) +++ tree-ssa-ccp.c (working copy) @@ -1456,8 +1456,19 @@ bit_value_unop (enum tree_code code, tre widest_int value, mask; prop_value_t val; - if (rval.lattice_val == UNDEFINED) - return rval; + if (rval.lattice_val == UNDEFINED + /* If the value is fully known constants assume that + earlier simplification failed for a reason, for example + due to -ftrapv. */ + || (rval.lattice_val == CONSTANT + && TREE_CODE (rval.value) == INTEGER_CST + && rval.mask == -1)) + { + val.lattice_val = VARYING; + val.value = NULL_TREE; + val.mask = -1; + return val; + } gcc_assert ((rval.lattice_val == CONSTANT && TREE_CODE (rval.value) == INTEGER_CST) @@ -1492,7 +1503,16 @@ bit_value_binop (enum tree_code code, tr prop_value_t val; if (r1val.lattice_val == UNDEFINED - || r2val.lattice_val == UNDEFINED) + || r2val.lattice_val == UNDEFINED + /* If both values are fully known constants assume that + earlier simplification failed for a reason, for example + due to -ftrapv. */ + || (r1val.lattice_val == CONSTANT + && TREE_CODE (r1val.value) == INTEGER_CST + && r1val.mask == 0 + && r2val.lattice_val == CONSTANT + && TREE_CODE (r2val.value) == INTEGER_CST + && r2val.mask == 0)) { val.lattice_val = VARYING; val.value = NULL_TREE; reveals that expansion produces (insn 5 4 6 (set (reg:SI 4 si) (const_int 1 [0x1])) t.c:7 -1 (nil)) (insn 6 5 7 (set (reg:SI 5 di) (const_int 2147483647 [0x7fffffff])) t.c:7 -1 (nil)) (call_insn/u 7 6 8 (set (reg:SI 0 ax) (call (mem:QI (symbol_ref:DI ("__addvsi3") [flags 0x41]) [0 S1 A8]) (const_int 0 [0]))) t.c:7 -1 (expr_list:REG_EH_REGION (const_int -2147483648 [0xffffffff80000000]) (nil)) (expr_list (use (reg:SI 4 si)) (expr_list (use (reg:SI 5 di)) (nil)))) (insn 8 7 9 (set (reg:SI 86 [ D.1753 ]) (reg:SI 0 ax)) t.c:7 -1 (expr_list:REG_EQUAL (plus:SI (const_int 2147483647 [0x7fffffff]) (const_int 1 [0x1])) (nil))) note the REG_EQUAL note which CSE happily simplifies and substitutes... Index: optabs.c =================================================================== --- optabs.c (revision 213040) +++ optabs.c (working copy) @@ -3985,7 +3985,8 @@ emit_libcall_block_1 (rtx insns, rtx tar } last = emit_move_insn (target, result); - set_dst_reg_note (last, REG_EQUAL, copy_rtx (equiv), target); + if (!equiv_may_trap) + set_dst_reg_note (last, REG_EQUAL, copy_rtx (equiv), target); if (final_dest != target) emit_move_insn (final_dest, target); with that we finally trap with -O2...