https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78125
Bug ID: 78125
Summary: Shifted const forming is had
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Target: aarch64*-*-*
Take:
#define CONST1 0x1234567812345678ull
#define CONST2 (CONST1<<1)
#define CONST3 (CONST2<<1)
#define CONST4 (CONST3<<1)
#define CONST5 (CONST4<<1)
#define CONST6 (CONST5<<1)
#define CONST7 (CONST6<<1)
#define CONST8 (CONST7<<1)
void foo(unsigned long *a, unsigned long *b, unsigned long *c,
unsigned long *d, unsigned long *e, unsigned long *f,
unsigned long *g, unsigned long *h)
{
*a = CONST1;
*b = CONST2;
*c = CONST3;
*d = CONST4;
*e = CONST5;
*f = CONST6;
*g = CONST7;
*h = CONST8;
}
---- CUT ----
Right now the generated code generates the constant for each of the above
constants but we should be able to optimize it using left shifts. We are able
to handle plus but not shifted values (or rotated values, see PR63281).