如何让Clang对已知初始值的atomic冗余原子操作进行优化?
函数f1:已实现理想优化
编译器能识别出原子变量x的值始终为1,直接返回0,生成的汇编完全消除了原子操作:
int f1() { std::atomic<int> x = 1; if (x.load() == 1) { return 0; } return 1; }
对应汇编:
f1(): # @f3() xor eax, eax ret
函数f2:优化不完全的案例
编译器虽省略了无意义的fetch_sub(0)操作,但未识别x恒为1,仍保留了比较逻辑;且即便指定std::memory_order_relaxed,仍生成了mfence指令:
int f2() { std::atomic<int> x = 1; if (x.fetch_sub(0, std::memory_order_relaxed) == 1) { return 0; } return 1; }
对应汇编:
f2(): # @f2() mov dword ptr [rsp - 4], 1 mfence mov ecx, dword ptr [rsp - 4] xor eax, eax cmp ecx, 1 setne al ret
函数f3:目标优化场景(模拟shared_ptr引用计数)
这是实际需要优化的场景:用x模拟shared_ptr的引用计数,临时shared_ptr对象创建后立即销毁(对应fetch_sub(1)),希望编译器能消除不必要的原子操作,像f1一样直接返回0:
int f3() { std::atomic<int> x = 1; if (x.fetch_sub(1, std::memory_order_relaxed) == 1) { return 0; } return 1; }
对应汇编:
f3(): # @f3() mov dword ptr [rsp - 4], 1 xor eax, eax lock dec dword ptr [rsp - 4] setne al ret
问题:使用Clang编译器时,如何让f3获得与f1相同的完全优化效果?
内容的提问来源于stack exchange,提问作者janekb04
相关产品推荐
相关产品推荐

