This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

patch to fix PR59915


  The following patch fixes

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

  The patch was successfully bootstrapped and tested on x86/x86-64 and
ppc64 (with -mlra).

  Committed as rev. 207007.

2014-01-23  Vladimir Makarov  <vmakarov@redhat.com>

        PR regression/59915
        * lra-constraints.c (simplify_operand_subreg): Spill pseudo if
        there is a danger of looping.


Index: lra-constraints.c
===================================================================
--- lra-constraints.c	(revision 206976)
+++ lra-constraints.c	(working copy)
@@ -1291,9 +1291,20 @@ simplify_operand_subreg (int nop, enum m
        && ! LRA_SUBREG_P (operand))
       || CONSTANT_P (reg) || GET_CODE (reg) == PLUS || MEM_P (reg))
     {
-      /* The class will be defined later in curr_insn_transform.  */
-      enum reg_class rclass
-	= (enum reg_class) targetm.preferred_reload_class (reg, ALL_REGS);
+      enum reg_class rclass;
+
+      if (REG_P (reg)
+	  && curr_insn_set != NULL_RTX
+	  && (REG_P (SET_SRC (curr_insn_set))
+	      || GET_CODE (SET_SRC (curr_insn_set)) == SUBREG))
+	/* There is big probability that we will get the same class
+	   for the new pseudo and we will get the same insn which
+	   means infinite looping.  So spill the new pseudo.  */
+	rclass = NO_REGS;
+      else
+	/* The class will be defined later in curr_insn_transform.  */
+	rclass
+	  = (enum reg_class) targetm.preferred_reload_class (reg, ALL_REGS);
 
       if (get_reload_reg (curr_static_id->operand[nop].type, reg_mode, reg,
 			  rclass, "subreg reg", &new_reg))

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]