https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88775
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I get pretty much the same thing with:
--- gcc/match.pd.jj 2019-01-07 17:59:24.100931144 +0100
+++ gcc/match.pd 2019-01-10 14:45:31.870509916 +0100
@@ -1660,6 +1660,19 @@ (define_operator_list COND_TERNARY
(if (TREE_INT_CST_LOW (@1) & 1)
{ constant_boolean_node (cmp == NE_EXPR, type); })))
+/* Turn (uintptr_t) ptr1 != (uintptr_t) ptr2 comparison into just
+ ptr1 != ptr2. Don't do that for non-equality comparisons. */
+(for cmp (eq ne)
+ (simplify
+ (cmp (convert@2 @0) (convert @1))
+ (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@2))
+ && POINTER_TYPE_P (TREE_TYPE (@0))
+ && POINTER_TYPE_P (TREE_TYPE (@1))
+ && TYPE_PRECISION (TREE_TYPE (@2)) >= TYPE_PRECISION (TREE_TYPE (@0))
+ && ((GIMPLE && types_compatible_p (TREE_TYPE (@0), TREE_TYPE (@1)))
+ || (GENERIC && TREE_TYPE (@0) == TREE_TYPE (@1))))
+ (cmp @0 @1))))
+
/* Arguments on which one can call get_nonzero_bits to get the bits
possibly set. */
(match with_possible_nonzero_bits
(well, even without the (unsigned long) casts). Isn't this better or do we
want both patches?