https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92925
Bug ID: 92925 Summary: RTl expansion throws away alignment info Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: hubicka at gcc dot gnu.org Target Milestone: --- Hi, this testcase originally started as attempt to produce self contained reproducer for ipa-cp bug. Problem is that RTL expansion is too limited and refuses to produce aligned moves for me. struct a {long a1; long a2;}; struct b {long b; struct a a[10];}; struct c {long c; struct b b;__int128 e;}; int l; __attribute__ ((noinline)) static void set(struct b *bptr) { for (int i=0;i<l;i+=2) bptr->a[i]=(struct a){}; } test () { struct c c; set (&c.b); } Here ipa-cp propagates that BPTR is always aligned to 16 with misaligment 8. This should let expansion to use movaps for the "bptr->a[i]=(struct a){};" constructions but it does not. set: .LFB0: .cfi_startproc movl l(%rip), %ecx testl %ecx, %ecx jle .L1 xorl %eax, %eax .p2align 4,,10 .p2align 3 .L3: movslq %eax, %rdx pxor %xmm0, %xmm0 addl $2, %eax salq $4, %rdx movups %xmm0, 8(%rdi,%rdx) cmpl %ecx, %eax jl .L3 .L1: Overall the loop codegen is quite bad.