You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用llvm-as处理LLVM示例代码时遇@llvm.atomic.load.add.i64.p0i64未定义错误

解决LLVM中@llvm.atomic.load.add.i64.p0i64未定义的错误

错误源于你使用的原子操作函数属于LLVM内置intrinsic,但代码中未声明;且这类原子加载-修改操作更推荐直接用LLVM指令实现,而非调用intrinsic。以下是两种可行解决方案:

方案1:使用atomicrmw指令(推荐)

LLVM中原子加载-修改-存储操作的标准实现是atomicrmw指令,它会返回操作前的原值,完全匹配你代码的需求。修改后的代码如下:

define void @sub1(i32* %p, i32 %v) {
entry:
; CHECK: sub1:
; CHECK: subl
        %0 = atomicrmw sub i32* %p, i32 %v seq_cst
        ret void
}

define void @inc4(i64* %p) {
entry:
; CHECK: inc4:
; CHECK: incq
        %0 = atomicrmw add i64* %p, i64 1 seq_cst
        ret void
}

其中seq_cst是内存顺序,可根据实际需求替换为acquire、release等其他合法内存顺序。

方案2:声明所需的intrinsic函数

若坚持使用原有的intrinsic调用方式,需在代码开头添加对应的函数声明:

declare i32 @llvm.atomic.load.sub.i32.p0i32(i32*, i32)
declare i64 @llvm.atomic.load.add.i64.p0i64(i64*, i64)

define void @sub1(i32* %p, i32 %v) {
entry:
; CHECK: sub1:
; CHECK: subl
        %0 = tail call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %p, i32 %v)
        ret void
}

define void @inc4(i64* %p) {
entry:
; CHECK: inc4:
; CHECK: incq
        %0 = tail call i64 @llvm.atomic.load.add.i64.p0i64(i64* %p, i64 1)
        ret void
}

修改完成后,重新执行命令./build/bin/llvm-as < test.ll即可成功完成编译。若需要生成字节码文件,可添加输出参数:./build/bin/llvm-as < test.ll -o test.bc。

内容的提问来源于stack exchange,提问作者ramgorur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:33:24