And here is the patch that breaks things. By moving df_defs_record() *after* df_get_call_refs() most times collection_rec remains sorted, and about 50M instructions are avoided in qsort() calls of df_canonize_collection_rec().

Unfortunately this does not work. Sometimes cc1 crashes, for example because regstack is empty in subst_stack_regs_in_debug_insn().

Any ideas for ensuring proper ordering of collection_rec?


Thanks,
Dimitris
=== modified file 'gcc/df-scan.c'
--- gcc/df-scan.c       2011-07-08 01:28:55 +0000
+++ gcc/df-scan.c       2011-07-08 03:38:38 +0000
@@ -3412,8 +3412,9 @@
   VEC_truncate (df_ref, collection_rec->eq_use_vec, 0);
   VEC_truncate (df_mw_hardreg_ptr, collection_rec->mw_vec, 0);
 
-  /* Record register defs.  */
-  df_defs_record (collection_rec, PATTERN (insn_info->insn), bb, insn_info, 0);
+  if (CALL_P (insn_info->insn))
+    df_get_call_refs (collection_rec, bb, insn_info,
+                     (is_cond_exec) ? DF_REF_CONDITIONAL : 0);
 
   /* Process REG_EQUIV/REG_EQUAL notes.  */
   for (note = REG_NOTES (insn_info->insn); note;
@@ -3421,33 +3422,33 @@
     {
       switch (REG_NOTE_KIND (note))
         {
+         /* first write DF_REF_BASE */
+        case REG_NON_LOCAL_GOTO:
+          /* The frame ptr is used by a non-local goto.  */
+          df_ref_record (DF_REF_BASE, collection_rec,
+                         regno_reg_rtx[FRAME_POINTER_REGNUM],
+                         NULL, bb, insn_info,
+                         DF_REF_REG_USE, 0);
+#if !HARD_FRAME_POINTER_IS_FRAME_POINTER
+          df_ref_record (DF_REF_BASE, collection_rec,
+                         regno_reg_rtx[HARD_FRAME_POINTER_REGNUM],
+                         NULL, bb, insn_info,
+                         DF_REF_REG_USE, 0);
+#endif
+          break;
         case REG_EQUIV:
         case REG_EQUAL:
           df_uses_record (collection_rec,
                           &XEXP (note, 0), DF_REF_REG_USE,
                           bb, insn_info, DF_REF_IN_NOTE);
           break;
-        case REG_NON_LOCAL_GOTO:
-          /* The frame ptr is used by a non-local goto.  */
-          df_ref_record (DF_REF_BASE, collection_rec,
-                         regno_reg_rtx[FRAME_POINTER_REGNUM],
-                         NULL, bb, insn_info,
-                         DF_REF_REG_USE, 0);
-#if !HARD_FRAME_POINTER_IS_FRAME_POINTER
-          df_ref_record (DF_REF_BASE, collection_rec,
-                         regno_reg_rtx[HARD_FRAME_POINTER_REGNUM],
-                         NULL, bb, insn_info,
-                         DF_REF_REG_USE, 0);
-#endif
-          break;
         default:
           break;
         }
     }
 
-  if (CALL_P (insn_info->insn))
-    df_get_call_refs (collection_rec, bb, insn_info,
-                     (is_cond_exec) ? DF_REF_CONDITIONAL : 0);
+  /* Record register defs.  */
+  df_defs_record (collection_rec, PATTERN (insn_info->insn), bb, insn_info, 0);
 
   /* Record the register uses.  */
   df_uses_record (collection_rec,

Reply via email to