【问题标题】:LLVM converting a Constant to a ValueLLVM 将常量转换为值
【发布时间】: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_valuenew_value

标签: opencl llvm gpgpu llvm-ir


【解决方案1】:

您没有提供导致第一个断言的代码,但其措辞非常明确:您正在尝试创建一个存储,其中值操作数和指针操作数的类型不一致。如果您提供生成该错误的代码,这将对这个问题很有用。

您的第二种所谓的“臃肿”解决方案是将old_value 存储到堆栈中然后再次加载它的正确方法。你写:

但是,当涉及不同类型时,此解决方案会创建自己的注册错误

这些“注册错误”是您应该解决的真正问题。

在任何情况下,“将常量转换为值”的整个前提都是有缺陷的 - 正如您正确观察到的那样,所有常量都是值。将值存储到堆栈中只是为了再次加载它是没有意义的,实际上标准 LLVM 传递“mem2reg”将完全删除这样的序列,用原始值替换所有使用加载。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
相关资源
最近更新 更多