On Thu, 23 Nov 2017, Richard Biener wrote:
What about 0 - ptr? (ok, that's even more weird)
* match.pd (0-ptr): New transformation.
Regtested on gcc112.
--
Marc Glisse
Index: gcc/match.pd
===================================================================
--- gcc/match.pd (revision 255118)
+++ gcc/match.pd (working copy)
@@ -2449,23 +2449,27 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(minus @0 { tem; })))))
/* Convert x+x into x*2. */
(simplify
(plus @0 @0)
(if (SCALAR_FLOAT_TYPE_P (type))
(mult @0 { build_real (type, dconst2); })
(if (INTEGRAL_TYPE_P (type))
(mult @0 { build_int_cst (type, 2); }))))
+/* 0 - X -> -X. */
(simplify
(minus integer_zerop @1)
(negate @1))
+(simplify
+ (pointer_diff integer_zerop @1)
+ (negate (convert @1)))
/* (ARG0 - ARG1) is the same as (-ARG1 + ARG0). So check whether
ARG0 is zero and X + ARG0 reduces to X, since that would mean
(-ARG1 + ARG0) reduces to -ARG1. */
(simplify
(minus real_zerop@0 @1)
(if (fold_real_zero_addition_p (type, @0, 0))
(negate @1)))
/* Transform x * -1 into -x. */