diff mbox series

[046/nnn] poly_int: instantiate_virtual_regs

Message ID 87d15dn5n3.fsf@linaro.org
State New
Headers show
Series [046/nnn] poly_int: instantiate_virtual_regs | expand

Commit Message

Richard Sandiford Oct. 23, 2017, 5:19 p.m. UTC
This patch makes the instantiate virtual regs pass track offsets
as poly_ints.


2017-10-23  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* function.c (in_arg_offset, var_offset, dynamic_offset)
	(out_arg_offset, cfa_offset): Change from int to poly_int64.
	(instantiate_new_reg): Return the new offset as a poly_int64_pod
	rather than a HOST_WIDE_INT.
	(instantiate_virtual_regs_in_rtx): Track polynomial offsets.
	(instantiate_virtual_regs_in_insn): Likewise.

Comments

Jeff Law Nov. 28, 2017, 5:56 p.m. UTC | #1
On 10/23/2017 11:19 AM, Richard Sandiford wrote:
> This patch makes the instantiate virtual regs pass track offsets
> as poly_ints.
> 
> 
> 2017-10-23  Richard Sandiford  <richard.sandiford@linaro.org>
> 	    Alan Hayward  <alan.hayward@arm.com>
> 	    David Sherwood  <david.sherwood@arm.com>
> 
> gcc/
> 	* function.c (in_arg_offset, var_offset, dynamic_offset)
> 	(out_arg_offset, cfa_offset): Change from int to poly_int64.
> 	(instantiate_new_reg): Return the new offset as a poly_int64_pod
> 	rather than a HOST_WIDE_INT.
> 	(instantiate_virtual_regs_in_rtx): Track polynomial offsets.
> 	(instantiate_virtual_regs_in_insn): Likewise.
OK.
jeff
diff mbox series

Patch

Index: gcc/function.c
===================================================================
--- gcc/function.c	2017-10-23 17:18:53.834514759 +0100
+++ gcc/function.c	2017-10-23 17:18:59.743148042 +0100
@@ -1367,11 +1367,11 @@  initial_value_entry (int i, rtx *hreg, r
    routines.  They contain the offsets of the virtual registers from their
    respective hard registers.  */
 
-static int in_arg_offset;
-static int var_offset;
-static int dynamic_offset;
-static int out_arg_offset;
-static int cfa_offset;
+static poly_int64 in_arg_offset;
+static poly_int64 var_offset;
+static poly_int64 dynamic_offset;
+static poly_int64 out_arg_offset;
+static poly_int64 cfa_offset;
 
 /* In most machines, the stack pointer register is equivalent to the bottom
    of the stack.  */
@@ -1418,10 +1418,10 @@  #define STACK_DYNAMIC_OFFSET(FNDECL)	\
    offset indirectly through the pointer.  Otherwise, return 0.  */
 
 static rtx
-instantiate_new_reg (rtx x, HOST_WIDE_INT *poffset)
+instantiate_new_reg (rtx x, poly_int64_pod *poffset)
 {
   rtx new_rtx;
-  HOST_WIDE_INT offset;
+  poly_int64 offset;
 
   if (x == virtual_incoming_args_rtx)
     {
@@ -1480,7 +1480,7 @@  instantiate_virtual_regs_in_rtx (rtx *lo
       if (rtx x = *loc)
 	{
 	  rtx new_rtx;
-	  HOST_WIDE_INT offset;
+	  poly_int64 offset;
 	  switch (GET_CODE (x))
 	    {
 	    case REG:
@@ -1533,7 +1533,7 @@  safe_insn_predicate (int code, int opera
 static void
 instantiate_virtual_regs_in_insn (rtx_insn *insn)
 {
-  HOST_WIDE_INT offset;
+  poly_int64 offset;
   int insn_code, i;
   bool any_change = false;
   rtx set, new_rtx, x;
@@ -1572,7 +1572,8 @@  instantiate_virtual_regs_in_insn (rtx_in
 	 to the generic case is avoiding a new pseudo and eliminating a
 	 move insn in the initial rtl stream.  */
       new_rtx = instantiate_new_reg (SET_SRC (set), &offset);
-      if (new_rtx && offset != 0
+      if (new_rtx
+	  && maybe_nonzero (offset)
 	  && REG_P (SET_DEST (set))
 	  && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
 	{
@@ -1598,17 +1599,18 @@  instantiate_virtual_regs_in_insn (rtx_in
 
       /* Handle a plus involving a virtual register by determining if the
 	 operands remain valid if they're modified in place.  */
+      poly_int64 delta;
       if (GET_CODE (SET_SRC (set)) == PLUS
 	  && recog_data.n_operands >= 3
 	  && recog_data.operand_loc[1] == &XEXP (SET_SRC (set), 0)
 	  && recog_data.operand_loc[2] == &XEXP (SET_SRC (set), 1)
-	  && CONST_INT_P (recog_data.operand[2])
+	  && poly_int_rtx_p (recog_data.operand[2], &delta)
 	  && (new_rtx = instantiate_new_reg (recog_data.operand[1], &offset)))
 	{
-	  offset += INTVAL (recog_data.operand[2]);
+	  offset += delta;
 
 	  /* If the sum is zero, then replace with a plain move.  */
-	  if (offset == 0
+	  if (known_zero (offset)
 	      && REG_P (SET_DEST (set))
 	      && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
 	    {
@@ -1686,7 +1688,7 @@  instantiate_virtual_regs_in_insn (rtx_in
 	  new_rtx = instantiate_new_reg (x, &offset);
 	  if (new_rtx == NULL)
 	    continue;
-	  if (offset == 0)
+	  if (known_zero (offset))
 	    x = new_rtx;
 	  else
 	    {
@@ -1711,7 +1713,7 @@  instantiate_virtual_regs_in_insn (rtx_in
 	  new_rtx = instantiate_new_reg (SUBREG_REG (x), &offset);
 	  if (new_rtx == NULL)
 	    continue;
-	  if (offset != 0)
+	  if (maybe_nonzero (offset))
 	    {
 	      start_sequence ();
 	      new_rtx = expand_simple_binop