aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-09-13 21:19:33 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-09-13 21:19:33 +0200
commit63cdb7a08d7f80b32ba7704b72136fff7ae9f995 (patch)
treeed4e689b86d691d06100c95deb62bd8d2b78c60c
parentea8661cd4794f3b31ea3a4410e9aa5de3df1e3aa (diff)
downloadgcc-63cdb7a08d7f80b32ba7704b72136fff7ae9f995.zip
gcc-63cdb7a08d7f80b32ba7704b72136fff7ae9f995.tar.gz
gcc-63cdb7a08d7f80b32ba7704b72136fff7ae9f995.tar.bz2
re PR tree-optimization/77454 (IMM ERROR w/ -O2 and above)
PR tree-optimization/77454 * tree-ssa-dom.c (optimize_stmt): Set modified flag on stmt after changing GIMPLE_COND. Move update_stmt_if_modified call after this. Formatting fix. * gcc.dg/pr77454.c: New test. From-SVN: r240120
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/pr77454.c28
-rw-r--r--gcc/tree-ssa-dom.c11
4 files changed, 45 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d54fc60..82034a9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-09-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/77454
+ * tree-ssa-dom.c (optimize_stmt): Set modified flag on stmt after
+ changing GIMPLE_COND. Move update_stmt_if_modified call after this.
+ Formatting fix.
+
2016-09-13 Tamar Christina <tamar.christina@arm.com>
* config/aarch64/aarch64-builtins.c
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 64ce0ce..a892737 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2016-09-13 Jakub Jelinek <jakub@redhat.com>
+ PR tree-optimization/77454
+ * gcc.dg/pr77454.c: New test.
+
PR c++/77553
* g++.dg/cpp1y/constexpr-77553.C: New test.
diff --git a/gcc/testsuite/gcc.dg/pr77454.c b/gcc/testsuite/gcc.dg/pr77454.c
new file mode 100644
index 0000000..1bb41c2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr77454.c
@@ -0,0 +1,28 @@
+/* PR tree-optimization/77454 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void
+foo (unsigned char x, char y)
+{
+ while (x != 0)
+ {
+ unsigned char *a = &x;
+ int b;
+
+ if (y != 0)
+ a = (unsigned char *) &y;
+ else if (y + 1 != 0)
+ a = (unsigned char *) &y;
+ for (x = 0; x < 1; ++x)
+ b = 0;
+ for (y = 0; y < 3; ++y)
+ {
+ y = !!y;
+ if (y != 0)
+ x = y;
+ }
+ if ((b != 0 ? -1 : *a) < (y = b))
+ b = 1;
+ }
+}
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 8bf5b3c..b007388 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -1923,12 +1923,11 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si,
{
tree val = NULL;
- update_stmt_if_modified (stmt);
-
if (gimple_code (stmt) == GIMPLE_COND)
val = fold_binary_loc (gimple_location (stmt),
- gimple_cond_code (stmt), boolean_type_node,
- gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
+ gimple_cond_code (stmt), boolean_type_node,
+ gimple_cond_lhs (stmt),
+ gimple_cond_rhs (stmt));
else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
val = gimple_switch_index (swtch_stmt);
@@ -1946,6 +1945,8 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si,
gimple_cond_make_true (as_a <gcond *> (stmt));
else
gcc_unreachable ();
+
+ gimple_set_modified (stmt, true);
}
/* Further simplifications may be possible. */
@@ -1953,6 +1954,8 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si,
}
}
+ update_stmt_if_modified (stmt);
+
/* If we simplified a statement in such a way as to be shown that it
cannot trap, update the eh information and the cfg to match. */
if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))