aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-09-15 12:35:13 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-09-15 12:35:13 +0000
commit7c05f5c46d5b0db80d65bec5f14a893d0e939c85 (patch)
treefee08b4a7ab85ef71f6d59ed2f9505aea883f3a2
parent63c879fca4a3d82c0b8a5c5f42926419259f01ec (diff)
downloadgcc-7c05f5c46d5b0db80d65bec5f14a893d0e939c85.zip
gcc-7c05f5c46d5b0db80d65bec5f14a893d0e939c85.tar.gz
gcc-7c05f5c46d5b0db80d65bec5f14a893d0e939c85.tar.bz2
re PR tree-optimization/77544 (segfault at -O0 - infinite loop in simplification)
2016-09-15 Richard Biener <rguenther@suse.de> PR middle-end/77544 * fold-const.c (split_tree): Do not split constant ~X. * c-c++-common/torture/pr77544.c: New testcase. From-SVN: r240164
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/fold-const.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/torture/pr77544.c7
4 files changed, 21 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d4ad3c9..019be1a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2016-09-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/77544
+ * fold-const.c (split_tree): Do not split constant ~X.
+
2016-09-15 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/77425
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index bf177b6..e5c2052 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -837,15 +837,16 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code,
var = negate_expr (var);
}
}
+ else if (TREE_CONSTANT (in))
+ *conp = in;
else if (TREE_CODE (in) == BIT_NOT_EXPR
&& code == PLUS_EXPR)
{
- /* -X - 1 is folded to ~X, undo that here. */
+ /* -X - 1 is folded to ~X, undo that here. Do _not_ do this
+ when IN is constant. */
*minus_litp = build_one_cst (TREE_TYPE (in));
var = negate_expr (TREE_OPERAND (in, 0));
}
- else if (TREE_CONSTANT (in))
- *conp = in;
else
var = in;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7f0746d..6a7cc9c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-09-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/77544
+ * c-c++-common/torture/pr77544.c: New testcase.
+
2016-09-15 Jakub Jelinek <jakub@redhat.com>
PR middle-end/77475
diff --git a/gcc/testsuite/c-c++-common/torture/pr77544.c b/gcc/testsuite/c-c++-common/torture/pr77544.c
new file mode 100644
index 0000000..1d1ce3f
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/torture/pr77544.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+struct {
+ long a : 17;
+} b;
+int c, d;
+void e() { b.a = d + c + ~(long)(302806U >> 0); }