1; RUN: llc -O2 --relocation-model=pic -mtriple=i386-unknown-linux-gnu < %s 2>&1 | FileCheck %s 2 3; List the source code: 4; // clang -m32 -fasm-blocks -S t.c -O2 -fpic -emit-llvm 5; int GV = 17; 6; 7; extern unsigned int extern_func(); 8; static unsigned int static_func() __attribute__((noinline)); 9; static unsigned int static_func() { 10; return GV++; 11; } 12; 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; } 29 30@GV = local_unnamed_addr global i32 17, align 4 31 32define 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: pushl %ebp 41; CHECK-NEXT: subl $12, %esp 42; CHECK-NEXT: #APP 43; CHECK-EMPTY: 44; CHECK-NEXT: calll static_func 45; CHECK-NEXT: calll extern_func@PLT 46; CHECK-NEXT: jmp extern_func@PLT 47; CHECK-NEXT: shrl $0, %eax 48; CHECK-NEXT: shrl $0, %ebx 49; CHECK-NEXT: shrl $0, %ecx 50; CHECK-NEXT: shrl $0, %edx 51; CHECK-NEXT: shrl $0, %edi 52; CHECK-NEXT: shrl $0, %esi 53; CHECK-NEXT: shrl $0, %ebp 54; CHECK-NEXT: shrl $0, %esp 55; CHECK-EMPTY: 56; CHECK-NEXT: #NO_APP 57; CHECK-NEXT: addl $12, %esp 58; CHECK-NEXT: popl %ebp 59entry: 60 %call = tail call i32 @static_func() 61;; We test call, CALL, and jmp. 62 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 63 ret void 64} 65 66declare i32 @extern_func(...) #0 67 68define internal i32 @static_func() #0 { 69entry: 70 %0 = load i32, ptr @GV, align 4 71 %inc = add nsw i32 %0, 1 72 store i32 %inc, ptr @GV, align 4 73 ret i32 %0 74} 75 76attributes #0 = { nounwind } 77