diff options
author | Easwaran Raman <eraman@gcc.gnu.org> | 2013-05-28 17:27:54 +0000 |
---|---|---|
committer | Easwaran Raman <eraman@gcc.gnu.org> | 2013-05-28 17:27:54 +0000 |
commit | 9daf6dbb21f8afce247c361f4f2a3ce435908cba (patch) | |
tree | 4b2ca021e859bc06db871b030b6e75d2200ef1c6 /gcc/tree-ssa-reassoc.c | |
parent | 4fb5478c936efb66fb417557182cb7cf7f4513b4 (diff) | |
download | gcc-9daf6dbb21f8afce247c361f4f2a3ce435908cba.zip gcc-9daf6dbb21f8afce247c361f4f2a3ce435908cba.tar.gz gcc-9daf6dbb21f8afce247c361f4f2a3ce435908cba.tar.bz2 |
re PR tree-optimization/57337 (416.gamess ICE on x86 after r199048)
2013-05-28 Easwaran Raman <eraman@google.com>
PR tree-optimization/57337
* tree-ssa-reassoc.c (appears_later_in_bb): New function.
(find_insert_point): Correctly identify the insertion point
when two statements with the same UID is compared.
From-SVN: r199385
Diffstat (limited to 'gcc/tree-ssa-reassoc.c')
-rw-r--r-- | gcc/tree-ssa-reassoc.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 8e13763..24ad390 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -2866,6 +2866,31 @@ not_dominated_by (gimple a, gimple b) } +/* Among STMT1 and STMT2, return the statement that appears later. Both + statements are in same BB and have the same UID. */ + +static gimple +appears_later_in_bb (gimple stmt1, gimple stmt2) +{ + unsigned uid = gimple_uid (stmt1); + gimple_stmt_iterator gsi = gsi_for_stmt (stmt1); + gsi_next (&gsi); + if (gsi_end_p (gsi)) + return stmt1; + for (; !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple stmt = gsi_stmt (gsi); + + /* If STMT has a different UID than STMT1 and we haven't seen + STMT2 during traversal, we know STMT1 appears later. */ + if (gimple_uid (stmt) != uid) + return stmt1; + else if (stmt == stmt2) + return stmt2; + } + gcc_unreachable (); +} + /* Find the statement after which STMT must be moved so that the dependency from DEP_STMT to STMT is maintained. */ @@ -2875,7 +2900,11 @@ find_insert_point (gimple stmt, gimple dep_stmt) gimple insert_stmt = stmt; if (dep_stmt == NULL) return stmt; - if (not_dominated_by (insert_stmt, dep_stmt)) + if (gimple_uid (insert_stmt) == gimple_uid (dep_stmt) + && gimple_bb (insert_stmt) == gimple_bb (dep_stmt) + && insert_stmt != dep_stmt) + insert_stmt = appears_later_in_bb (insert_stmt, dep_stmt); + else if (not_dominated_by (insert_stmt, dep_stmt)) insert_stmt = dep_stmt; return insert_stmt; } |