[LLVMbugs] [Bug 13516] New: JIT always emits far calls
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Thu Aug 2 08:25:47 PDT 2012
http://llvm.org/bugs/show_bug.cgi?id=13516
Bug #: 13516
Summary: JIT always emits far calls
Product: libraries
Version: trunk
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P
Component: Target-Independent JIT
AssignedTo: unassignedbugs at nondot.org
ReportedBy: nunoplopes at sapo.pt
CC: llvmbugs at cs.uiuc.edu
Classification: Unclassified
I got this e-mail from Tim Starling (reproduced with authorization):
"
I think that the problem is probably exhaustion of the branch target
buffer. In x86-64 with CodeModel::Large, every call becomes
register-indirect, like:
0x400dc10e: movabs $0x40090bb0,%rax
0x400dc118: mov %r14,%rdi
0x400dc11b: mov %rbx,%rsi
0x400dc11e: callq *%rax
Based on my reading of the Intel optimization reference manual, each
such call site will use up a slot in the branch target buffer. Intel
doesn't include the size of it on their spec sheets or in the
optimization manual, but other sources say that it has 512 entries,
except for a few very recent processors which have 1024 entries.
I tried using CodeModel::Small, but it just caused an assert error
when it encountered calls to functions outside of RIP+2GB, instead of
upgrading them to register-indirect calls:
php: X86CodeEmitter.cpp:477:
void<unnamed>::Emitter<CodeEmitter>::emitMemModRMByte(const
llvm::MachineInstr&, unsigned int, unsigned int, intptr_t) [with
CodeEmitter = llvm::JITCodeEmitter]: Assertion `IndexReg.getReg() == 0
&& Is64BitMode && "Invalid rip-relative address"' failed.
Stack dump:
0. Running pass 'X86 Machine Code Emitter' on function
'@ZEND_CAST_SPEC_CONST_HANDLER'
Apparently there is no support in LLVM for some calls being short and
some being long. When code is compiled with clang or llc, it can use
CodeModel::Small and rely on the fact that all calls to code outside
of the 2GB neighbourhood will be via the PLT.
CodeModel::JITDefault is apparently a hack to work around the lack of
awareness of the RIP address in X86DAGToDAGISel. Any LLVM JIT will
have the same performance issue when more than 512 call instructions
appear in a loop.
"
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list