diff options
author | Richard Biener <rguenther@suse.de> | 2016-09-15 07:17:45 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-09-15 07:17:45 +0000 |
commit | d08615f28f4f12a5f633e11a460f9187a54a59af (patch) | |
tree | 7a8ca019034d9bf3b7353d34bcac996b3a07b9d1 /gcc | |
parent | 46aa019a01e8278b12961c63fb457306e09cf13f (diff) | |
download | gcc-d08615f28f4f12a5f633e11a460f9187a54a59af.zip gcc-d08615f28f4f12a5f633e11a460f9187a54a59af.tar.gz gcc-d08615f28f4f12a5f633e11a460f9187a54a59af.tar.bz2 |
re PR tree-optimization/77514 (ICE in VN_INFO_GET, at tree-ssa-sccvn.c:406 w/ -O2 (and above))
2016-09-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/77514
* tree-ssa-pre.c (create_expression_by_pieces): Handle garbage
only forced_stmts sequence.
* gcc.dg/torture/pr77514.c: New testcase.
From-SVN: r240153
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr77514.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 16 |
4 files changed, 47 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4585076..0c74a2c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-09-15 Richard Biener <rguenther@suse.de> + + PR tree-optimization/77514 + * tree-ssa-pre.c (create_expression_by_pieces): Handle garbage + only forced_stmts sequence. + 2016-09-15 Kugan Vivekanandarajah <kuganv@linaro.org> * tree-ssanames.h (FOR_EACH_SSA_NAME): New. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 023fcd4..623a764 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-09-15 Richard Biener <rguenther@suse.de> + + PR tree-optimization/77514 + * gcc.dg/torture/pr77514.c: New testcase. + 2016-09-14 Jakub Jelinek <jakub@redhat.com> PR c++/77549 diff --git a/gcc/testsuite/gcc.dg/torture/pr77514.c b/gcc/testsuite/gcc.dg/torture/pr77514.c new file mode 100644 index 0000000..464841c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr77514.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +void +m1 (char l0, char e8, int hw) +{ + char *rs = &l0; + +yu: + l0 = 1; + while (l0 != 0) + { + l0 = -l0; + l0 += (*rs ^ (l0 &= 1)); + } + for (;;) + { + if (hw != 0) + goto yu; + rs = &e8; + } +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 67a0513..d1fe72c 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2879,7 +2879,21 @@ create_expression_by_pieces (basic_block block, pre_expr expr, gimple_seq_discard (forced_stmts); return folded; } - + /* Likewise if we simplified to sth not queued for insertion. */ + bool found = false; + gsi = gsi_start (forced_stmts); + for (; !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple *stmt = gsi_stmt (gsi); + tree forcedname = gimple_get_lhs (stmt); + if (forcedname == folded) + found = true; + } + if (! found) + { + gimple_seq_discard (forced_stmts); + return folded; + } gcc_assert (TREE_CODE (folded) == SSA_NAME); /* If we have any intermediate expressions to the value sets, add them |