【发布时间】:2014-03-31 15:50:14
【问题描述】:
我正在使用自定义 LLVM 通行证,如果我遇到商店 其中编译器将值转换为常量;例如有一个明确的商店:
X[gidx] = 10;
那么LLVM就会产生这个错误:
aoc: ../../../Instructions.cpp:1056: void llvm::StoreInst::AssertOK(): Assertion `getOperand(0)->getType() == cast<PointerType>(getOperand(1)->getType())->getElementType() && "Ptr must be a pointer to Val type!"' failed.
继承顺序为:Value
Value *new_value;
if(isa<ConstantInt>(old_value) || isa<ConstantFP>(old_value)){
Instruction *allocInst = builder.CreateAlloca(old_value->getType());
builder.CreateStore(old_value, allocInst);
new_value = builder.CreateLoad(allocResultInst);
}
但是,当涉及不同类型时,此解决方案会创建自己的注册错误,所以我想避免它。
有人知道如何将常量转换为值吗?这一定是一个我没有看到的简单问题。我正在 Ubuntu 12.04、LLVM 3、AMD gpu、OpenCL 内核上进行开发。
提前谢谢。
编辑:
产生列出的第一个错误的原始代码很简单:
builder.CreateStore(old_value, store_addr);
EDIT2:
这个 old_value 被声明为 值 *old_value = current_instruction->getOperand(0);
所以我从第一行代码中获取要存储的值,在本例中为“10”。
【问题讨论】:
-
“产生列出的第一个错误的原始代码很简单” - 您能否提供更大的 sn-p,包括您如何创建
old_value和new_value?