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] ARM: use plus_constant and other cleanups


This patch cleans up a number of minor defects in the ARM back-end. 
None of them are really fatal, but in some cases we were producing RTL
that wasn't really correct or was non-canonical.

- We would occasionally output (PLUS (reg) (const_int 0))
- We generated SET with a mode other than VOIDmode.

Tested on arm-elf and on arm-netbsd.

2005-11-22  Richard Earnshaw  <richard.earnshaw@arm.com>

	* arm.c (emit_set_insn): New function.
	(arm_split_constant): Call it.
	(arm_gen_compare_reg, arm_reload_in_hi, arm_reload_out_hi): Likewise.
	(arm_legitimize_address): Likewise.  Use plus_constant.
	(arm_expand_prologue): Likewise.  Use VOIDmode in SET.
	(thumb_expand_prologue): Likewise.
	(arm_gen_load_multiple): Use VOIDmode in SET.
	(arm_gen_store_multiple): Likewise.
	(vfp_emit_fstmx): Likewise.  Use plus_constant.
	(emit_multi_reg_push): Likewise.
	(emit_sfm): Use plus_constant.
	

*** arm.c	(revision 107360)
--- arm.c	(local)
*************** static rtx arm_expand_binop_builtin (enu
*** 142,147 ****
--- 142,148 ----
  static rtx arm_expand_unop_builtin (enum insn_code, tree, rtx, int);
  static rtx arm_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
  static void emit_constant_insn (rtx cond, rtx pattern);
+ static rtx emit_set_insn (rtx, rtx);
  static int arm_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
  				  tree, bool);
  
*************** enum tls_reloc {
*** 708,713 ****
--- 709,722 ----
    TLS_LE32
  };
  
+ /* Emit an insn that's a simple single-set.  Both the operands must be known
+    to be valid.  */
+ inline static rtx
+ emit_set_insn (rtx x, rtx y)
+ {
+   return emit_insn (gen_rtx_SET (VOIDmode, x, y));
+ }
+ 
  /* Return the number of bits set in VALUE.  */
  static unsigned
  bit_count (unsigned long value)
*************** arm_split_constant (enum rtx_code code, 
*** 1673,1694 ****
  	    {
  	      /* Currently SET is the only monadic value for CODE, all
  		 the rest are diadic.  */
! 	      emit_insn (gen_rtx_SET (VOIDmode, target, GEN_INT (val)));
  	      return 1;
  	    }
  	  else
  	    {
  	      rtx temp = subtargets ? gen_reg_rtx (mode) : target;
  
! 	      emit_insn (gen_rtx_SET (VOIDmode, temp, GEN_INT (val)));
  	      /* For MINUS, the value is subtracted from, since we never
  		 have subtraction of a constant.  */
  	      if (code == MINUS)
! 		emit_insn (gen_rtx_SET (VOIDmode, target,
! 					gen_rtx_MINUS (mode, temp, source)));
  	      else
! 		emit_insn (gen_rtx_SET (VOIDmode, target,
! 					gen_rtx_fmt_ee (code, mode, source, temp)));
  	      return 2;
  	    }
  	}
--- 1682,1702 ----
  	    {
  	      /* Currently SET is the only monadic value for CODE, all
  		 the rest are diadic.  */
! 	      emit_set_insn (target, GEN_INT (val));
  	      return 1;
  	    }
  	  else
  	    {
  	      rtx temp = subtargets ? gen_reg_rtx (mode) : target;
  
! 	      emit_set_insn (temp, GEN_INT (val));
  	      /* For MINUS, the value is subtracted from, since we never
  		 have subtraction of a constant.  */
  	      if (code == MINUS)
! 		emit_set_insn (target, gen_rtx_MINUS (mode, temp, source));
  	      else
! 		emit_set_insn (target,
! 			       gen_rtx_fmt_ee (code, mode, source, temp));
  	      return 2;
  	    }
  	}
*************** arm_legitimize_address (rtx x, rtx orig_
*** 3970,3980 ****
  	    }
  
  	  base_reg = gen_reg_rtx (SImode);
! 	  val = force_operand (gen_rtx_PLUS (SImode, xop0,
! 					     GEN_INT (n)), NULL_RTX);
  	  emit_move_insn (base_reg, val);
! 	  x = (low_n == 0 ? base_reg
! 	       : gen_rtx_PLUS (SImode, base_reg, GEN_INT (low_n)));
  	}
        else if (xop0 != XEXP (x, 0) || xop1 != XEXP (x, 1))
  	x = gen_rtx_PLUS (SImode, xop0, xop1);
