Inefficient code

Segher Boessenkool segher@kernel.crashing.org
Thu Jul 5 16:01:00 GMT 2018


On Thu, Jul 05, 2018 at 08:45:30AM -0400, Paul Koning wrote:
> I have a struct that looks like this:
> 
> struct Xrb
> {
>     uint16_t xrlen;		/* Length of I/O buffer in bytes */
>     uint16_t xrbc;		/* Byte count for transfer */
>     void * xrloc;		/* Pointer to I/O buffer */
>     uint8_t xrci;		/* Channel number times 2 for transfer */
>     uint32_t xrblk:24;	/* Random access block number */
>     uint16_t xrtime;	/* Wait time for terminal input */
>     uint16_t xrmod;		/* Modifiers */
> };
> 
> When I write to xrblk (that 24 bit field) on my 16 bit target, I get unexpectly inefficient output:
> 
>     XRB->xrblk = 5;
> 
> 	movb	#5,10(r0)
> 	clrb	11(r0)
> 	clrb	7(r0)

(7? not 12?)

> rather than the expected word write to the word-aligned lower half of that field.
> 
> Looking at the dumps, I see it coming into the RTL expand phase as a single write, which expand then turns into the three insns corresponding to the above.  But (of course) there is a word (HImode) move also, which has the same cost as the byte one.
> 
> Is there something I have to do in my target definition to get this to come out right?  This is a strict_alignment target, but alignment is satisfied in this example.  Also, SLOW_BYTE_ACCESS is 1.

What is your MOVE_MAX?  It should be 2 probably.


Segher



More information about the Gcc mailing list