【发布时间】:2016-11-04 21:30:54
【问题描述】:
在为布尔数组编写“不等式扫描”的过程中, 我最终写了这个循环:
// Heckman recursive doubling
#ifdef STRENGTHREDUCTION // Haswell/gcc does not like the multiply
for( s=1; s<BITSINWORD; s=s*2) {
#else // STRENGTHREDUCTION
for( s=1; s<BITSINWORD; s=s+s) {
#endif // STRENGTHREDUCTION
w = w XOR ( w >> s);
}
我观察到 gcc 会展开 s=s*2 循环, 但不是 s=s+s 循环。这有点不直观,因为 加法的循环计数分析应该,IMO 更简单 比乘法。我怀疑 gcc 确实知道 s=s+s 循环计数,只是害羞。
有没有人知道这是否有充分的理由 gcc 的行为? 我是出于好奇而问这个...
[展开的版本,顺便说一句,运行速度比循环慢一点。]
谢谢, 罗伯特
【问题讨论】:
标签: gcc loop-unrolling