https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87664

            Bug ID: 87664
           Summary: invariant in loop after optimization
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: drepper.fsp+rhbz at gmail dot com
  Target Milestone: ---

Compile the following code with the current trunk or gcc 8.2.1:

#include <array>
#include <numeric>

int rs(int s) {
  std::array<int,100> ar;
  std::iota(ar.begin(), ar.end(), s);
  return std::accumulate(ar.begin(), ar.end(), 0);
}


With -O2 this leads on x86-64 to the following code:


0000000000000000 <rs(int)>:
   0:   48 81 ec 20 01 00 00    sub    $0x120,%rsp
   7:   48 8d 44 24 88          lea    -0x78(%rsp),%rax
   c:   0f 1f 40 00             nopl   0x0(%rax)
  10:   89 38                   mov    %edi,(%rax)
  12:   48 8d 8c 24 18 01 00    lea    0x118(%rsp),%rcx
  19:   00 
  1a:   48 83 c0 04             add    $0x4,%rax
  1e:   ff c7                   inc    %edi
  20:   48 39 c8                cmp    %rcx,%rax
  23:   75 eb                   jne    10 <rs(int)+0x10>
  25:   48 8d 54 24 88          lea    -0x78(%rsp),%rdx
  2a:   31 c0                   xor    %eax,%eax
  2c:   0f 1f 40 00             nopl   0x0(%rax)
  30:   03 02                   add    (%rdx),%eax
  32:   48 8d b4 24 18 01 00    lea    0x118(%rsp),%rsi
  39:   00 
  3a:   48 83 c2 04             add    $0x4,%rdx
  3e:   48 39 f2                cmp    %rsi,%rdx
  41:   75 ed                   jne    30 <rs(int)+0x30>
  43:   48 81 c4 20 01 00 00    add    $0x120,%rsp
  4a:   c3                      retq   


The relevant parts are the loop starting at offsets 10 and 30.  The respective
lea instructions to compute the end address of the loop at offset 12 and 32 are
invariant and should be hoisted out of the loops.

Reply via email to