Message ID | 874lt1dvgc.fsf@linaro.org |
---|---|
State | Accepted |
Commit | b66fd4fc3777e1d072a63529b70b2ff777e6efcb |
Headers | show |
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);
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);