From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 103940 invoked by alias); 4 Mar 2015 14:21:47 -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 102674 invoked by uid 48); 4 Mar 2015 14:21:43 -0000 From: "rguenth at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/65307] [4.9 Regression] Incorrect optimization breaks basic arithmetic Date: Wed, 04 Mar 2015 14:21:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Version: 4.9.2 X-Bugzilla-Keywords: wrong-code X-Bugzilla-Severity: normal X-Bugzilla-Who: rguenth at gcc dot gnu.org X-Bugzilla-Status: NEW X-Bugzilla-Priority: P2 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: 4.9.3 X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_status 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: 2015-03/txt/msg00494.txt.bz2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65307 Richard Biener changed: What |Removed |Added ---------------------------------------------------------------------------- Status|REOPENED |NEW --- Comment #9 from Richard Biener --- Visiting statement: # RANGE [0, 4294967295] NONZERO 0x000000000fffffffe _5 = 15; which is likely CONSTANT Lattice value changed to CONSTANT 14. Adding SSA edges to worklist. is of course overly optimistic ;) (but yes, nonzero bits info is bogus) I'd say we should eventually assert instead of miscompiling things. That is, static prop_value_t evaluate_stmt (gimple stmt) { ... if (flag_tree_bit_ccp && ((is_constant && TREE_CODE (val.value) == INTEGER_CST) || (!is_constant && likelyvalue != UNDEFINED)) && gimple_get_lhs (stmt) && TREE_CODE (gimple_get_lhs (stmt)) == SSA_NAME) { if (!is_constant) { ... } else { double_int valv = tree_to_double_int (val.value); here assert gcc_assert ((valv & ~val.mask & ~nonzero_bits).is_zero ()); that is, known bits in valv should be consistent with nonzero_bits info. if (!(valv & ~nonzero_bits & mask).is_zero ()) val.value = double_int_to_tree (TREE_TYPE (lhs), valv & nonzero_bits); if (nonzero_bits.is_zero ()) val.mask = double_int_zero; else val.mask = val.mask & (nonzero_bits | ~mask); }