Hi! As mentioned in the PR, this optimization can't work if @0's precision is higher than @1's precision, because originally it compares just some set of lower bits, but in the new comparison compares all bits. If @0's precision is smaller than @1's precision (in this case @0 can't be a pointer, as we disallow such direct casts), then in theory it can be handled, but will not match what the comment says and we'd need to verify that the @1 constant can be represented in the @0's precision.
This patch just verifies the precision is the same and does small formatting cleanup. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-04-18 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/85446 * match.pd ((intptr_t) x eq/ne CST to x eq/ne (typeof x) cst): Require the integral and pointer types to have the same precision. --- gcc/match.pd.jj 2018-04-09 20:15:49.158631652 +0200 +++ gcc/match.pd 2018-04-18 09:55:47.176343913 +0200 @@ -3711,10 +3711,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (for cmp (ne eq) (simplify (cmp (convert @0) INTEGER_CST@1) - (if ((POINTER_TYPE_P (TREE_TYPE (@0)) && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@0))) - && INTEGRAL_TYPE_P (TREE_TYPE (@1))) - || (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && POINTER_TYPE_P (TREE_TYPE (@1)) - && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@1))))) + (if (((POINTER_TYPE_P (TREE_TYPE (@0)) + && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@0))) + && INTEGRAL_TYPE_P (TREE_TYPE (@1))) + || (INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && POINTER_TYPE_P (TREE_TYPE (@1)) + && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@1))))) + && TYPE_PRECISION (TREE_TYPE (@0)) == TYPE_PRECISION (TREE_TYPE (@1))) (cmp @0 (convert @1))))) /* Non-equality compare simplifications from fold_binary */ Jakub