Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / X86 / x32-function_pointer-3.ll
blob4e9176fa8753fe579ea68b066e829d8241487006
1 ; RUN: llc < %s -mtriple=x86_64-linux-gnux32 | FileCheck %s
2 ; RUN: llc < %s -mtriple=x86_64-linux-gnux32 -fast-isel | FileCheck %s
4 ; Test calling function pointer passed in struct
6 ;    The function argument `h' in
8 ;    struct foo {
9 ;      void (*f) (void);
10 ;      int i;
11 ;    };
12 ;    void
13 ;    bar (struct foo h)
14 ;    {
15 ;      h.f ();
16 ;    }
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.
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 ptr
26 ; CHECK: movl   %edi, %e[[REG:.*]]
27   tail call void %0() nounwind
28 ; CHECK: jmpq   *%r[[REG]]
29   ret void