[llvm-commits] [llvm] r67142 - in /llvm/trunk: lib/Target/X86/X86Instr64bit.td test/CodeGen/X86/call-imm.ll

Chris Lattner sabre at nondot.org
Tue Mar 17 17:43:53 PDT 2009


Author: lattner
Date: Tue Mar 17 19:43:52 2009
New Revision: 67142

URL: http://llvm.org/viewvc/llvm-project?rev=67142&view=rev
Log:
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.


Modified:
    llvm/trunk/lib/Target/X86/X86Instr64bit.td
    llvm/trunk/test/CodeGen/X86/call-imm.ll

Modified: llvm/trunk/lib/Target/X86/X86Instr64bit.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Instr64bit.td?rev=67142&r1=67141&r2=67142&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86Instr64bit.td (original)
+++ llvm/trunk/lib/Target/X86/X86Instr64bit.td Tue Mar 17 19:43:52 2009
@@ -109,9 +109,13 @@
               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)]>;

Modified: llvm/trunk/test/CodeGen/X86/call-imm.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/call-imm.ll?rev=67142&r1=67141&r2=67142&view=diff

==============================================================================
--- llvm/trunk/test/CodeGen/X86/call-imm.ll (original)
+++ llvm/trunk/test/CodeGen/X86/call-imm.ll Tue Mar 17 19:43:52 2009
@@ -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
 





More information about the llvm-commits mailing list