--- 3978,3986 ----
  	    }
  
  	  base_reg = gen_reg_rtx (SImode);
! 	  val = force_operand (plus_constant (xop0, n), NULL_RTX);
  	  emit_move_insn (base_reg, val);
! 	  x = plus_constant (base_reg, low_n);
  	}
        else if (xop0 != XEXP (x, 0) || xop1 != XEXP (x, 1))
  	x = gen_rtx_PLUS (SImode, xop0, xop1);
*************** arm_legitimize_address (rtx x, rtx orig_
*** 4022,4028 ****
  	  index -= mask;
  	}
        base_reg = force_reg (SImode, GEN_INT (base));
!       x = gen_rtx_PLUS (SImode, base_reg, GEN_INT (index));
      }
  
    if (flag_pic)
--- 4028,4034 ----
  	  index -= mask;
  	}
        base_reg = force_reg (SImode, GEN_INT (base));
!       x = plus_constant (base_reg, index);
      }
  
    if (flag_pic)
*************** arm_gen_load_multiple (int base_regno, i
*** 6223,6230 ****
    if (write_back)
      {
        XVECEXP (result, 0, 0)
! 	= gen_rtx_SET (GET_MODE (from), from,
! 		       plus_constant (from, count * 4 * sign));
        i = 1;
        count++;
      }
--- 6229,6235 ----
    if (write_back)
      {
        XVECEXP (result, 0, 0)
! 	= gen_rtx_SET (VOIDmode, from, plus_constant (from, count * 4 * sign));
        i = 1;
        count++;
      }
*************** arm_gen_store_multiple (int base_regno, 
*** 6287,6293 ****
    if (write_back)
      {
        XVECEXP (result, 0, 0)
! 	= gen_rtx_SET (GET_MODE (to), to,
  		       plus_constant (to, count * 4 * sign));
        i = 1;
        count++;
--- 6292,6298 ----
    if (write_back)
      {
        XVECEXP (result, 0, 0)
! 	= gen_rtx_SET (VOIDmode, to,
  		       plus_constant (to, count * 4 * sign));
        i = 1;
        count++;
*************** arm_gen_compare_reg (enum rtx_code code,
*** 6737,6744 ****
    enum machine_mode mode = SELECT_CC_MODE (code, x, y);
    rtx cc_reg = gen_rtx_REG (mode, CC_REGNUM);
  
!   emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
! 			  gen_rtx_COMPARE (mode, x, y)));
  
    return cc_reg;
  }
--- 6742,6748 ----
    enum machine_mode mode = SELECT_CC_MODE (code, x, y);
    rtx cc_reg = gen_rtx_REG (mode, CC_REGNUM);
  
!   emit_set_insn (cc_reg, gen_rtx_COMPARE (mode, x, y));
  
    return cc_reg;
  }
*************** arm_reload_in_hi (rtx *operands)
*** 6792,6798 ****
      {
        rtx base_plus = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
  
!       emit_insn (gen_rtx_SET (VOIDmode, base_plus, base));
        base = base_plus;
      }
    else if (GET_CODE (base) == PLUS)
--- 6796,6802 ----
      {
        rtx base_plus = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
  
!       emit_set_insn (base_plus, base);
        base = base_plus;
      }
    else if (GET_CODE (base) == PLUS)
*************** arm_reload_in_hi (rtx *operands)
*** 6850,6869 ****
  						plus_constant (base,
  							       offset + 1))));
    if (!BYTES_BIG_ENDIAN)
