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