https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90616
Bug ID: 90616
Summary: Suboptimal code generated for accessing an aligned
array.
Product: gcc
Version: 5.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: igusarov at mail dot ru
Target Milestone: ---
Consider the following code:
#include <stdint.h>
uint8_t globalArray[68] __attribute__((aligned(256)));
uint8_t foo(uint8_t index)
{
return globalArray[index];
}
avr-gcc-5.4.0 generates the following code for the body of foo():
mov r30,r24 # r24 is where 'index' argument is stored
ldi r31,0
subi r30,lo8(-(globalArray))
sbci r31,hi8(-(globalArray))
ld r24,Z
which is suboptimal because the lower byte of the address of globalArray is
always 0 due to the extended alignment enforced on that object.
Would it be possible to generate a better code for such specific indexing? For
example, the following snippet takes full advantage of the overalignment:
mov r30,r24
ldi r31,hi8(globalArray)
ld r24,Z