diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr37456.C | 14 | ||||
-rw-r--r-- | gcc/tree-ssa-reassoc.c | 32 |
4 files changed, 54 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bad3a25..7d02829 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-09-18 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/37456 + * tree-ssa-reassoc.c (build_and_add_sum): If the stmt we + want to insert after ends a BB insert on the single fallthru + outgoing edge. + 2008-09-18 Andreas Krebbel <krebbel1@de.ibm.com> * doc/invoke.texi: Document -mhard-dfp, -mno-hard-dfp. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7bbee66..cebd673 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-09-18 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/37456 + * testsuite/g++.dg/torture/pr37456.C: New testcase. + 2008-09-18 Uros Bizjak <ubizjak@gmail.com> PR rtl-optimization/37544 diff --git a/gcc/testsuite/g++.dg/torture/pr37456.C b/gcc/testsuite/g++.dg/torture/pr37456.C new file mode 100644 index 0000000..cf2021b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37456.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +int zot(int); +struct bar { + ~bar() { } +}; +int x; +void doit(int a, int b, int c) +{ + bar pn; + int b1 = zot(a) * c; + int b2 = zot(b) * c; + x = b1 + b2; +} diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index e4e7db6..bfe909d 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -859,8 +859,20 @@ build_and_add_sum (tree tmpvar, tree op1, tree op2, enum tree_code opcode) } else { - gsi = gsi_for_stmt (op2def); - gsi_insert_after (&gsi, sum, GSI_NEW_STMT); + if (!stmt_ends_bb_p (op2def)) + { + gsi = gsi_for_stmt (op2def); + gsi_insert_after (&gsi, sum, GSI_NEW_STMT); + } + else + { + edge e; + edge_iterator ei; + + FOR_EACH_EDGE (e, ei, gimple_bb (op2def)->succs) + if (e->flags & EDGE_FALLTHRU) + gsi_insert_on_edge_immediate (e, sum); + } } } else @@ -872,8 +884,20 @@ build_and_add_sum (tree tmpvar, tree op1, tree op2, enum tree_code opcode) } else { - gsi = gsi_for_stmt (op1def); - gsi_insert_after (&gsi, sum, GSI_NEW_STMT); + if (!stmt_ends_bb_p (op1def)) + { + gsi = gsi_for_stmt (op1def); + gsi_insert_after (&gsi, sum, GSI_NEW_STMT); + } + else + { + edge e; + edge_iterator ei; + + FOR_EACH_EDGE (e, ei, gimple_bb (op1def)->succs) + if (e->flags & EDGE_FALLTHRU) + gsi_insert_on_edge_immediate (e, sum); + } } } update_stmt (sum); |