!     emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_SUBREG (SImode, operands[0], 0),
! 			gen_rtx_IOR (SImode,
! 				     gen_rtx_ASHIFT
! 				     (SImode,
! 				      gen_rtx_SUBREG (SImode, operands[0], 0),
! 				      GEN_INT (8)),
! 				     scratch)));
!   else
!     emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_SUBREG (SImode, operands[0], 0),
! 			    gen_rtx_IOR (SImode,
! 					 gen_rtx_ASHIFT (SImode, scratch,
! 							 GEN_INT (8)),
! 					 gen_rtx_SUBREG (SImode, operands[0],
! 							 0))));
  }
  
  /* Handle storing a half-word to memory during reload by synthesizing as two
--- 6854,6872 ----
  						plus_constant (base,
  							       offset + 1))));
    if (!BYTES_BIG_ENDIAN)
!     emit_set_insn (gen_rtx_SUBREG (SImode, operands[0], 0),
! 		   gen_rtx_IOR (SImode,
! 				gen_rtx_ASHIFT
! 				(SImode,
! 				 gen_rtx_SUBREG (SImode, operands[0], 0),
! 				 GEN_INT (8)),
! 				scratch));
!   else
!     emit_set_insn (gen_rtx_SUBREG (SImode, operands[0], 0),
! 		   gen_rtx_IOR (SImode,
! 				gen_rtx_ASHIFT (SImode, scratch,
! 						GEN_INT (8)),
! 				gen_rtx_SUBREG (SImode, operands[0], 0)));
  }
  
  /* Handle storing a half-word to memory during reload by synthesizing as two
*************** arm_reload_out_hi (rtx *operands)
*** 6938,6944 ****
  	    }
  	}
  
!       emit_insn (gen_rtx_SET (VOIDmode, base_plus, base));
        base = base_plus;
      }
    else if (GET_CODE (base) == PLUS)
--- 6941,6947 ----
  	    }
  	}
  
!       emit_set_insn (base_plus, base);
        base = base_plus;
      }
    else if (GET_CODE (base) == PLUS)
*************** vfp_emit_fstmx (int base_reg, int count)
*** 8445,8452 ****
  				   UNSPEC_PUSH_MULT));
  
    tmp = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
! 		     gen_rtx_PLUS (SImode, stack_pointer_rtx,
! 				   GEN_INT (-(count * 8 + 4))));
    RTX_FRAME_RELATED_P (tmp) = 1;
    XVECEXP (dwarf, 0, 0) = tmp;
  
--- 8448,8454 ----
  				   UNSPEC_PUSH_MULT));
  
    tmp = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
! 		     plus_constant (stack_pointer_rtx, -(count * 8 + 4)));
    RTX_FRAME_RELATED_P (tmp) = 1;
    XVECEXP (dwarf, 0, 0) = tmp;
  
*************** vfp_emit_fstmx (int base_reg, int count)
*** 8464,8472 ****
  
        tmp = gen_rtx_SET (VOIDmode,
  			 gen_frame_mem (DFmode,
! 					gen_rtx_PLUS (SImode,
! 						      stack_pointer_rtx,
! 						      GEN_INT (i * 8))),
  			 reg);
        RTX_FRAME_RELATED_P (tmp) = 1;
        XVECEXP (dwarf, 0, i + 1) = tmp;
--- 8466,8473 ----
  
        tmp = gen_rtx_SET (VOIDmode,
  			 gen_frame_mem (DFmode,
! 					plus_constant (stack_pointer_rtx,
! 						       i * 8)),
  			 reg);
        RTX_FRAME_RELATED_P (tmp) = 1;
        XVECEXP (dwarf, 0, i + 1) = tmp;
*************** emit_multi_reg_push (unsigned long mask)
*** 10207,10217 ****
  
    par = emit_insn (par);
  
!   tmp = gen_rtx_SET (SImode,
  		     stack_pointer_rtx,
! 		     gen_rtx_PLUS (SImode,
! 				   stack_pointer_rtx,
! 				   GEN_INT (-4 * num_regs)));
    RTX_FRAME_RELATED_P (tmp) = 1;
    XVECEXP (dwarf, 0, 0) = tmp;
  
--- 10208,10216 ----
  
    par = emit_insn (par);
  
!   tmp = gen_rtx_SET (VOIDmode,
  		     stack_pointer_rtx,
! 		     plus_constant (stack_pointer_rtx, -4 * num_regs));
    RTX_FRAME_RELATED_P (tmp) = 1;
    XVECEXP (dwarf, 0, 0) = tmp;
  
*************** emit_sfm (int base_reg, int count)
*** 10276,10284 ****
  
    tmp = gen_rtx_SET (VOIDmode,
  		     stack_pointer_rtx,
! 		     gen_rtx_PLUS (SImode,
! 				   stack_pointer_rtx,
! 				   GEN_INT (-12 * count)));
    RTX_FRAME_RELATED_P (tmp) = 1;
    XVECEXP (dwarf, 0, 0) = tmp;
  
--- 10275,10282 ----
  
    tmp = gen_rtx_SET (VOIDmode,
  		     stack_pointer_rtx,
! 		     plus_constant (stack_pointer_rtx, -12 * count));
! 
    RTX_FRAME_RELATED_P (tmp) = 1;
    XVECEXP (dwarf, 0, 0) = tmp;
  
*************** arm_expand_prologue (void)
*** 10611,10635 ****
  	     inherited from the caller.  */
  
  	  if (regs_ever_live[3] == 0)
