我在使用LLVM_IR传递编译OpenCL内核文件时,最近遇到此错误:
aoc: ../../../TargetRegisterInfo.cpp:89: const llvm::TargetRegisterClass* llvm::TargetRegisterInfo::getMinimalPhysRegClass(unsigned int, llvm::EVT) const: Assertion `BestRC && "Couldn't find the register class"' failed.
我不确定这意味着什么。我从文档中读到的内容并没有多大意义。基本上它意味着后端不知道要在寄存器中放入什么类型?
有谁知道这个错误意味着什么?
它出现在各种内核中,似乎没有一个明确的模式,我可以作为一个例子。如果需要,我可以发布更多详细信息,但我真的想知道错误告诉我的内容。
提前感谢您提供任何帮助。
更新: LLVM中的这个命令似乎导致了这个问题:
AllocaInst* llvm::IRBuilder< preserveNames, T, Inserter >::CreateAlloca(Type * Ty, Value * ArraySize = 0,const Twine & Name = "")
当我以这种方式进行非特定分配时,会产生此错误。我使用此命令的原因是,有时在内核中将存在一个常量的存储值。由于LLVM通常需要一个值,我需要一种转换它的方法。所以我做了一个直接存储和加载的分配。这是由另一个SOF用户建议的。有没有人知道在LLVM中将常量转换为值的替代方法?
谢谢大家。
好吧这似乎是传统的:
Value *new_val = dyn_cast<Value>(old_val);
完美无缺。希望这些知识可以帮助其他人。
更新3:抓一点。动态强制转换不会将Constant转换为Value类型。如果有人知道该怎么做,请告诉我。
答案 0 :(得分:0)
我承认我不明白你得到的断言错误。但是:
我使用此命令的原因是,有时在内核中会有一个Constant值的存储值。由于LLVM通常需要一个值,我需要一种转换它的方法。所以我做了一个直接存储和加载的分配。
这对我没有意义:
llvm::Constant
已经是llvm::Value