aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-reassoc.c
diff options
context:
space:
mode:
authorEaswaran Raman <eraman@gcc.gnu.org>2013-05-28 17:27:54 +0000
committerEaswaran Raman <eraman@gcc.gnu.org>2013-05-28 17:27:54 +0000
commit9daf6dbb21f8afce247c361f4f2a3ce435908cba (patch)
tree4b2ca021e859bc06db871b030b6e75d2200ef1c6 /gcc/tree-ssa-reassoc.c
parent4fb5478c936efb66fb417557182cb7cf7f4513b4 (diff)
downloadgcc-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.c31
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;
}