【问题标题】:llvm irbuilder call instruction throwing exception on function inlining passllvm irbuilder调用指令在函数内联传递中抛出异常
【发布时间】:2015-12-19 00:27:04
【问题描述】:

我是 LLVM 新手。我正在使用 clang c++ API 将多个存根文件(在 c 中)编译为 IR,然后使用 IR 构建器(链接它们之后)将它们粘在一起,最终通过 JIT 运行。

这一切都很好,除非我在优化中添加 functionInlining 传递,此时在 IR 构建器中进行的这些函数调用之一将在传递管理器运行时触发以下异常:

Assertion failed: (New->getType() == getType() && "replaceAllUses of value with new value of different type!"), function replaceAllUsesWith, file /Users/mike/Development/llvm/llvm/lib/IR/Value.cpp, line 356.

这就是我制作呼叫指令的方式(非常简单):

Function *kernelFunc = mModule->getFunction( (kernel->Name() + StringRef("_") + StringRef(funcName)).str());
if (kernelFunc){
    CallInst* newInst = builder.CreateCall(kernelFunc, args);
}

后期模块优化:

legacy::PassManager passMan;
PassManagerBuilder Builder;
Builder.OptLevel = 3;
//Builder.Inliner = llvm::createFunctionInliningPass(); //commenting this back in trigger the exception
Builder.populateModulePassManager(passMan);

passMan.run( *mModule ); //exception occurs before this call returns

有什么想法吗?

【问题讨论】:

    标签: llvm llvm-ir llvm-c++-api


    【解决方案1】:

    尝试在您的模块上运行 llvm::verifyModule 以查看它是否正确。您可能有一个错误并且事先很幸运,但是它在内联中绊倒了一些东西。

    一般来说,断言检查您的模块可能有问题的部分内容,但验证检查更多。

    这可能是 LLVM 中的一个错误,但很可能是一个坏模块,很容易发生。

    【讨论】:

    • 谢谢,我不知道 verifyModule。不幸的是,这个模块没有错误地通过验证器,并且仍然抛出内联传递。
    【解决方案2】:

    所以我最终设置了我的开发环境,以便我可以在调试器中检查断言调用。我发现被替换的基本块的上下文集与被替换的块不同。返回并确保 IRBuilder 使用与 IR 解析器相同的上下文来解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多