Taco H. in den Bosch
2013-Sep-19 08:57 UTC
[LLVMdev] JIT compiled intrinsics calls is call to null pointer
Hi Andrew, this sounded a plausible explanation, because the X86 processor does not have an instruction to calculate the power function. So I tried the llvm.sin.f32 intrinsic, as the X86 processor family does have an instruction for that, but I still get the same problem. While you may still be right, there is at least something else going on as well. Thanks for your input, though. Taco. ---------------------------------------- From: "Andrew MacPherson" <andrew.macp at gmail.com> Sent: Thursday, September 19, 2013 10:36 AM To: taco at heddesit.nl Cc: llvmdev at cs.uiuc.edu Subject: Re: [LLVMdev] JIT compiled intrinsics calls is call to null pointer Hi Taco, We had a similar issue where a math intrinsic was being converted to a call to null and it turned out to be because the system didn't support the CPU instructions for the operation so the intrinsic used a call to the library function (pow in your case). However because we weren't expecting this math function to be looked up by MCJIT in our JITMemoryManager::getPointerToNamedFunction() we weren't making it available and it was returning null. Not sure if this is relevant to your case but maybe it'll help point you in the right direction. Cheers, Andrew On Wed, Sep 18, 2013 at 8:32 AM, Taco H. in den Bosch <taco at heddesit.nl> wrote: Hi everyone, I am trying to call an LLVM intrinsic (llvm.pow.f32), inserted with the following call: std::vector<llvm::Type *> arg_types;arg_types.push_back(llvm::Type::getFloatTy(context)); auto function=llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::pow, arg_types);auto result=ir_builder->CreateCall(function, args); When I try to execute the code generated by the JIT compiler, I see that the intrinsic is not compiled into a math coprocessor instruction, but in a call to a null address: 002300B8 sub esp,8 002300BB movss xmm0,dword ptr ds:[2300B0h] 002300C3 movss dword ptr [esp+4],xmm0 002300C9 movss xmm0,dword ptr ds:[2300B4h] 002300D1 movss dword ptr [esp],xmm0 002300D6 call 00000000 002300DB add esp,8 002300DE ret Is there anything special that I need to do in order to be able to call intrinsics, either in general or when JITting? I am either doing something wrong, or forgetting to do something, but I don't know what. I am working with a Visual Studio compiled version on Windows (x86). All hints will be appreciated, with kind regards, Taco H. in den Bosch. _______________________________________________ LLVM Developers mailing list LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130919/0fcf9fb2/attachment.html>
Richard Mitton
2013-Sep-19 19:38 UTC
[LLVMdev] JIT compiled intrinsics calls is call to null pointer
sin/cos on Intel is an x87 FPU instruction, but it looks like LLVM is generating SSE code instead, which relies on a library function for sin/cos/pow/etc. Richard Mitton richard at codersnotes.com On 09/19/2013 01:57 AM, Taco H. in den Bosch wrote:> Hi Andrew, > > this sounded a plausible explanation, because the X86 processor does > not have an instruction to calculate the power function. > > So I tried the llvm.sin.f32 intrinsic, as the X86 processor family > does have an instruction for that, but I still get the same problem. > While you may still be right, there is at least something else going > on as well. > > Thanks for your input, though. > > Taco. > > ------------------------------------------------------------------------ > *From*: "Andrew MacPherson" <andrew.macp at gmail.com> > *Sent*: Thursday, September 19, 2013 10:36 AM > *To*: taco at heddesit.nl > *Cc*: llvmdev at cs.uiuc.edu > *Subject*: Re: [LLVMdev] JIT compiled intrinsics calls is call to null > pointer > > Hi Taco, > > We had a similar issue where a math intrinsic was being converted to a > call to null and it turned out to be because the system didn't support > the CPU instructions for the operation so the intrinsic used a call to > the library function (pow in your case). However because we weren't > expecting this math function to be looked up by MCJIT in our > JITMemoryManager::getPointerToNamedFunction() we weren't making it > available and it was returning null. > > Not sure if this is relevant to your case but maybe it'll help point > you in the right direction. > > Cheers, > Andrew > > > On Wed, Sep 18, 2013 at 8:32 AM, Taco H. in den Bosch > <taco at heddesit.nl <mailto:taco at heddesit.nl>> wrote: > > > Hi everyone, > > I am trying to call an LLVM intrinsic (llvm.pow.f32), inserted > with the following call: > > std::vector<llvm::Type *> arg_types; > arg_types.push_back(llvm::Type::getFloatTy(context)); > auto function=llvm::Intrinsic::getDeclaration(module, > llvm::Intrinsic::pow, arg_types); > auto result=ir_builder->CreateCall(function, args); > > When I try to execute the code generated by the JIT compiler, I > see that the intrinsic is not compiled into a math coprocessor > instruction, but in a call to a null address: > > 002300B8 sub esp,8 > 002300BB movss xmm0,dword ptr ds:[2300B0h] > 002300C3 movss dword ptr [esp+4],xmm0 > 002300C9 movss xmm0,dword ptr ds:[2300B4h] > 002300D1 movss dword ptr [esp],xmm0 > 002300D6 call 00000000 > 002300DB add esp,8 > 002300DE ret > > Is there anything special that I need to do in order to be able to > call intrinsics, either in general or when JITting? I am either > doing something wrong, or forgetting to do something, but I don't > know what. > > I am working with a Visual Studio compiled version on Windows (x86). > > All hints will be appreciated, with kind regards, > > Taco H. in den Bosch. > > > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> > http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130919/7df72f61/attachment.html>