Hello,
I hadn't implemented this simplification because I think it is invalid
code, but apparently people do write it, so we might as well handle it
sensibly. This also happens to work around PR 83104 (already fixed).
bootstrap+regtest on powerpc64le-unknown-linux-gnu.
2017-11-22 Marc Glisse <[email protected]>
* match.pd (ptr-0): New transformation.
--
Marc GlisseIndex: gcc/match.pd
===================================================================
--- gcc/match.pd (revision 255052)
+++ gcc/match.pd (working copy)
@@ -95,20 +95,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(for op (plus pointer_plus minus bit_ior bit_xor)
(simplify
(op @0 integer_zerop)
(non_lvalue @0)))
/* 0 +p index -> (type)index */
(simplify
(pointer_plus integer_zerop @1)
(non_lvalue (convert @1)))
+/* ptr - 0 -> (type)ptr */
+(simplify
+ (pointer_diff @0 integer_zerop)
+ (convert @0))
+
/* See if ARG1 is zero and X + ARG1 reduces to X.
Likewise if the operands are reversed. */
(simplify
(plus:c @0 real_zerop@1)
(if (fold_real_zero_addition_p (type, @1, 0))
(non_lvalue @0)))
/* See if ARG1 is zero and X - ARG1 reduces to X. */
(simplify
(minus @0 real_zerop@1)