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] UNSPEC_* source register handling in reg-stack.c


Hello!

This is followup of http://gcc.gnu.org/ml/gcc-patches/2004-04/msg01587.html

Patch is tested on i686-pc-linux-gnu, also tested by compiling whetstone benchmark.

2004-04-29 Uros Bizjak <uros@kss-loka.si>

       * reg-stack.c (subst_stack_regs_pat): UNSPEC_SIN, UNSPEC_COS,
       UNSPEC_FRNDINT, UNSPEC_F2XM1: abort() if src1 dies.
       UNSPEC_SINCOS_COS, UNSPEC_TAN_ONE, UNSPEC_XTRACT_FRACT: Same.
       UNSPEC_SINCOS_SIN, UNSPEC_TAN_TAN, UNSPEC_XTRACT_EXP: Same.

Uros.
Index: reg-stack.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/reg-stack.c,v
retrieving revision 1.149
diff -u -p -r1.149 reg-stack.c
--- reg-stack.c	29 Apr 2004 07:19:24 -0000	1.149
+++ reg-stack.c	29 Apr 2004 07:50:11 -0000
@@ -1733,18 +1733,15 @@ subst_stack_regs_pat (rtx insn, stack re
 
 		emit_swap_insn (insn, regstack, *src1);
 
+		/* Input should never die, it is
+		   replaced with output.  */
 		src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
+		if (src1_note)
+		  abort();
 
 		if (STACK_REG_P (*dest))
 		  replace_reg (dest, FIRST_STACK_REG);
 
-		if (src1_note)
-		  {
-		    replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
-		    regstack->top--;
-		    CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
-		  }
-
 		replace_reg (src1, FIRST_STACK_REG);
 		break;
 
@@ -1849,7 +1846,11 @@ subst_stack_regs_pat (rtx insn, stack re
 
 		emit_swap_insn (insn, regstack, *src1);
 
+		/* Input should never die, it is
+		   replaced with output.  */
 		src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
+		if (src1_note)
+		  abort();
 
 		/* Push the result back onto stack. Empty stack slot
 		   will be filled in second part of insn. */
@@ -1859,12 +1860,6 @@ subst_stack_regs_pat (rtx insn, stack re
 		  replace_reg (dest, FIRST_STACK_REG);
 		}
 
-		if (src1_note)
-		  {
-		    replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
-		    regstack->top--;
-		    CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
-		  }
 		replace_reg (src1, FIRST_STACK_REG);
 		break;
 
@@ -1878,7 +1873,11 @@ subst_stack_regs_pat (rtx insn, stack re
 
 		emit_swap_insn (insn, regstack, *src1);
 
+		/* Input should never die, it is
+		   replaced with output.  */
 		src1_note = find_regno_note (insn, REG_DEAD, REGNO (*src1));
+		if (src1_note)
+		  abort();
 
 		/* Push the result back onto stack. Fill empty slot from
 		   first part of insn and fix top of stack pointer.  */
@@ -1889,13 +1888,6 @@ subst_stack_regs_pat (rtx insn, stack re
 
 		  regstack->top++;
 		}
-
-		if (src1_note)
-		  {
-		    replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG);
-		    regstack->top--;
-		    CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (*src1));
-		  }
 
 		replace_reg (src1, FIRST_STACK_REG);
 		break;

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