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

使用CreateAdd/CreateSub生成LLVM IR报错:ptr类型操作数非法

解决LLVM CreateAdd/CreateSub生成ptr类型加减法的错误

你当前的代码直接对CreateAlloca返回的指针类型值调用CreateAdd/CreateSub,导致生成的IR中出现了add ptr %a1, %b2这类非法指令——LLVM不允许直接对两个指针执行加法操作,这就是lli报错的核心原因。

原问题代码

你的C++代码:

left = this->builder->CreateAlloca(llvm::Type::getInt32Ty(*this->llvm_context), nullptr, std::string("a1"));
right = this->builder->CreateAlloca(llvm::Type::getInt32Ty(*this->llvm_context), nullptr, std::string("b2"));
builder->CreateSub(left, right, "sub");
builder->CreateAdd(left, right, "add");

生成的错误LLVM IR:

%a1 = alloca i32, align 4
store i32 100, ptr %a1, align 4
%b2 = alloca i32, align 4
store i32 10, ptr %b2, align 4
%add = add ptr %a1, %b2
%sub = sub ptr %c3, i32 2
%sub1 = sub ptr %add, %sub

报错信息:

lli: lli: test.ll:14:14: error: invalid operand type for instruction
%add = add ptr %a1, %b2


解决方案

要修复这个问题,你需要先通过CreateLoad指令加载指针指向的i32类型数值,再对这些数值执行加减操作,而不是直接操作指针本身。

修改后的C++代码示例:

// 保留原内存分配逻辑
left = this->builder->CreateAlloca(llvm::Type::getInt32Ty(*this->llvm_context), nullptr, std::string("a1"));
right = this->builder->CreateAlloca(llvm::Type::getInt32Ty(*this->llvm_context), nullptr, std::string("b2"));

// 加载指针指向的i32数值
auto left_val = builder->CreateLoad(llvm::Type::getInt32Ty(*this->llvm_context), left, "left_load");
auto right_val = builder->CreateLoad(llvm::Type::getInt32Ty(*this->llvm_context), right, "right_load");

// 对加载后的数值执行加减运算
builder->CreateSub(left_val, right_val, "sub");
builder->CreateAdd(left_val, right_val, "add");

修改后生成的合法LLVM IR示例:

%a1 = alloca i32, align 4
store i32 100, ptr %a1, align 4
%b2 = alloca i32, align 4
store i32 10, ptr %b2, align 4
%left_load = load i32, ptr %a1, align 4
%right_load = load i32, ptr %b2, align 4
%add = add i32 %left_load, %right_load
%sub = sub i32 %left_load, %right_load

此时生成的IR完全符合LLVM的类型规则,能够被lli正常编译和解释。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:20:21