http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60418

--- Comment #21 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Can you try if sorting on gimple_uid would help this or not?  I think it would
be something like:
--- gcc/tree-ssa-reassoc.c.jj    2014-02-19 06:59:35.000000000 +0100
+++ gcc/tree-ssa-reassoc.c    2014-03-10 17:26:06.707683626 +0100
@@ -506,11 +506,17 @@ sort_by_operand_rank (const void *pa, co
     }

   /* Lastly, make sure the versions that are the same go next to each
-     other.  We use SSA_NAME_VERSION because it's stable.  */
+     other.  Prefer gimple_uid of def stmt, fall back to SSA_NAME_VERSION
+     if more stmts have the same uid.  */
   if ((oeb->rank - oea->rank == 0)
       && TREE_CODE (oea->op) == SSA_NAME
       && TREE_CODE (oeb->op) == SSA_NAME)
     {
+      unsigned int uida = gimple_uid (SSA_NAME_DEF_STMT (oea->op));
+      unsigned int uidb = gimple_uid (SSA_NAME_DEF_STMT (oeb->op));
+      if (uida && uidb && uida != uidb)
+    return uidb - uida;
+
       if (SSA_NAME_VERSION (oeb->op) != SSA_NAME_VERSION (oea->op))
     return SSA_NAME_VERSION (oeb->op) - SSA_NAME_VERSION (oea->op);
       else

(make check RUNTESTFLAGS='--target_board=unix\{-m32,-m64\} dg.exp=*reassoc*
tree-ssa.exp=*reassoc*'
with it still passes, haven't tested it more than that).

Reply via email to