[Bug middle-end/61893] Constant folding inhibits trapping with -ftrapv
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jul 25 11:47:00 GMT 2014
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...
More information about the Gcc-bugs
mailing list