Simplify pad_below implementation

Message ID 874lt1dvgc.fsf@linaro.org
State New
Headers show

Commit Message

Richard Sandiford Aug. 21, 2017, 11:14 a.m.
This patch simplifies the alignment calculations in pad_below.
The first arm of the "if" was:

- taking GET_MODE_BITSIZE (always equal to GET_MODE_SIZE * BITS_PER_UNIT),
- rounding up to the next multiple of PARM_BOUNDARY
- converting bits to bytes and
- subtracting the GET_MODE_SIZE

so was in effect calculating the number of bytes needed to round
GET_MODE_SIZE up to (PARM_BOUNDARY / BITS_PER_UNIT).  That can be
done more directly as -size & (align - 1), which is easier to
convert to variable-sized modes.

Tested on aarch64-linux-gnu and x86_64-linux-gnu, and by building
one target per CPU and checking that there were no differences in
assembly for the testsuite.  OK to install?

Richard


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

gcc/
	* function.c (pad_below): Simplify padding calculation.

Comments

Richard Biener Aug. 21, 2017, 12:57 p.m. | #1
On Mon, Aug 21, 2017 at 1:14 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> This patch simplifies the alignment calculations in pad_below.

> The first arm of the "if" was:

>

> - taking GET_MODE_BITSIZE (always equal to GET_MODE_SIZE * BITS_PER_UNIT),

> - rounding up to the next multiple of PARM_BOUNDARY

> - converting bits to bytes and

> - subtracting the GET_MODE_SIZE

>

> so was in effect calculating the number of bytes needed to round

> GET_MODE_SIZE up to (PARM_BOUNDARY / BITS_PER_UNIT).  That can be

> done more directly as -size & (align - 1), which is easier to

> convert to variable-sized modes.

>

> Tested on aarch64-linux-gnu and x86_64-linux-gnu, and by building

> one target per CPU and checking that there were no differences in

> assembly for the testsuite.  OK to install?


Ok.

Richard.

> Richard

>

>

> 2017-08-21  Richard Sandiford  <richard.sandiford@linaro.org>

>             Alan Hayward  <alan.hayward@arm.com>

>             David Sherwood  <david.sherwood@arm.com>

>

> gcc/

>         * function.c (pad_below): Simplify padding calculation.

>

> Index: gcc/function.c

> ===================================================================

> --- gcc/function.c      2017-08-21 10:42:34.185530464 +0100

> +++ gcc/function.c      2017-08-21 11:55:41.018148268 +0100

> @@ -4322,21 +4322,16 @@ pad_to_arg_alignment (struct args_size *

>  static void

>  pad_below (struct args_size *offset_ptr, machine_mode passed_mode, tree sizetree)

>  {

> +  unsigned int align = PARM_BOUNDARY / BITS_PER_UNIT;

>    if (passed_mode != BLKmode)

> -    {

> -      if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)

> -       offset_ptr->constant

> -         += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)

> -              / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)

> -             - GET_MODE_SIZE (passed_mode));

> -    }

> +    offset_ptr->constant += -GET_MODE_SIZE (passed_mode) & (align - 1);

>    else

>      {

>        if (TREE_CODE (sizetree) != INTEGER_CST

> -         || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)

> +         || (TREE_INT_CST_LOW (sizetree) & (align - 1)) != 0)

>         {

>           /* Round the size up to multiple of PARM_BOUNDARY bits.  */

> -         tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);

> +         tree s2 = round_up (sizetree, align);

>           /* Add it in.  */

>           ADD_PARM_SIZE (*offset_ptr, s2);

>           SUB_PARM_SIZE (*offset_ptr, sizetree);

Patch

Index: gcc/function.c
===================================================================
--- gcc/function.c	2017-08-21 10:42:34.185530464 +0100
+++ gcc/function.c	2017-08-21 11:55:41.018148268 +0100
@@ -4322,21 +4322,16 @@  pad_to_arg_alignment (struct args_size *
 static void
 pad_below (struct args_size *offset_ptr, machine_mode passed_mode, tree sizetree)
 {
+  unsigned int align = PARM_BOUNDARY / BITS_PER_UNIT;
   if (passed_mode != BLKmode)
-    {
-      if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
-	offset_ptr->constant
-	  += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
-	       / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
-	      - GET_MODE_SIZE (passed_mode));
-    }
+    offset_ptr->constant += -GET_MODE_SIZE (passed_mode) & (align - 1);
   else
     {
       if (TREE_CODE (sizetree) != INTEGER_CST
-	  || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
+	  || (TREE_INT_CST_LOW (sizetree) & (align - 1)) != 0)
 	{
 	  /* Round the size up to multiple of PARM_BOUNDARY bits.  */
-	  tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
+	  tree s2 = round_up (sizetree, align);
 	  /* Add it in.  */
 	  ADD_PARM_SIZE (*offset_ptr, s2);
 	  SUB_PARM_SIZE (*offset_ptr, sizetree);