【问题标题】:LLVM JIT fabsf resolve error when using powf使用 powf 时 LLVM JIT fabsf 解决错误
【发布时间】:2015-04-10 07:48:49
【问题描述】:

我正在试验 LLVM 的 JIT 功能,并在调用 powf 时观察到,如果我只是为其添加声明,则调用 powf 时有效

declare float @powf(float, float))

并用两个变量调用它

%4 = call float @powf(float %3, float %2)

但是,当我使用恒定指数 0.5 做同样的事情时

%4 = call float @powf(float %3, float 5.000000e-01)

它失败并出现以下错误:

LLVM 错误:程序使用了无法解析的外部函数“fabsf”!

powf 调用被以下优化通道替换,所以我知道fabsf 来自哪里:

%sqrtf = tail call float @sqrtf(float %3) #1
%fabsf = tail call float @fabsf(float %sqrtf) #1
%4 = fcmp oeq float %3, 0xFFF0000000000000
%5 = select i1 %4, float 0x7FF0000000000000, float %fabsf

我尝试在外部注册fabsf(但显然不正确),但没有成功:

auto float_type = llvm::Type::getFloatTy(context);
std::vector<llvm::Type *> unary_arg_types(1, float_type);
auto unary_op_type = llvm::FunctionType::get(float_type, unary_arg_types, false);
auto fabsf_llvm = llvm::Function::Create(unary_op_type, llvm::Function::ExternalLinkage, "fabsf", module);
ee->addGlobalMapping(fabsf_llvm, reinterpret_cast<void *>(&::fabsf));

我正在使用 MCJIT ExecutionEngine 并在带有 LLVM 的 Windows 7 上运行,我的测试程序使用 MinGW 编译。

问题一:如何注册fabsf才不会出现错误?

问题 2:为什么这里需要 fabsf

编辑:看来我偶然发现了一个(已知的)MCJIT 错误:http://llvm.org/bugs/show_bug.cgi?id=20656

【问题讨论】:

    标签: c++ c++11 llvm


    【解决方案1】:

    是的,这是 MCJIT 中的一个已知错误。

    我在 LLVMDev 邮件列表中偶然发现了一个解决方案。 您可以使用llvm::sys::DynamicLibrary::AddSymbol()位于llvm/Support/DynamicLibrary.h 标头中的llvm::sys::DynamicLibrary::AddSymbol() 来注册您缺少的符号。这是您问题 1 的答案。

    对于问题 2:(免责声明:我不是浮点专家,不知道我在这里写的是否属实)

    由于powf 转换为sqrtf,当sqrtf 的结果未定义时,您将得到一个QNaN(安静的NaN),因为提供了一个否定的参数。在 ISO 754 中,QNaN 表示为 0xFFF00000000000000x7FF0000000000000(对于 ISO 754 中的 QNaN,符号无关紧要)。

    在 C++ 中,pow 的定义如下:

    pow(base, exp) 如果 base 是有限的,则返回 NaN 并引发 FE_INVALID 负数和 exp 是有限且非整数的。

    ...

    pow(±0, exp),其中 exp 为正非整数或正偶数 整数,返回 +0

    请注意,它每次都会返回一个正数 0

    但是对于sqrt

    如果参数为 +∞ 或 ±0,则原样返回。

    要最终回答您的问题:在您的情况下,fabsf 有必要摆脱sqrt 保护者而pow 将其丢弃的标志。

    【讨论】:

    • 谢谢。我忘记了通过 sqrt 未修改的签名 0。您能否详细说明您对 Q1 的回答?
    • 算了,我以为我必须创建一个 DynamicLibrary 实例,但它是一个简单的静态函数。现在唯一的问题是......为什么不将 fabsf 降低到内在/FABS 指令......
    猜你喜欢
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2011-03-31
    • 2012-11-01
    • 2011-05-03
    相关资源
    最近更新 更多