diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr43679.c | 33 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 5 |
4 files changed, 46 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b221b55530f..c7d4ecbf02b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-04-08 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/43679 + * tree-ssa-pre.c (eliminate): Only propagate copies. + 2010-04-08 Jakub Jelinek <jakub@redhat.com> PR bootstrap/43681 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 39fb6f02466..51cf82d59bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-08 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/43679 + * gcc.c-torture/compile/pr43679.c: New testcase. + 2010-04-08 Jakub Jelinek <jakub@redhat.com> PR debug/43670 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr43679.c b/gcc/testsuite/gcc.c-torture/compile/pr43679.c new file mode 100644 index 00000000000..c45ef9f965f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr43679.c @@ -0,0 +1,33 @@ +unsigned g_5; +int g_7; +int g_23[2]; +int *g_29 = &g_23[0]; +int **g_59; +unsigned long g_186; + +int foo (int, int); +int bar (int); + +void func_37 (long p_38) +{ + int *l_39 = &g_7; + *l_39 = (*l_39 + || + (foo + (((*g_29 != *l_39, ((bar (g_59 != &l_39), 0), 0))), + 0))); + foo (*l_39, 0); + int **l_256 = &l_39; + { + for (0; g_186; 0) + { + *l_256 = *l_256; + if (g_5) + goto lbl_270; + *l_39 &= 0; + } + } +lbl_270: + ; +} + diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 35ce4ccd0e6..ae630df1b48 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -4341,15 +4341,16 @@ eliminate (void) for (i = 0; VEC_iterate (gimple, to_remove, i, stmt); ++i) { tree lhs = gimple_assign_lhs (stmt); + tree rhs = gimple_assign_rhs1 (stmt); use_operand_p use_p; gimple use_stmt; /* If there is a single use only, propagate the equivalency instead of keeping the copy. */ if (TREE_CODE (lhs) == SSA_NAME + && TREE_CODE (rhs) == SSA_NAME && single_imm_use (lhs, &use_p, &use_stmt) - && may_propagate_copy (USE_FROM_PTR (use_p), - gimple_assign_rhs1 (stmt))) + && may_propagate_copy (USE_FROM_PTR (use_p), rhs)) { SET_USE (use_p, gimple_assign_rhs1 (stmt)); update_stmt (use_stmt); |