diff options
author | Richard Biener <rguenther@suse.de> | 2016-09-15 12:35:13 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-09-15 12:35:13 +0000 |
commit | 7c05f5c46d5b0db80d65bec5f14a893d0e939c85 (patch) | |
tree | fee08b4a7ab85ef71f6d59ed2f9505aea883f3a2 | |
parent | 63c879fca4a3d82c0b8a5c5f42926419259f01ec (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fold-const.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/torture/pr77544.c | 7 |
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); } |