https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94092
--- Comment #8 from Mel Chen <bina2374 at gmail dot com> --- Sorry for using the bad example to describe the problem I am facing. Let me clarify my question with a more precise example. void array_mul(int N, int *C, short *A, short *B) { int i, j; for (i = 0; i < N; i++) { C[i] = 0; // Will be transformed to __builtin_memset for (j = 0; j < N; j++) { C[i] += (int)A[i * N + j] * (int)B[j]; } } } If I compile the case with -O2 -fno-tree-loop-distribute-patterns, the store operation 'C[i] = 0' can be eliminated by dead store elimination (dse3). But without -fno-tree-loop-distribute-patterns, it will be transformed to memset by loop distribution (ldist) because ldist executes before dse3. Finally the memset will not be eliminated. Another point is if there are other operations in the same level loop as the store operation, is it really beneficial to do loop distribution and then convert to builtin function?