forked from OSchip/llvm-project
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. llvm-svn: 67142
This commit is contained in:
parent
6bfde496ee
commit
a6bed3e950
|
@ -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)]>;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue