-loweratomic: Lower Atomic Intrinsics to Non-Atomic Form
Description
-loweratomic pass 旨在将 atomic 的 intrinsics (一般来说指非常 low-level 的可以 directly access hardware resources 的 operation) 变成 non-atomic 的。
这个意义在于,在多线程程序中,一些操作被设定为 atomic 来处理 synchronization 等特殊场景。
但是很多时候,这种 atomic 的操作是非常昂贵的。
所以, -loweratomic pass 的目的是把所有 atomic 的操作都降级成非 atomic 的,这样可以降低 overhead。
注意, -loweratomic pass 并不会 verify 程序的执行环境是不是 non-preemptible 的,即分析 external library or entire call graph 来判断这么做对不对,它只能 simply 把所有的 atomic operation 给降级。
所以这个 pass 也不是特别智能,只能说慎用。
Code Example
原始的 IR code。
define void @increment(int* %ptr) {
%atomic_inc = atomicrmw add i32* %ptr, i32 1 seq_cst
ret void
}
-loweratomic transform 过的 IR code。
define void @increment(int* %ptr) {
%load = load i32, i32* %ptr
%inc = add i32 %load, 1
store i32 %inc, i32* %ptr
ret void
}