summaryrefslogtreecommitdiffstats
path: root/lib/Target
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-18 00:43:52 +0000
committerChris Lattner <sabre@nondot.org>2009-03-18 00:43:52 +0000
commitff81ebf7586fa7992353ed44a8c9d564130fb734 (patch)
tree27221c42cf2a4d0b823fdb9dec27b2ef3a4acbce /lib/Target
parentbda0765e0763cd7d9b0980328fc1d718a6773628 (diff)
downloadexternal_llvm-ff81ebf7586fa7992353ed44a8c9d564130fb734.zip
external_llvm-ff81ebf7586fa7992353ed44a8c9d564130fb734.tar.gz
external_llvm-ff81ebf7586fa7992353ed44a8c9d564130fb734.tar.bz2
Disable the "call to immediate" optimization on x86-64. It is
not safe in general because the immediate could be an arbitrary value that does not fit in a 32-bit pcrel displacement. Conservatively fall back to loading the value into a register and calling through it. We still do the optzn on X86-32. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67142 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/X86/X86Instr64bit.td6
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/Target/X86/X86Instr64bit.td b/lib/Target/X86/X86Instr64bit.td
index a6c0800..73e1f98 100644
--- a/lib/Target/X86/X86Instr64bit.td
+++ b/lib/Target/X86/X86Instr64bit.td
@@ -109,9 +109,13 @@ let isCall = 1 in
XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS],
Uses = [RSP] in {
+
+ // NOTE: this pattern doesn't match "X86call imm", because we do not know
+ // that the offset between an arbitrary immediate and the call will fit in
+ // the 32-bit pcrel field that we have.
def CALL64pcrel32 : I<0xE8, RawFrm,
(outs), (ins i64i32imm:$dst, variable_ops),
- "call\t${dst:call}", [(X86call imm:$dst)]>,
+ "call\t${dst:call}", []>,
Requires<[In64BitMode]>;
def CALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst, variable_ops),
"call\t{*}$dst", [(X86call GR64:$dst)]>;