为什么 GCC 无法减少增加同一缓冲区两个位置的循环?

Ace*_*Src 8 c++ compiler-construction optimization assembly gcc

这是一个有界循环,它递增同一缓冲区的两个位置。

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];
        }
}
Run Code Online (Sandbox Code Playgroud)

根据编译器资源管理器(https://godbolt.org/z/b1sjf5669)的结果,即使在-O3优化级别,程序仍然存在涉及命令的循环add 1

相反,如果++counter[B]删除,编译器可以减少循环并将程序优化为counter[A] += n. (https://godbolt.org/z/4YoPcz5rT

为什么编译器是保守的,即不将代码转换为counter[A] += n, counter[B] += n这种情况?

我知道一些别名问题会导致循环减少失败。然而,这里只有一个缓冲区A=B,即使优化代码也不会改变结果。