! 	    {
! 	      insn = gen_rtx_REG (SImode, 3);
! 	      insn = gen_rtx_SET (SImode, insn, ip_rtx);
! 	      insn = emit_insn (insn);
! 	    }
  	  else if (args_to_push == 0)
  	    {
  	      rtx dwarf;
- 	      insn = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx);
- 	      insn = gen_frame_mem (SImode, insn);
- 	      insn = gen_rtx_SET (VOIDmode, insn, ip_rtx);
- 	      insn = emit_insn (insn);
  
  	      fp_offset = 4;
  
  	      /* Just tell the dwarf backend that we adjusted SP.  */
  	      dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
! 				   gen_rtx_PLUS (SImode, stack_pointer_rtx,
! 						 GEN_INT (-fp_offset)));
  	      RTX_FRAME_RELATED_P (insn) = 1;
  	      REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
  						    dwarf, REG_NOTES (insn));
--- 10609,10627 ----
  	     inherited from the caller.  */
  
  	  if (regs_ever_live[3] == 0)
! 	    insn = emit_set_insn (gen_rtx_REG (SImode, 3), ip_rtx);
  	  else if (args_to_push == 0)
  	    {
  	      rtx dwarf;
  
+ 	      insn = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx);
+ 	      insn = emit_set_insn (gen_frame_mem (SImode, insn), ip_rtx);
  	      fp_offset = 4;
  
  	      /* Just tell the dwarf backend that we adjusted SP.  */
  	      dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
! 				   plus_constant (stack_pointer_rtx,
! 						  -fp_offset));
  	      RTX_FRAME_RELATED_P (insn) = 1;
  	      REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
  						    dwarf, REG_NOTES (insn));
*************** arm_expand_prologue (void)
*** 10652,10672 ****
  	      args_to_push = 0;
  
  	      /* Now reuse r3 to preserve IP.  */
! 	      insn = gen_rtx_REG (SImode, 3);
! 	      insn = gen_rtx_SET (SImode, insn, ip_rtx);
! 	      (void) emit_insn (insn);
  	    }
  	}
  
!       if (fp_offset)
! 	{
! 	  insn = gen_rtx_PLUS (SImode, stack_pointer_rtx, GEN_INT (fp_offset));
! 	  insn = gen_rtx_SET  (SImode, ip_rtx, insn);
! 	}
!       else
! 	insn = gen_movsi (ip_rtx, stack_pointer_rtx);
! 
!       insn = emit_insn (insn);
        RTX_FRAME_RELATED_P (insn) = 1;
      }
  
--- 10644,10655 ----
  	      args_to_push = 0;
  
  	      /* Now reuse r3 to preserve IP.  */
! 	      emit_set_insn (gen_rtx_REG (SImode, 3), ip_rtx);
  	    }
  	}
  
!       insn = emit_set_insn (ip_rtx,
! 			    plus_constant (stack_pointer_rtx, fp_offset));
        RTX_FRAME_RELATED_P (insn) = 1;
      }
  
*************** arm_expand_prologue (void)
*** 10691,10701 ****
    if ((func_type == ARM_FT_ISR || func_type == ARM_FT_FIQ)
        && (live_regs_mask & (1 << LR_REGNUM)) != 0
        && ! frame_pointer_needed)
