Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / inline-asm-function-call-pic.ll
blob3c98eead8d18f50f73c55e1755cc79fd13f0bbf8
1 ; RUN: llc -O2 --relocation-model=pic -mtriple=i386-unknown-linux-gnu < %s 2>&1 | FileCheck %s
3 ; List the source code:
4 ; // clang  -m32 -fasm-blocks -S t.c -O2  -fpic -emit-llvm
5 ; int GV = 17;
7 ; extern unsigned int extern_func();
8 ; static unsigned int static_func()  __attribute__((noinline));
9 ; static unsigned int static_func() {
10 ;   return GV++;
11 ; }
13 ; void func() {
14 ;   static_func();
15 ;   __asm {
16 ;           call static_func
17 ;           call extern_func
18 ;           jmp extern_func
19 ;           shr eax, 0
20 ;           shr ebx, 0
21 ;           shr ecx, 0
22 ;           shr edx, 0
23 ;           shr edi, 0
24 ;           shr esi, 0
25 ;           shr ebp, 0
26 ;           shr esp, 0
27 ;         }
28 ; }
30 @GV = local_unnamed_addr global i32 17, align 4
32 define void @func() local_unnamed_addr #0 {
33 ; CHECK-LABEL: func:
34 ; CHECK:         calll .L0$pb
35 ; CHECK-NEXT:  .L0$pb:
36 ; CHECK-NEXT:    popl %ebx
37 ; CHECK-NEXT:  .Ltmp0:
38 ; CHECK-NEXT:    addl $_GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb), %ebx
39 ; CHECK-NEXT:    calll static_func
40 ; CHECK-NEXT:    #APP
41 ; CHECK-EMPTY:
42 ; CHECK-NEXT:    calll static_func
43 ; CHECK-NEXT:    calll extern_func@PLT
44 ; CHECK-NEXT:    jmp extern_func@PLT
45 ; CHECK-NEXT:    shrl $0, %eax
46 ; CHECK-NEXT:    shrl $0, %ebx
47 ; CHECK-NEXT:    shrl $0, %ecx
48 ; CHECK-NEXT:    shrl $0, %edx
49 ; CHECK-NEXT:    shrl $0, %edi
50 ; CHECK-NEXT:    shrl $0, %esi
51 ; CHECK-NEXT:    shrl $0, %ebp
52 ; CHECK-NEXT:    shrl $0, %esp
53 ; CHECK-EMPTY:
54 ; CHECK-NEXT:    #NO_APP
55 entry:
56   %call = tail call i32 @static_func()
57 ;; We test call, CALL, and jmp.
58   tail call void asm sideeffect inteldialect "call ${0:P}\0A\09CALL ${1:P}\0A\09jmp ${1:P}\0A\09shr eax, $$0\0A\09shr ebx, $$0\0A\09shr ecx, $$0\0A\09shr edx, $$0\0A\09shr edi, $$0\0A\09shr esi, $$0\0A\09shr ebp, $$0\0A\09shr esp, $$0", "*m,*m,~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{flags},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"(ptr nonnull elementtype(i32 (...)) @static_func, ptr nonnull elementtype(i32 (...)) @extern_func) #0
59   ret void
62 declare i32 @extern_func(...) #0
64 define internal i32 @static_func() #0 {
65 entry:
66   %0 = load i32, ptr @GV, align 4
67   %inc = add nsw i32 %0, 1
68   store i32 %inc, ptr @GV, align 4
69   ret i32 %0
72 attributes #0 = { nounwind }