1; RUN: llc < %s -emulated-tls -march=x86 -relocation-model=pic -mtriple=i686-unknown-linux-gnu -fast-isel | FileCheck %s 2; PR3654 3 4@v = thread_local global i32 0 5define i32 @f() nounwind { 6entry: 7 %t = load i32, i32* @v 8 %s = add i32 %t, 1 9 ret i32 %s 10} 11 12; CHECK-LABEL: f: 13; CHECK: movl __emutls_v.v@GOT(%ebx), %eax 14; CHECK-NEXT: movl %eax, (%esp) 15; CHECK-NEXT: calll __emutls_get_address@PLT 16; CHECK-NEXT: movl (%eax), %eax 17 18@alias = internal alias i32, i32* @v 19define i32 @f_alias() nounwind { 20entry: 21 %t = load i32, i32* @v 22 %s = add i32 %t, 1 23 ret i32 %s 24} 25 26; CHECK-LABEL: f_alias: 27; CHECK: movl __emutls_v.v@GOT(%ebx), %eax 28; CHECK-NEXT: movl %eax, (%esp) 29; CHECK-NEXT: calll __emutls_get_address@PLT 30; CHECK-NEXT: movl (%eax), %eax 31 32; Use my_emutls_get_address like __emutls_get_address. 33@my_emutls_v_xyz = external global i8*, align 4 34declare i8* @my_emutls_get_address(i8*) 35 36define i32 @my_get_xyz() { 37entry: 38 %call = call i8* @my_emutls_get_address(i8* bitcast (i8** @my_emutls_v_xyz to i8*)) 39 %0 = bitcast i8* %call to i32* 40 %1 = load i32, i32* %0, align 4 41 ret i32 %1 42} 43 44; CHECK-LABEL: my_get_xyz: 45; CHECK: movl my_emutls_v_xyz@GOT(%ebx), %eax 46; CHECK-NEXT: movl %eax, (%esp) 47; CHECK-NEXT: calll my_emutls_get_address@PLT 48; CHECK-NEXT: movl (%eax), %eax 49