https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83104
--- Comment #2 from Marc Glisse <glisse at gcc dot gnu.org> --- two_valued_val_range_p doesn't work on pointers, it uses vrp_val_min on the type of the arguments. Probably: --- vr-values.c (revision 255021) +++ vr-values.c (working copy) @@ -4091,7 +4091,7 @@ vr_values::simplify_stmt_using_ranges (g LHS = VAR == VAL1 ? (VAL1 BINOP CST) : (VAL2 BINOP CST) */ if (TREE_CODE_CLASS (rhs_code) == tcc_binary - && INTEGRAL_TYPE_P (TREE_TYPE (lhs)) + && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)) && ((TREE_CODE (rhs1) == INTEGER_CST && TREE_CODE (rhs2) == SSA_NAME) || (TREE_CODE (rhs2) == INTEGER_CST (or keep both tests)