Hexagon: Use multiclass for Jump instructions.
[oota-llvm.git] / test / CodeGen / X86 / tls-init-funcs.ll
1 ; RUN: llc < %s -mtriple x86_64-apple-macosx10 | FileCheck %s
2
3 ; CHECK: .section __DATA,__thread_init,thread_local_init_function_pointers
4 ; CHECK: .align 3
5 ; CHECK: .quad ___tls_init
6
7 %struct.A = type { i8 }
8 %struct.B = type { i32 }
9
10 @i = thread_local global i32 37, align 4
11 @a = thread_local global %struct.A zeroinitializer, align 1
12 @b = thread_local global %struct.B zeroinitializer, align 4
13 @z = global %struct.A zeroinitializer, align 1
14 @y = global %struct.B zeroinitializer, align 4
15 @__tls_guard = internal thread_local unnamed_addr global i1 false
16 @llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
17 @llvm.tls_init_funcs = appending global [1 x void ()*] [void ()* @__tls_init]
18
19 @_ZTH1i = alias void ()* @__tls_init
20 @_ZTH1a = alias void ()* @__tls_init
21 @_ZTH1b = alias void ()* @__tls_init
22
23 declare void @_ZN1AC1Ev(%struct.A*)
24
25 declare void @_ZN1BC1Ei(%struct.B*, i32)
26
27 define internal void @_GLOBAL__I_a() section "__TEXT,__StaticInit,regular,pure_instructions" {
28 entry:
29   tail call void @_ZN1AC1Ev(%struct.A* @z)
30   tail call void @_ZN1BC1Ei(%struct.B* @y, i32 42)
31   ret void
32 }
33
34 define internal void @__tls_init() {
35 entry:
36   %.b = load i1* @__tls_guard, align 1
37   store i1 true, i1* @__tls_guard, align 1
38   br i1 %.b, label %exit, label %init
39
40 init:                                             ; preds = %entry
41   tail call void @_ZN1AC1Ev(%struct.A* @a)
42   tail call void @_ZN1BC1Ei(%struct.B* @b, i32 927)
43   br label %exit
44
45 exit:                                             ; preds = %entry, %init
46   ret void
47 }
48
49 define weak_odr hidden i32* @_ZTW1i() {
50   %.b.i = load i1* @__tls_guard, align 1
51   store i1 true, i1* @__tls_guard, align 1
52   br i1 %.b.i, label %__tls_init.exit, label %init.i
53
54 init.i:                                           ; preds = %0
55   tail call void @_ZN1AC1Ev(%struct.A* @a)
56   tail call void @_ZN1BC1Ei(%struct.B* @b, i32 927)
57   br label %__tls_init.exit
58
59 __tls_init.exit:                                  ; preds = %0, %init.i
60   ret i32* @i
61 }
62
63 define weak_odr hidden %struct.A* @_ZTW1a() {
64   %.b.i = load i1* @__tls_guard, align 1
65   store i1 true, i1* @__tls_guard, align 1
66   br i1 %.b.i, label %__tls_init.exit, label %init.i
67
68 init.i:                                           ; preds = %0
69   tail call void @_ZN1AC1Ev(%struct.A* @a)
70   tail call void @_ZN1BC1Ei(%struct.B* @b, i32 927)
71   br label %__tls_init.exit
72
73 __tls_init.exit:                                  ; preds = %0, %init.i
74   ret %struct.A* @a
75 }
76
77 define weak_odr hidden %struct.B* @_ZTW1b() {
78   %.b.i = load i1* @__tls_guard, align 1
79   store i1 true, i1* @__tls_guard, align 1
80   br i1 %.b.i, label %__tls_init.exit, label %init.i
81
82 init.i:                                           ; preds = %0
83   tail call void @_ZN1AC1Ev(%struct.A* @a)
84   tail call void @_ZN1BC1Ei(%struct.B* @b, i32 927)
85   br label %__tls_init.exit
86
87 __tls_init.exit:                                  ; preds = %0, %init.i
88   ret %struct.B* @b
89 }