// David Li Gcc's scalar replacement and predictive commoning implementation is very good. There are some missing cases. Handling output dependence is one of them. Handling of output dependence. In this case, the store at (1) is dead except for the last iteration -- it should be sinked out of the loop. (-O3 -fno-tree-vectorize) int a[1000]; int b[1000]; void foo(int n) { int i = 1; for(; i < n; i++) { a[i+1] =i; // (1) a[i] = i+1; } }
Confirmed.
Fixed in GCC 10 and above.