[Bug middle-end/104195] New: Fails to optimize nested array indexing p[i/N].data[i%N]
arthur.j.odwyer at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sun Jan 23 16:51:56 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104195
Bug ID: 104195
Summary: Fails to optimize nested array indexing
p[i/N].data[i%N]
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: arthur.j.odwyer at gmail dot com
Target Milestone: ---
GCC seems to be unable to optimize some nested array accesses of the form
p[i/N].data[i%N] into a simple ((T*)p)[i]. The C test case is
struct CChunk { int data[4]; };
int f(struct CChunk *p, unsigned long long i) { return p[i/4].data[i%4]; }
gcc -O2 currently produces:
movq %rsi, %rax
andl $3, %esi
shrq $2, %rax
salq $4, %rax
addq %rax, %rdi
movl (%rdi,%rsi,4), %eax
ret
but I would prefer it to produce:
movl (%rdi,%rsi,4), %eax
retq
A more exhaustive C++ test follows — GCC can optimize a few of these, but not
all. (Clang can't optimize any of these; I've just filed
https://github.com/llvm/llvm-project/issues/53367 about that.)
https://godbolt.org/z/3E1e6c5e3
template<class T, int N>
struct Chunk {
T data[N];
};
template<class T, int N, class IndexType>
int f(Chunk<T, N> *p, IndexType i) {
return p[i/N].data[i%N];
}
template int f(Chunk<char,2>*, unsigned long long); // GCC wins
template int f(Chunk<char,4>*, unsigned long long); // GCC wins
template int f(Chunk<char,2>*, unsigned);
template int f(Chunk<char,4>*, unsigned);
template int f(Chunk<int,2>*, unsigned long long); // GCC wins
template int f(Chunk<int,4>*, unsigned long long);
template int f(Chunk<int,2>*, unsigned);
template int f(Chunk<int,4>*, unsigned);
More information about the Gcc-bugs
mailing list