aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-05-06 07:38:27 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-05-06 07:38:27 +0000
commita4f510181a4a6ac49317acdda7036f0370517cb9 (patch)
tree8a41ca6eb178466e811be3f7bc6506293faa1a24 /gcc
parentf5d6c2d81c656ec92b3f190b29260479d63e3ce5 (diff)
downloadgcc-a4f510181a4a6ac49317acdda7036f0370517cb9.zip
gcc-a4f510181a4a6ac49317acdda7036f0370517cb9.tar.gz
gcc-a4f510181a4a6ac49317acdda7036f0370517cb9.tar.bz2
re PR target/70941 (Test miscompiled with -O2.)
2016-05-06 Richard Biener <rguenther@suse.de> PR middle-end/70941 * fold-const.c (split_tree): Always convert to the original type before negating. * gcc.dg/torture/pr70941.c: New testcase. From-SVN: r235943
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr70941.c14
4 files changed, 34 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5c54247..e8f7c8f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2016-05-06 Richard Biener <rguenther@suse.de>
+ PR middle-end/70941
+ * fold-const.c (split_tree): Always convert to the original type
+ before negating.
+
+2016-05-06 Richard Biener <rguenther@suse.de>
+
* fwprop.c (fwprop): Remove duplicate cleanup_cfg call.
(fwprop_addr): Likewise.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 9ef43bf..8aabe21 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -836,11 +836,10 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code,
*minus_litp = *litp, *litp = 0;
if (neg_conp_p)
*conp = negate_expr (*conp);
- if (neg_var_p)
+ if (neg_var_p && var)
{
- /* Convert to TYPE before negating a pointer type expr. */
- if (var && POINTER_TYPE_P (TREE_TYPE (var)))
- var = fold_convert_loc (loc, type, var);
+ /* Convert to TYPE before negating. */
+ var = fold_convert_loc (loc, type, var);
var = negate_expr (var);
}
}
@@ -863,10 +862,12 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code,
else if (*minus_litp)
*litp = *minus_litp, *minus_litp = 0;
*conp = negate_expr (*conp);
- /* Convert to TYPE before negating a pointer type expr. */
- if (var && POINTER_TYPE_P (TREE_TYPE (var)))
- var = fold_convert_loc (loc, type, var);
- var = negate_expr (var);
+ if (var)
+ {
+ /* Convert to TYPE before negating. */
+ var = fold_convert_loc (loc, type, var);
+ var = negate_expr (var);
+ }
}
return var;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9ec6eb7..d5b2df9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-06 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/70941
+ * gcc.dg/torture/pr70941.c: New testcase.
+
2016-05-05 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/57206
diff --git a/gcc/testsuite/gcc.dg/torture/pr70941.c b/gcc/testsuite/gcc.dg/torture/pr70941.c
new file mode 100644
index 0000000..3a57081
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr70941.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-require-effective-target int32plus } */
+
+extern void abort (void);
+
+char a = 0, b = 0, c = 0, d = 0;
+
+int main()
+{
+ a = -(b - 405418259) - ((d && c) ^ 2040097152);
+ if (a != -109)
+ abort();
+ return 0;
+}