From e19740aef3f3c7c07c67e59560ef96e31e9bff96 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 1 Dec 2014 13:08:10 +0000 Subject: [PATCH] re PR tree-optimization/64126 (FAIL: gcc.dg/pr37289.c scan-tree-dump original "-\\(long unsigned int\\) x") 2014-12-01 Richard Biener PR middle-end/64126 * match.pd: Allow conversions in ~A + 1 -> -A, add -A - 1 -> ~A and -1 - A -> ~A. * fold-const.c (fold_binary_loc): Remove transforms here. From-SVN: r218210 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 13 ------------- gcc/match.pd | 18 ++++++++++++++++-- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c31d8bcd462..d6968653f4d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-12-01 Richard Biener + + PR middle-end/64126 + * match.pd: Allow conversions in ~A + 1 -> -A, add -A - 1 -> ~A + and -1 - A -> ~A. + * fold-const.c (fold_binary_loc): Remove transforms here. + 2014-12-01 Maciej W. Rozycki * config/mips/mips.c (mips16_build_call_stub): Move the save of diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 486ca19aa38..51f3e2f3de3 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -10391,19 +10391,6 @@ fold_binary_loc (location_t loc, negate_expr (arg1)), fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0))); - /* Convert -A - 1 to ~A. */ - if (TREE_CODE (arg0) == NEGATE_EXPR - && integer_each_onep (arg1) - && !TYPE_OVERFLOW_TRAPS (type)) - return fold_build1_loc (loc, BIT_NOT_EXPR, type, - fold_convert_loc (loc, type, - TREE_OPERAND (arg0, 0))); - - /* Convert -1 - A to ~A. */ - if (TREE_CODE (type) != COMPLEX_TYPE - && integer_all_onesp (arg0)) - return fold_build1_loc (loc, BIT_NOT_EXPR, type, op1); - /* X - (X / Y) * Y is X % Y. */ if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type)) diff --git a/gcc/match.pd b/gcc/match.pd index 01f610c6b6f..42e7c62cc79 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -484,8 +484,22 @@ along with GCC; see the file COPYING3. If not see /* ~A + 1 -> -A */ (simplify - (plus (bit_not @0) integer_each_onep) - (negate @0)) + (plus (convert? (bit_not @0)) integer_each_onep) + (if (tree_nop_conversion_p (type, TREE_TYPE (@0))) + (negate (convert @0)))) + + /* -A - 1 -> ~A */ + (simplify + (minus (convert? (negate @0)) integer_each_onep) + (if (!TYPE_OVERFLOW_TRAPS (type) + && tree_nop_conversion_p (type, TREE_TYPE (@0))) + (bit_not (convert @0)))) + + /* -1 - A -> ~A */ + (simplify + (minus integer_all_onesp @0) + (if (TREE_CODE (type) != COMPLEX_TYPE) + (bit_not @0))) /* (T)(P + A) - (T)P -> (T) A */ (for add (plus pointer_plus) -- 2.30.2