This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/65307] [4.9 Regression] Incorrect optimization breaks basic arithmetic
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 04 Mar 2015 14:21:41 +0000
- Subject: [Bug tree-optimization/65307] [4.9 Regression] Incorrect optimization breaks basic arithmetic
- Auto-submitted: auto-generated
- References: <bug-65307-4 at http dot gcc dot gnu dot org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65307
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|REOPENED |NEW
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
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);
}