diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f599d1e9ebb..6e87fadae85 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-10-19 Marek Polacek + + PR middle-end/54945 + * fold-const.c (fold_sign_changed_comparison): Punt if folding + pointer/non-pointer comparison. + 2012-10-19 Greta Yorsh * doc/sourcebuild.texi (Effective-Target Keywords): Document diff --git a/gcc/fold-const.c b/gcc/fold-const.c index b1d811d3548..053b3f524c5 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6731,12 +6731,14 @@ fold_sign_changed_comparison (location_t loc, enum tree_code code, tree type, && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type)) return NULL_TREE; - if ((TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type) - || POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type)) + if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type) && code != NE_EXPR && code != EQ_EXPR) return NULL_TREE; + if (POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type)) + return NULL_TREE; + if (TREE_CODE (arg1) == INTEGER_CST) arg1 = force_fit_type_double (inner_type, tree_to_double_int (arg1), 0, TREE_OVERFLOW (arg1));