Disable the "call to immediate" optimization on x86-64. It is
authorChris Lattner <sabre@nondot.org>
Wed, 18 Mar 2009 00:43:52 +0000 (00:43 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 18 Mar 2009 00:43:52 +0000 (00:43 +0000)
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

lib/Target/X86/X86Instr64bit.td
test/CodeGen/X86/call-imm.ll

index a6c0800c80c2adedd45b919d6c41589a3b755b05..73e1f9814b056d8aa3b77f76df89b819a2564563 100644 (file)
@@ -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)]>;
index b99149b687fc3d0e439b253ad7befc8f8a4535f0..8233d8698ab04f1ca3b1f3f39fd113981aab3f02 100644 (file)
@@ -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