From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4528 invoked by alias); 25 Jul 2014 11:47:06 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 4501 invoked by uid 48); 25 Jul 2014 11:47:02 -0000 From: "rguenth at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug middle-end/61893] Constant folding inhibits trapping with -ftrapv Date: Fri, 25 Jul 2014 11:47:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: middle-end X-Bugzilla-Version: 4.9.1 X-Bugzilla-Keywords: wrong-code X-Bugzilla-Severity: normal X-Bugzilla-Who: rguenth at gcc dot gnu.org X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2014-07/txt/msg01692.txt.bz2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61893 --- Comment #2 from Richard Biener --- 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...