https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78528
Bug ID: 78528 Summary: Recursion not optimized in simple case Product: gcc Version: 7.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: mawww at kakoune dot org Target Milestone: --- The following code: struct Int { constexpr Int(int value) : m_value(value) {} constexpr friend Int operator+(Int lhs, Int rhs) { return {lhs.m_value + rhs.m_value}; } int m_value; }; Int strlen(const char* s) { return *s == 0 ? 0 : strlen(s+1) + 1; } when compiled with `-std=c++11 -O3` generates the following assembly for the strlen function: _Z6strlenPKc: .LFB4: .cfi_startproc cmpb $0, (%rdi) jne .L2 xorl %eax, %eax ret .p2align 4,,10 .p2align 3 .L2: cmpb $0, 1(%rdi) movl $1, %eax jne .L12 .L10: ret .p2align 4,,10 .p2align 3 .L12: cmpb $0, 2(%rdi) movl $2, %eax je .L10 subq $8, %rsp .cfi_def_cfa_offset 16 addq $3, %rdi call _Z6strlenPKc addq $8, %rsp .cfi_def_cfa_offset 8 addl $3, %eax ret .cfi_endproc As we can see, the generated code is still recursive, I think the optimizer should have optimized that, is it correctly does when we use 'int' instead of 'Int'.