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]

Re: register renaming


A couple of bug fixes: bad updating of dead notes and incorrect mode with a
register substitution on x86.

*** regrename.c	Thu Mar 30 20:39:29 2000
--- regrename.c	Thu Mar 30 20:48:41 2000
@@ -504,27 +504,45 @@ replace_reg_in_block (du, uid_ruid, def,
 {
   int du_idx, status = 1;
   int r = REGNO (reg_def);
+  rtx death_note;
+  rtx new_reg = gen_rtx_REG (GET_MODE (reg_def), avail_reg);
 
-  rr_replace_reg (VARRAY_RTX (*uid_ruid, def), reg_def,
-		  gen_rtx_REG (GET_MODE (reg_def), avail_reg),
-		  DESTINATION, VARRAY_RTX (*uid_ruid, def),
+
+  rr_replace_reg (PATTERN (VARRAY_RTX (*uid_ruid, def)), reg_def,
+		  new_reg, DESTINATION, VARRAY_RTX (*uid_ruid, def),
 		  &status);
   if (!status)
     return status;
 
+  death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_DEAD, reg_def);
+  if (!death_note)
+    death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_UNUSED, reg_def);
+  if (death_note)
+    rr_replace_reg (death_note, reg_def, new_reg, 0,
+		    VARRAY_RTX (*uid_ruid, def), &status);
+
   for (du_idx = def + 1; du_idx < du->high_bound; du_idx++)
     {
       rtx reg_use;
+      rtx new_reg;
       if (GET_RTX_CLASS (GET_CODE (VARRAY_RTX (*uid_ruid, du_idx))) != 'i')
 	continue;
       reg_use = regno_use_in (r, PATTERN (VARRAY_RTX (*uid_ruid, du_idx)));
 
       if (reg_use && TEST_BIT (du->uses[r], du_idx))
 	{
-	  rr_replace_reg (VARRAY_RTX (*uid_ruid, du_idx), reg_use,
-			  gen_rtx_REG (GET_MODE (reg_use), avail_reg),
-			  SOURCE, VARRAY_RTX (*uid_ruid, du_idx),
+	  new_reg = gen_rtx_REG (GET_MODE (reg_use), avail_reg);
+	  rr_replace_reg (PATTERN (VARRAY_RTX (*uid_ruid, du_idx)), reg_use,
+			  new_reg, SOURCE, VARRAY_RTX (*uid_ruid, du_idx),
 			  &status);
+	  death_note = find_reg_note (VARRAY_RTX (*uid_ruid, du_idx),
+				      REG_DEAD, reg_use);
+	  if (!death_note)
+	    death_note = find_reg_note (VARRAY_RTX (*uid_ruid, du_idx),
+					REG_UNUSED, reg_use);
+	  if (death_note)
+	    rr_replace_reg (death_note, reg_use, new_reg, 0,
+			    VARRAY_RTX (*uid_ruid, def), &status);
 	  SET_BIT (du->uses[avail_reg], du_idx);
 	  RESET_BIT (du->uses[r], du_idx);
 	  if (!status)
@@ -563,7 +581,10 @@ rr_replace_reg (x, reg_use, reg_sub, rep
     case REG:
       if (REGNO (x) == REGNO (reg_use))
 	{
+	  if (GET_MODE (x) == GET_MODE (reg_use))
 	  return reg_sub;
+	  else
+	    return gen_rtx_REG (GET_MODE (x), REGNO (reg_use));
 	}
       return x;
 
@@ -727,10 +748,15 @@ consider_use (insn, regno, def_block, us
   if (condmove_p (insn))
     return 0;
 
-  /* Don't consider register if the only use is in a USE */
   reg_use = regno_first_use_in (regno, PATTERN (insn));
   if (reg_use)
     {
+      /* Don't consider multi-reg values. */
+      if (HARD_REGNO_NREGS (regno, GET_MODE (reg_use)) != 1
+	  && GET_MODE (reg_use) != CCmode)
+	return 0;
+
+      /* Don't consider register if the only use is in a USE */
       if (reg_mentioned_p (gen_rtx_USE (VOIDmode, reg_use),
 			   PATTERN (insn)))
 	return 0;

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