This patch changes the "extra" parameters to push_block and
emit_push_insn from int to poly_int64.


2017-10-23  Richard Sandiford  <richard.sandif...@linaro.org>
            Alan Hayward  <alan.hayw...@arm.com>
            David Sherwood  <david.sherw...@arm.com>

gcc/
        * expr.h (push_block, emit_push_insn): Change the "extra" parameter
        from HOST_WIDE_INT to poly_int64.
        * expr.c (push_block, emit_push_insn): Likewise.

Index: gcc/expr.h
===================================================================
--- gcc/expr.h  2017-10-23 17:18:43.842393134 +0100
+++ gcc/expr.h  2017-10-23 17:18:56.434286222 +0100
@@ -233,11 +233,11 @@ extern rtx emit_move_resolve_push (machi
 
 /* Push a block of length SIZE (perhaps variable)
    and return an rtx to address the beginning of the block.  */
-extern rtx push_block (rtx, int, int);
+extern rtx push_block (rtx, poly_int64, int);
 
 /* Generate code to push something onto the stack, given its mode and type.  */
 extern bool emit_push_insn (rtx, machine_mode, tree, rtx, unsigned int,
-                           int, rtx, int, rtx, rtx, int, rtx, bool);
+                           int, rtx, poly_int64, rtx, rtx, int, rtx, bool);
 
 /* Extract the accessible bit-range from a COMPONENT_REF.  */
 extern void get_bit_range (poly_uint64_pod *, poly_uint64_pod *, tree,
Index: gcc/expr.c
===================================================================
--- gcc/expr.c  2017-10-23 17:18:47.661057448 +0100
+++ gcc/expr.c  2017-10-23 17:18:56.434286222 +0100
@@ -3865,19 +3865,19 @@ compress_float_constant (rtx x, rtx y)
    otherwise, the padding comes at high addresses.  */
 
 rtx
-push_block (rtx size, int extra, int below)
+push_block (rtx size, poly_int64 extra, int below)
 {
   rtx temp;
 
   size = convert_modes (Pmode, ptr_mode, size, 1);
   if (CONSTANT_P (size))
     anti_adjust_stack (plus_constant (Pmode, size, extra));
-  else if (REG_P (size) && extra == 0)
+  else if (REG_P (size) && known_zero (extra))
     anti_adjust_stack (size);
   else
     {
       temp = copy_to_mode_reg (Pmode, size);
-      if (extra != 0)
+      if (maybe_nonzero (extra))
        temp = expand_binop (Pmode, add_optab, temp,
                             gen_int_mode (extra, Pmode),
                             temp, 0, OPTAB_LIB_WIDEN);
@@ -3887,7 +3887,7 @@ push_block (rtx size, int extra, int bel
   if (STACK_GROWS_DOWNWARD)
     {
       temp = virtual_outgoing_args_rtx;
-      if (extra != 0 && below)
+      if (maybe_nonzero (extra) && below)
        temp = plus_constant (Pmode, temp, extra);
     }
   else
@@ -3895,7 +3895,7 @@ push_block (rtx size, int extra, int bel
       if (CONST_INT_P (size))
        temp = plus_constant (Pmode, virtual_outgoing_args_rtx,
                              -INTVAL (size) - (below ? 0 : extra));
-      else if (extra != 0 && !below)
+      else if (maybe_nonzero (extra) && !below)
        temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
                             negate_rtx (Pmode, plus_constant (Pmode, size,
                                                               extra)));
@@ -4269,7 +4269,7 @@ memory_load_overlap (rtx x, rtx y, HOST_
 
 bool
 emit_push_insn (rtx x, machine_mode mode, tree type, rtx size,
-               unsigned int align, int partial, rtx reg, int extra,
+               unsigned int align, int partial, rtx reg, poly_int64 extra,
                rtx args_addr, rtx args_so_far, int reg_parm_stack_space,
                rtx alignment_pad, bool sibcall_p)
 {
@@ -4357,9 +4357,11 @@ emit_push_insn (rtx x, machine_mode mode
          /* Push padding now if padding above and stack grows down,
             or if padding below and stack grows up.
             But if space already allocated, this has already been done.  */
-         if (extra && args_addr == 0
-             && where_pad != PAD_NONE && where_pad != stack_direction)
-           anti_adjust_stack (GEN_INT (extra));
+         if (maybe_nonzero (extra)
+             && args_addr == 0
+             && where_pad != PAD_NONE
+             && where_pad != stack_direction)
+           anti_adjust_stack (gen_int_mode (extra, Pmode));
 
          move_by_pieces (NULL, xinner, INTVAL (size) - used, align, 0);
        }
@@ -4480,9 +4482,11 @@ emit_push_insn (rtx x, machine_mode mode
       /* Push padding now if padding above and stack grows down,
         or if padding below and stack grows up.
         But if space already allocated, this has already been done.  */
-      if (extra && args_addr == 0
-         && where_pad != PAD_NONE && where_pad != stack_direction)
-       anti_adjust_stack (GEN_INT (extra));
+      if (maybe_nonzero (extra)
+         && args_addr == 0
+         && where_pad != PAD_NONE
+         && where_pad != stack_direction)
+       anti_adjust_stack (gen_int_mode (extra, Pmode));
 
       /* If we make space by pushing it, we might as well push
         the real data.  Otherwise, we can leave OFFSET nonzero
@@ -4531,9 +4535,11 @@ emit_push_insn (rtx x, machine_mode mode
       /* Push padding now if padding above and stack grows down,
         or if padding below and stack grows up.
         But if space already allocated, this has already been done.  */
-      if (extra && args_addr == 0
-         && where_pad != PAD_NONE && where_pad != stack_direction)
-       anti_adjust_stack (GEN_INT (extra));
+      if (maybe_nonzero (extra)
+         && args_addr == 0
+         && where_pad != PAD_NONE
+         && where_pad != stack_direction)
+       anti_adjust_stack (gen_int_mode (extra, Pmode));
 
 #ifdef PUSH_ROUNDING
       if (args_addr == 0 && PUSH_ARGS)
@@ -4578,8 +4584,8 @@ emit_push_insn (rtx x, machine_mode mode
        }
     }
 
-  if (extra && args_addr == 0 && where_pad == stack_direction)
-    anti_adjust_stack (GEN_INT (extra));
+  if (maybe_nonzero (extra) && args_addr == 0 && where_pad == stack_direction)
+    anti_adjust_stack (gen_int_mode (extra, Pmode));
 
   if (alignment_pad && args_addr == 0)
     anti_adjust_stack (alignment_pad);

Reply via email to