https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70079
Bug ID: 70079 Summary: missed constant propagation in memcpy expansion Product: gcc Version: 5.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: bonzini at gnu dot org Target Milestone: --- int f(char *restrict a, const char *restrict b) { __builtin_memcpy(a, b, 512); } $ gcc f.c -O2 - -o f.s includes the following code: movq %rdi, %rcx leaq 8(%rdi), %rdi andq $-8, %rdi ;; 1 subq %rdi, %rcx ;; 2 subq %rcx, %rsi ;; 3 addl $512, %ecx ;; 4 shrl $3, %ecx ;; 5 At 1, rdi = (a + 8) & ~7 = a & ~7 + 8 = a + 8 - (a & 7) At 2, rcx = a - rdi = a - a - 8 + (a & 7) = (a & 7) - 8 At 3, rsi = b - (a & 7) + 8 At 4, rcx = (a & 7) + 504, which is between 504 and 511 At 5, rcx is always 31. Not sure how to fix it in RTL optimizers, so I'm leaving this in the target component for a backend-specific fix.