[Bug tree-optimization/66261] operations that simplify whether the pointers are the same or not (++p;++q;--p;--q)
pcordes at gmail dot com
gcc-bugzilla@gcc.gnu.org
Fri Dec 8 07:46:41 GMT 2023
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66261
Peter Cordes <pcordes at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |pcordes at gmail dot com
--- Comment #3 from Peter Cordes <pcordes at gmail dot com> ---
Re: does this show up in real code: not exactly this, but incrementing two
array elements that might or might not be the same location defeats optimizing
an x++ loop into x += n
From
https://stackoverflow.com/questions/77618348/why-does-gcc-fail-to-reduce-a-loop-that-increments-two-locations-of-the-same-buf
unsigned int getid();
void foo(unsigned int *counter, unsigned int n) {
unsigned int A = getid();
unsigned int B = getid();
for (unsigned int i = 0; i < n; i++) {
++counter[A];
++counter[B];
}
}
If the two locations are related so GCC knows they're not the same,
such as arr[A%4 + 0] and arr[A%4 + 16], it can also optimize.
https://godbolt.org/z/PbeaW8nnE
But it doesn't help to do something like if (A==B) return;
before the loop so it can't be entered with A==B
Source-level loop fission is required to get good asm (two increments to memory
locations that might be the same or not).
More information about the Gcc-bugs
mailing list