diff mbox

patch to fix PR60317

Message ID 530DFE2C.4010601@redhat.com
State New
Headers show

Commit Message

Vladimir Makarov Feb. 26, 2014, 2:46 p.m. UTC
Sorry, my yesterday mail was lost (because of my computer freeze on 
unstable kernel).  So I am sending the email again.

Here is the patch to fix

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

The patch speeds up the compiler in 5 times on this patalogical test and 
making LRA faster reload on this test as it should be.

The patch has very minor effect on SPEC2000 (only few tests have a 
different code and there is no visible SPEC2000 rates changes).

2014-02-25  Vladimir Makarov  <vmakarov@redhat.com>

	PR rtl-optimization/60317
	* params.def (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS): New.
	* params.h (LRA_MAX_CONSIDERED_RELOAD_PSEUDOS): New.
	* lra-assigns.c: Include params.h.
	(spill_for): Use LRA_MAX_CONSIDERED_RELOAD_PSEUDOS as guard for
	other reload pseudos considerations.
diff mbox

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 32a74a7..616d8ec 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@ 
+2014-02-25  Vladimir Makarov  <vmakarov@redhat.com>
+
+	PR rtl-optimization/60317
+	* params.def (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS): New.
+	* params.h (LRA_MAX_CONSIDERED_RELOAD_PSEUDOS): New.
+	* lra-assigns.c: Include params.h.
+	(spill_for): Use LRA_MAX_CONSIDERED_RELOAD_PSEUDOS as guard for
+	other reload pseudos considerations.
+
 2014-02-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
 	* config/rs6000/vector.md (*vector_unordered<mode>): Change split
diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c
index 268edcc..f94ebe6 100644
--- a/gcc/lra-assigns.c
+++ b/gcc/lra-assigns.c
@@ -94,6 +94,7 @@  along with GCC; see the file COPYING3.	If not see
 #include "df.h"
 #include "ira.h"
 #include "sparseset.h"
+#include "params.h"
 #include "lra-int.h"
 
 /* Array containing corresponding values of function
@@ -896,14 +897,16 @@  spill_for (int regno, bitmap spilled_pseudo_bitmap)
 	    }
 	}
       n = 0;
-      EXECUTE_IF_SET_IN_SPARSESET (live_range_reload_inheritance_pseudos,
-				   reload_regno)
-	if ((int) reload_regno != regno
-	    && (ira_reg_classes_intersect_p
-		[rclass][regno_allocno_class_array[reload_regno]])
-	    && live_pseudos_reg_renumber[reload_regno] < 0
-	    && find_hard_regno_for (reload_regno, &cost, -1) < 0)
-	  sorted_reload_pseudos[n++] = reload_regno;
+      if (sparseset_cardinality (live_range_reload_inheritance_pseudos)
+	  <= LRA_MAX_CONSIDERED_RELOAD_PSEUDOS)
+	EXECUTE_IF_SET_IN_SPARSESET (live_range_reload_inheritance_pseudos,
+				     reload_regno)
+	  if ((int) reload_regno != regno
+	      && (ira_reg_classes_intersect_p
+		  [rclass][regno_allocno_class_array[reload_regno]])
+	      && live_pseudos_reg_renumber[reload_regno] < 0
+	      && find_hard_regno_for (reload_regno, &cost, -1) < 0)
+	    sorted_reload_pseudos[n++] = reload_regno;
       EXECUTE_IF_SET_IN_BITMAP (&spill_pseudos_bitmap, 0, spill_regno, bi)
 	{
 	  update_lives (spill_regno, true);
diff --git a/gcc/params.def b/gcc/params.def
index ad63a37..dd2e2cd 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -821,6 +821,11 @@  DEFPARAM (PARAM_IRA_LOOP_RESERVED_REGS,
 	  "The number of registers in each class kept unused by loop invariant motion",
 	  2, 0, 0)
 
+DEFPARAM (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS,
+	  "lra-max-considered-reload-pseudos",
+	  "The max number of reload pseudos which are considered during spilling a non-reload pseudo",
+	  500, 0, 0)
+
 /* Switch initialization conversion will refuse to create arrays that are
    bigger than this parameter times the number of switch branches.  */
 
diff --git a/gcc/params.h b/gcc/params.h
index 64f3a0f..0d6daa2 100644
--- a/gcc/params.h
+++ b/gcc/params.h
@@ -196,6 +196,8 @@  extern void init_param_values (int *params);
   PARAM_VALUE (PARAM_IRA_MAX_CONFLICT_TABLE_SIZE)
 #define IRA_LOOP_RESERVED_REGS \
   PARAM_VALUE (PARAM_IRA_LOOP_RESERVED_REGS)
+#define LRA_MAX_CONSIDERED_RELOAD_PSEUDOS \
+  PARAM_VALUE (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS)
 #define SWITCH_CONVERSION_BRANCH_RATIO \
   PARAM_VALUE (PARAM_SWITCH_CONVERSION_BRANCH_RATIO)
 #define LOOP_INVARIANT_MAX_BBS_IN_LOOP \