summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/X86/X86Instr64bit.td6
-rw-r--r--test/CodeGen/X86/call-imm.ll10
2 files changed, 12 insertions, 4 deletions
diff --git a/lib/Target/X86/X86Instr64bit.td b/lib/Target/X86/X86Instr64bit.td
index a6c0800c80..73e1f9814b 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 b99149b687..8233d8698a 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