Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mtriple=x86_64-linux-gnux32 | FileCheck %s
      2 ; RUN: llc < %s -mtriple=x86_64-linux-gnux32 -fast-isel | FileCheck %s
      3 
      4 ; Test calling function pointer passed in struct
      5 
      6 ;    The function argument `h' in
      7 
      8 ;    struct foo {
      9 ;      void (*f) (void);
     10 ;      int i;
     11 ;    };
     12 ;    void
     13 ;    bar (struct foo h)
     14 ;    {
     15 ;      h.f ();
     16 ;    }
     17 
     18 ;    is passed in the 64-bit %rdi register.  The `f' field is in the lower 32
     19 ;    bits of %rdi register and the `i' field is in the upper 32 bits of %rdi
     20 ;    register.  We need to zero-extend %edi to %rdi before branching via %rdi.
     21 
     22 define void @bar(i64 %h.coerce) nounwind {
     23 entry:
     24   %h.sroa.0.0.extract.trunc = trunc i64 %h.coerce to i32
     25   %0 = inttoptr i32 %h.sroa.0.0.extract.trunc to void ()*
     26 ; CHECK: movl	%edi, %e[[REG:.*]]
     27   tail call void %0() nounwind
     28 ; CHECK: jmpq	*%r[[REG]]
     29   ret void
     30 }
     31