This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PR 55438: Incorrect use of BIGGEST_ALIGNMENT


> I suppose I was putting too much store by the expmed.c code.  How does
> this version look?  Tested on x86_64-linux-gnu, powerpc64-linux-gnu
> and cris-elf.
> 
> Richard
> 
> 
> gcc/
> 	PR middle-end/55438
> 	* expmed.c (simple_mem_bitfield_p): New function, extracted from
> 	store_bit_field_1 and extract_bit_field_1.  Use GET_MODE_ALIGNMENT
> 	rather than bitsize when checking the alignment.

I'd mention explicitly the function:

	(store_bit_field_1): Call simple_mem_bitfield_p.
	(extract_bit_field_1): Likewise.

> 	* stor-layout.c (bit_field_mode_iterator::bit_field_mode_iterator):
> 	Don't limit ALIGN_.  Assume that memory is mapped in chunks of at
> 	least word size, regardless of BIGGEST_ALIGNMENT.
> 	(bit_field_mode_iterator::get_mode): Use GET_MODE_ALIGNMENT rather
> 	than unit when checking the alignment.
> 	(get_best_mode): Use GET_MODE_ALIGNMENT.

OK, modulo:

> Index: gcc/expmed.c
> ===================================================================
> --- gcc/expmed.c	2012-11-20 19:49:07.000000000 +0000
> +++ gcc/expmed.c	2012-11-27 17:27:38.381139339 +0000
> @@ -416,6 +416,21 @@ lowpart_bit_field_p (unsigned HOST_WIDE_
>    else
>      return bitnum % BITS_PER_WORD == 0;
>  }
> +
> +/* Return true if OP is a memory and if a bitfield of size BITSIZE at
> +   bit number BITNUM can be treated as a simple value of mode MODE.  */
> +
> +static bool
> +simple_mem_bitfield_p (rtx op0, unsigned HOST_WIDE_INT bitsize,
> +		       unsigned HOST_WIDE_INT bitnum, enum machine_mode mode)
> +{
> +  return (MEM_P (op0)
> +	  && bitnum % BITS_PER_UNIT == 0
> +	  && bitsize == GET_MODE_BITSIZE (mode)
> +	  && (!SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (op0))
> +	      || (bitnum % GET_MODE_ALIGNMENT (mode) == 0
> +		  && MEM_ALIGN (op0) % GET_MODE_ALIGNMENT (mode) == 0)));
> +}

I think that the most idiomatic form is

  MEM_ALIGN (op0) >= GET_MODE_ALIGNMENT (mode)

when it comes to alignments.

-- 
Eric Botcazou


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]