From: Chris Lattner Date: Wed, 18 Mar 2009 00:43:52 +0000 (+0000) Subject: Disable the "call to immediate" optimization on x86-64. It is X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=ff81ebf7586fa7992353ed44a8c9d564130fb734;p=oota-llvm.git 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 --- diff --git a/lib/Target/X86/X86Instr64bit.td b/lib/Target/X86/X86Instr64bit.td index a6c0800c80c..73e1f9814b0 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)]>; diff --git a/test/CodeGen/X86/call-imm.ll b/test/CodeGen/X86/call-imm.ll index b99149b687f..8233d8698ab 100644 --- a/test/CodeGen/X86/call-imm.ll +++ b/test/CodeGen/X86/call-imm.ll @@ -1,6 +1,10 @@ -; RUN: llvm-as < %s | llc -march=x86 | grep call | not grep {*} -; RUN: llvm-as < %s | llc -march=x86 | grep call | grep 12345678 -; RUN: llvm-as < %s | llc -march=x86-64 | grep call | grep 12345678 +; RUN: llvm-as < %s | llc -march=x86 | grep {call.*12345678} + +; Call to immediate is not safe on x86-64 unless we *know* that the +; call will be within 32-bits pcrel from the dest immediate. + +; RUN: llvm-as < %s | llc -march=x86-64 | grep {call.*\*%rax} + ; PR3666 ; PR3773