; RUN: llc -O2 --relocation-model=pic -mtriple=i386-unknown-linux-gnu < %s 2>&1 | FileCheck %s ; List the source code: ; // clang -m32 -fasm-blocks -S t.c -O2 -fpic -emit-llvm ; int GV = 17; ; ; extern unsigned int extern_func(); ; static unsigned int static_func() __attribute__((noinline)); ; static unsigned int static_func() { ; return GV++; ; } ; ; void func() { ; static_func(); ; __asm { ; call static_func ; call extern_func ; jmp extern_func ; shr eax, 0 ; shr ebx, 0 ; shr ecx, 0 ; shr edx, 0 ; shr edi, 0 ; shr esi, 0 ; shr ebp, 0 ; shr esp, 0 ; } ; } @GV = local_unnamed_addr global i32 17, align 4 define void @func() local_unnamed_addr #0 { ; CHECK-LABEL: func: ; CHECK: calll .L0$pb ; CHECK-NEXT: .L0$pb: ; CHECK-NEXT: popl %ebx ; CHECK-NEXT: .Ltmp0: ; CHECK-NEXT: addl $_GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb), %ebx ; CHECK-NEXT: calll static_func ; CHECK-NEXT: #APP ; CHECK-EMPTY: ; CHECK-NEXT: calll static_func ; CHECK-NEXT: calll extern_func@PLT ; CHECK-NEXT: jmp extern_func@PLT ; CHECK-NEXT: shrl $0, %eax ; CHECK-NEXT: shrl $0, %ebx ; CHECK-NEXT: shrl $0, %ecx ; CHECK-NEXT: shrl $0, %edx ; CHECK-NEXT: shrl $0, %edi ; CHECK-NEXT: shrl $0, %esi ; CHECK-NEXT: shrl $0, %ebp ; CHECK-NEXT: shrl $0, %esp ; CHECK-EMPTY: ; CHECK-NEXT: #NO_APP entry: %call = tail call i32 @static_func() ;; We test call, CALL, and jmp. 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 ret void } declare i32 @extern_func(...) #0 define internal i32 @static_func() #0 { entry: %0 = load i32, ptr @GV, align 4 %inc = add nsw i32 %0, 1 store i32 %inc, ptr @GV, align 4 ret i32 %0 } attributes #0 = { nounwind }