哪些情况导致LLVM IR中“使用指令不是指令”?

时间:2019-01-01 09:33:40

标签: llvm

我多次遇到此错误。然后,当我改变周围的事物时,它就会起作用。我的代码太复杂,无法在此处发布。我无法简化和重现该问题。

LLVM中引发异常的源代码在这里:http://llvm.org/doxygen/Verifier_8cpp_source.html

   // Check that all uses of the instruction, if they are instructions
   // themselves, actually have parent basic blocks.  If the use is not an
   // instruction, it is an error!
   for (Use &U : I.uses()) {
     if (Instruction *Used = dyn_cast<Instruction>(U.getUser()))
       Assert(Used->getParent() != nullptr,
              "Instruction referencing"
              " instruction not embedded in a basic block!",
              &I, Used);
     else {
       CheckFailed("Use of instruction is not an instruction!", U);
       return;
     }
   }

但是我还是不明白这是什么意思

所以,我想知道是否有人有一个小例子,该错误会导致“使用指令不是指令”错误,并说明发生这种错误的原因。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可能在代码中的某处生成了虚假的IR。您提到的断言可能通过例如构造一个将其他指令的结果用作操作数的常量表达式来触发:

%0 = <some instruction producing result>
store i8* getelementptr inbounds ([123 x i8], [123 x i8]* @some_string, i32 %0, i32 0), ...

在这里,getelementptr inbounds ...部分是constant expression,除其他常量外,不能包含任何内容。因此,我们不能在此处使用%0作为索引。

相反,我们需要使用getelementptr 说明

%0 = <some instruction producing result>
%1 = i8* getelementptr inbounds ([123 x i8], [123 x i8]* @some_string, i32 %0, i32 0)
store i8* %1, ...

对于您的情况,您只需从代码中或在调试器中调用I.dump()即可找出导致错误断言的确切指令。