https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87987
Bug ID: 87987 Summary: Missed optimization with ranged-for loop on a constexpr array Product: gcc Version: 8.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: lh_mouse at 126 dot com Target Milestone: --- This simple program: ```c++ static constexpr bool table[] = { 1, 0, 0, 1, 1, 0, 1, 0 }; int check() { int sum = 0; for(auto value : table) { sum += value; } return sum; } ``` after being compiled by GCC 8.2 with `-std=c++11 -O2 -Wall -Wextra -Wpedantic -Werror`, yields a loop: ```asm check(): mov edx, OFFSET FLAT:table xor eax, eax .L2: movzx ecx, BYTE PTR [rdx] add rdx, 1 add eax, ecx cmp rdx, OFFSET FLAT:table+8 jne .L2 ret ``` , while Clang 6.0 optimizes the body to a constant: ```asm check(): # @check() mov eax, 4 ret ``` ( Online comparison can be viewed here: https://gcc.godbolt.org/z/oaSr6j ) Making the function `constexpr` however overcomes this obstacle: ```c++ static constexpr bool table[] = { 1, 0, 0, 1, 1, 0, 1, 0 }; // This requires only C++11. constexpr int check_constexpr(const bool *p, int n) { return (n == 0) ? 0 : *p + check_constexpr(p + 1, n - 1); } int check() { return check_constexpr(table, sizeof(table)); } ``` ( And here is the online comparison for this one: https://gcc.godbolt.org/z/HZjBSh )