https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67145
Bug ID: 67145 Summary: [6 Regression] Innefective plus-minus simplification Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: afomin.mailbox at gmail dot com CC: izamyatin at gmail dot com Target Milestone: --- Target: i686 Created attachment 36145 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36145&action=edit Reproducer For the loop in the attached test compiled with -O3 -m32 -fPIE -pie after r224768 we generate 20 insns because of additional copies (first seen at fwprop pass) mov (%esp),%edi mov (%edi),%edx mov 0x4(%esp),%edi add %esi,%edx movzbl (%edx,%ebx,1),%edx mov %dl,(%ecx,%eax,1) mov (%edi),%edx mov 0x8(%esp),%edi add %ebp,%edx add (%edi),%edx mov 0xc(%esp),%edi movzbl (%edx),%edx mov %dl,0x1(%ecx,%eax,1) mov %esi,%edx add (%edi),%edx movzbl (%edx,%ebx,1),%edx mov %dl,0x2(%ecx,%eax,1) add $0x3,%eax cmp $0xfffffffd,%eax jne 50 <foo+0x50> while for r224767 we generate just 18 insns mov 0x0(%ebp),%edx mov 0x4(%esp),%esi add %ecx,%edx movzbl (%edx),%edx mov %dl,(%ebx,%eax,1) mov %ecx,%edx add (%esi),%edx add (%edi),%edx mov (%esp),%esi movzbl (%edx),%edx mov %dl,0x1(%ebx,%eax,1) mov (%esi),%edx add %ecx,%edx movzbl (%edx),%edx mov %dl,0x2(%ebx,%eax,1) add $0x3,%eax cmp $0xfffffffd,%eax jne 48 <foo+0x48> Probably this simplification should be tuned for array indices.