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
This commit is contained in:
Jakub Jelinek 2016-09-13 21:19:33 +02:00 committed by Jakub Jelinek
parent ea8661cd47
commit 63cdb7a08d
4 changed files with 45 additions and 4 deletions

View File

@ -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

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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))