xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/fast-isel-emutls.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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