!     emit_insn (gen_rtx_SET (SImode,
! 			    gen_rtx_REG (SImode, LR_REGNUM),
! 			    gen_rtx_PLUS (SImode,
! 					  gen_rtx_REG (SImode, LR_REGNUM),
! 					  GEN_INT (-4))));
  
    if (live_regs_mask)
      {
--- 10674,10684 ----
    if ((func_type == ARM_FT_ISR || func_type == ARM_FT_FIQ)
        && (live_regs_mask & (1 << LR_REGNUM)) != 0
        && ! frame_pointer_needed)
!     {
!       rtx lr = gen_rtx_REG (SImode, LR_REGNUM);
!       
!       emit_set_insn (lr, plus_constant (lr, -4));
!     }
  
    if (live_regs_mask)
      {
*************** arm_expand_prologue (void)
*** 10710,10717 ****
  	{
  	  insn = gen_rtx_PRE_DEC (V2SImode, stack_pointer_rtx);
  	  insn = gen_frame_mem (V2SImode, insn);
! 	  insn = emit_insn (gen_rtx_SET (VOIDmode, insn,
! 					 gen_rtx_REG (V2SImode, reg)));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	  saved_regs += 8;
  	}
--- 10693,10699 ----
  	{
  	  insn = gen_rtx_PRE_DEC (V2SImode, stack_pointer_rtx);
  	  insn = gen_frame_mem (V2SImode, insn);
! 	  insn = emit_set_insn (insn, gen_rtx_REG (V2SImode, reg));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	  saved_regs += 8;
  	}
*************** arm_expand_prologue (void)
*** 10729,10736 ****
  	      {
  		insn = gen_rtx_PRE_DEC (XFmode, stack_pointer_rtx);
  		insn = gen_frame_mem (XFmode, insn);
! 		insn = emit_insn (gen_rtx_SET (VOIDmode, insn,
! 					       gen_rtx_REG (XFmode, reg)));
  		RTX_FRAME_RELATED_P (insn) = 1;
  		saved_regs += 12;
  	      }
--- 10711,10717 ----
  	      {
  		insn = gen_rtx_PRE_DEC (XFmode, stack_pointer_rtx);
  		insn = gen_frame_mem (XFmode, insn);
! 		insn = emit_set_insn (insn, gen_rtx_REG (XFmode, reg));
  		RTX_FRAME_RELATED_P (insn) = 1;
  		saved_regs += 12;
  	      }
*************** arm_expand_prologue (void)
*** 10806,10817 ****
  	    insn = gen_rtx_REG (SImode, 3);
  	  else /* if (current_function_pretend_args_size == 0) */
  	    {
! 	      insn = gen_rtx_PLUS (SImode, hard_frame_pointer_rtx,
! 				   GEN_INT (4));
  	      insn = gen_frame_mem (SImode, insn);
  	    }
  
! 	  emit_insn (gen_rtx_SET (SImode, ip_rtx, insn));
  	  /* Add a USE to stop propagate_one_insn() from barfing.  */
  	  emit_insn (gen_prologue_use (ip_rtx));
  	}
--- 10787,10797 ----
  	    insn = gen_rtx_REG (SImode, 3);
  	  else /* if (current_function_pretend_args_size == 0) */
  	    {
! 	      insn = plus_constant (hard_frame_pointer_rtx, 4);
  	      insn = gen_frame_mem (SImode, insn);
  	    }
  
! 	  emit_set_insn (ip_rtx, insn);
  	  /* Add a USE to stop propagate_one_insn() from barfing.  */
  	  emit_insn (gen_prologue_use (ip_rtx));
  	}
*************** thumb_expand_prologue (void)
*** 13665,13671 ****
  	      insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
  					    stack_pointer_rtx, reg));
  	      RTX_FRAME_RELATED_P (insn) = 1;
! 	      dwarf = gen_rtx_SET (SImode, stack_pointer_rtx,
  				   plus_constant (stack_pointer_rtx,
  						  -amount));
  	      RTX_FRAME_RELATED_P (dwarf) = 1;
--- 13645,13651 ----
  	      insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
  					    stack_pointer_rtx, reg));
  	      RTX_FRAME_RELATED_P (insn) = 1;
! 	      dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
  				   plus_constant (stack_pointer_rtx,
  						  -amount));
  	      RTX_FRAME_RELATED_P (dwarf) = 1;
*************** thumb_expand_prologue (void)
*** 13691,13697 ****
  	      insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
  					    stack_pointer_rtx, reg));
  	      RTX_FRAME_RELATED_P (insn) = 1;
! 	      dwarf = gen_rtx_SET (SImode, stack_pointer_rtx,
  				   plus_constant (stack_pointer_rtx,
  						  -amount));
  	      RTX_FRAME_RELATED_P (dwarf) = 1;
--- 13671,13677 ----
  	      insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
  					    stack_pointer_rtx, reg));
  	      RTX_FRAME_RELATED_P (insn) = 1;
! 	      dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
  				   plus_constant (stack_pointer_rtx,
  						  -amount));
  	      RTX_FRAME_RELATED_P (dwarf) = 1;
*************** thumb_expand_prologue (void)
*** 13715,13721 ****
  	  insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx,
  					hard_frame_pointer_rtx,
  					stack_pointer_rtx));
! 	  dwarf = gen_rtx_SET (SImode, hard_frame_pointer_rtx,
  			       plus_constant (stack_pointer_rtx, amount));
  	  RTX_FRAME_RELATED_P (dwarf) = 1;
  	  REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, dwarf,
--- 13695,13701 ----
  	  insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx,
  					hard_frame_pointer_rtx,
  					stack_pointer_rtx));
! 	  dwarf = gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
  			       plus_constant (stack_pointer_rtx, amount));
  	  RTX_FRAME_RELATED_P (dwarf) = 1;
  	  REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, dwarf,

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