poly_int: struct_value_size
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 3 Jan 2018 07:19:04 +0000 (07:19 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 3 Jan 2018 07:19:04 +0000 (07:19 +0000)
This patch makes calls.c treat struct_value_size (one of the
operands to a call pattern) as polynomial.

2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* calls.c (emit_call_1, expand_call): Change struct_value_size from
a HOST_WIDE_INT to a poly_int64.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256162

gcc/ChangeLog
gcc/calls.c

index 4fb5f441662a0a9e62a7dc260cf585d9446c43ae..3f3f0dcd182f690e87178e705af012c1fe51b81c 100644 (file)
@@ -1,3 +1,10 @@
+2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * calls.c (emit_call_1, expand_call): Change struct_value_size from
+       a HOST_WIDE_INT to a poly_int64.
+
 2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 916ef745ba2face633c9bc7973fdc6276ffe7b2e..5a0d663277614cf0d7404b4d5b81daee2a25ed83 100644 (file)
@@ -378,7 +378,7 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU
             tree funtype ATTRIBUTE_UNUSED,
             poly_int64 stack_size ATTRIBUTE_UNUSED,
             poly_int64 rounded_stack_size,
-            HOST_WIDE_INT struct_value_size ATTRIBUTE_UNUSED,
+            poly_int64 struct_value_size ATTRIBUTE_UNUSED,
             rtx next_arg_reg ATTRIBUTE_UNUSED, rtx valreg,
             int old_inhibit_defer_pop, rtx call_fusage, int ecf_flags,
             cumulative_args_t args_so_far ATTRIBUTE_UNUSED)
@@ -438,7 +438,8 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU
                                         next_arg_reg, NULL_RTX);
       else
        pat = targetm.gen_sibcall (funmem, rounded_stack_size_rtx,
-                                  next_arg_reg, GEN_INT (struct_value_size));
+                                  next_arg_reg,
+                                  gen_int_mode (struct_value_size, Pmode));
     }
   /* If the target has "call" or "call_value" insns, then prefer them
      if no arguments are actually popped.  If the target does not have
@@ -471,7 +472,7 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU
                                      next_arg_reg, NULL_RTX);
       else
        pat = targetm.gen_call (funmem, rounded_stack_size_rtx, next_arg_reg,
-                               GEN_INT (struct_value_size));
+                               gen_int_mode (struct_value_size, Pmode));
     }
   emit_insn (pat);
 
@@ -3237,7 +3238,7 @@ expand_call (tree exp, rtx target, int ignore)
   /* Size of aggregate value wanted, or zero if none wanted
      or if we are using the non-reentrant PCC calling convention
      or expecting the value in registers.  */
-  HOST_WIDE_INT struct_value_size = 0;
+  poly_int64 struct_value_size = 0;
   /* Nonzero if called function returns an aggregate in memory PCC style,
      by returning the address of where to find it.  */
   int pcc_struct_value = 0;
@@ -3399,7 +3400,8 @@ expand_call (tree exp, rtx target, int ignore)
       }
 #else /* not PCC_STATIC_STRUCT_RETURN */
       {
-       struct_value_size = int_size_in_bytes (rettype);
+       if (!poly_int_tree_p (TYPE_SIZE_UNIT (rettype), &struct_value_size))
+         struct_value_size = -1;
 
        /* Even if it is semantically safe to use the target as the return
           slot, it may be not sufficiently aligned for the return type.  */