aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-12-01 13:08:10 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-12-01 13:08:10 +0000
commite19740aef3f3c7c07c67e59560ef96e31e9bff96 (patch)
treec3503f339e15ee5b38b97e471ef1351b57ae324d /gcc
parent9df0192130fd054a9edf84884ca7bbccf8f7679a (diff)
downloadgcc-e19740aef3f3c7c07c67e59560ef96e31e9bff96.zip
gcc-e19740aef3f3c7c07c67e59560ef96e31e9bff96.tar.gz
gcc-e19740aef3f3c7c07c67e59560ef96e31e9bff96.tar.bz2
re PR tree-optimization/64126 (FAIL: gcc.dg/pr37289.c scan-tree-dump original "-\\(long unsigned int\\) x")
2014-12-01 Richard Biener <rguenther@suse.de> 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/fold-const.c13
-rw-r--r--gcc/match.pd18
3 files changed, 23 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c31d8bc..d696865 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-12-01 Richard Biener <rguenther@suse.de>
+
+ 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 <macro@codesourcery.com>
* 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 486ca19..51f3e2f 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 01f610c..42e7c62 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)