xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/darwin-tls-call-clobber.ll (revision 46584de02c1a38a0ccde85cb5c16331380966c36)
1; RUN: llc -mtriple aarch64-apple-darwin -O0 -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s
2target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
3target triple = "arm64-apple-ios13.0.0"
4
5@t_val = thread_local global i32 0, align 4
6@.str = private unnamed_addr constant [5 x i8] c"str1\00", align 1
7@str1 = global ptr @.str, align 8
8@.str.1 = private unnamed_addr constant [5 x i8] c"str2\00", align 1
9@str2 = global ptr @.str.1, align 8
10@.str.2 = private unnamed_addr constant [5 x i8] c"str3\00", align 1
11@str3 = global ptr @.str.2, align 8
12@.str.3 = private unnamed_addr constant [5 x i8] c"str4\00", align 1
13@str4 = global ptr @.str.3, align 8
14@.str.4 = private unnamed_addr constant [5 x i8] c"str5\00", align 1
15@str5 = global ptr @.str.4, align 8
16@.str.5 = private unnamed_addr constant [5 x i8] c"str6\00", align 1
17@str6 = global ptr @.str.5, align 8
18@.str.6 = private unnamed_addr constant [5 x i8] c"str7\00", align 1
19@str7 = global ptr @.str.6, align 8
20@.str.7 = private unnamed_addr constant [5 x i8] c"str8\00", align 1
21@str8 = global ptr @.str.7, align 8
22@.str.8 = private unnamed_addr constant [5 x i8] c"str9\00", align 1
23@str9 = global ptr @.str.8, align 8
24@.str.9 = private unnamed_addr constant [6 x i8] c"str10\00", align 1
25@str10 = global ptr @.str.9, align 8
26@.str.10 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
27@.str.11 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
28@.str.12 = private unnamed_addr constant [4 x i8] c"xyz\00", align 1
29
30
31; This test checks that we don't re-use the register for the variable descriptor
32; for the second ldr.
33; CHECK:        adrp	x[[PTR1:[0-9]+]], _t_val@TLVPPAGE
34; CHECK:	ldr	x0, [x[[PTR1]], _t_val@TLVPPAGEOFF]
35; CHECK:	ldr	x[[FPTR:[0-9]+]], [x0]
36; CHECK:        blr     x[[FPTR]]
37
38define void @_Z4funcPKc(ptr %id) {
39entry:
40  %id.addr = alloca ptr, align 8
41  store ptr %id, ptr %id.addr, align 8
42  %0 = load ptr, ptr %id.addr, align 8
43  %1 = load ptr, ptr @str1, align 8
44  %cmp = icmp eq ptr %0, %1
45  br i1 %cmp, label %if.then, label %if.else
46
47if.then:                                          ; preds = %entry
48  %2 = load ptr, ptr @str1, align 8
49  %call = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %2)
50  %3 = load ptr, ptr @str2, align 8
51  %call1 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %3)
52  %4 = load ptr, ptr @str3, align 8
53  %call2 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %4)
54  %5 = load ptr, ptr @str4, align 8
55  %call3 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %5)
56  %6 = load ptr, ptr @str5, align 8
57  %call4 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %6)
58  %7 = load ptr, ptr @str6, align 8
59  %call5 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %7)
60  %8 = load ptr, ptr @str7, align 8
61  %call6 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %8)
62  %9 = load ptr, ptr @str8, align 8
63  %call7 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %9)
64  %10 = load ptr, ptr @str9, align 8
65  %call8 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %10)
66  %11 = load ptr, ptr @str10, align 8
67  %call9 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %11)
68  %12 = load i32, ptr @t_val, align 4
69  %call10 = call i32 (ptr, ...) @printf(ptr @.str.11, i32 %12)
70  br label %if.end56
71
72if.else:                                          ; preds = %entry
73  %13 = load ptr, ptr %id.addr, align 8
74  %14 = load ptr, ptr @str2, align 8
75  %cmp11 = icmp eq ptr %13, %14
76  br i1 %cmp11, label %if.then12, label %if.else24
77
78if.then12:                                        ; preds = %if.else
79  %15 = load ptr, ptr @str1, align 8
80  %call13 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %15)
81  %16 = load ptr, ptr @str2, align 8
82  %call14 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %16)
83  %17 = load ptr, ptr @str3, align 8
84  %call15 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %17)
85  %18 = load ptr, ptr @str4, align 8
86  %call16 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %18)
87  %19 = load ptr, ptr @str5, align 8
88  %call17 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %19)
89  %20 = load ptr, ptr @str6, align 8
90  %call18 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %20)
91  %21 = load ptr, ptr @str7, align 8
92  %call19 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %21)
93  %22 = load ptr, ptr @str8, align 8
94  %call20 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %22)
95  %23 = load ptr, ptr @str9, align 8
96  %call21 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %23)
97  %24 = load ptr, ptr @str10, align 8
98  %call22 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr %24)
99  %25 = load i32, ptr @t_val, align 4
100  %call23 = call i32 (ptr, ...) @printf(ptr @.str.11, i32 %25)
101  br label %if.end55
102
103if.else24:                                        ; preds = %if.else
104  %26 = load ptr, ptr %id.addr, align 8
105  %27 = load ptr, ptr @str3, align 8
106  %cmp25 = icmp eq ptr %26, %27
107  br i1 %cmp25, label %if.then26, label %if.else27
108
109if.then26:                                        ; preds = %if.else24
110  br label %if.end54
111
112if.else27:                                        ; preds = %if.else24
113  %28 = load ptr, ptr %id.addr, align 8
114  %29 = load ptr, ptr @str4, align 8
115  %cmp28 = icmp eq ptr %28, %29
116  br i1 %cmp28, label %if.then29, label %if.else30
117
118if.then29:                                        ; preds = %if.else27
119  br label %if.end53
120
121if.else30:                                        ; preds = %if.else27
122  %30 = load ptr, ptr %id.addr, align 8
123  %31 = load ptr, ptr @str5, align 8
124  %cmp31 = icmp eq ptr %30, %31
125  br i1 %cmp31, label %if.then32, label %if.else33
126
127if.then32:                                        ; preds = %if.else30
128  br label %if.end52
129
130if.else33:                                        ; preds = %if.else30
131  %32 = load ptr, ptr %id.addr, align 8
132  %33 = load ptr, ptr @str6, align 8
133  %cmp34 = icmp eq ptr %32, %33
134  br i1 %cmp34, label %if.then35, label %if.else36
135
136if.then35:                                        ; preds = %if.else33
137  br label %if.end51
138
139if.else36:                                        ; preds = %if.else33
140  %34 = load ptr, ptr %id.addr, align 8
141  %35 = load ptr, ptr @str7, align 8
142  %cmp37 = icmp eq ptr %34, %35
143  br i1 %cmp37, label %if.then38, label %if.else39
144
145if.then38:                                        ; preds = %if.else36
146  br label %if.end50
147
148if.else39:                                        ; preds = %if.else36
149  %36 = load ptr, ptr %id.addr, align 8
150  %37 = load ptr, ptr @str8, align 8
151  %cmp40 = icmp eq ptr %36, %37
152  br i1 %cmp40, label %if.then41, label %if.else42
153
154if.then41:                                        ; preds = %if.else39
155  br label %if.end49
156
157if.else42:                                        ; preds = %if.else39
158  %38 = load ptr, ptr %id.addr, align 8
159  %39 = load ptr, ptr @str9, align 8
160  %cmp43 = icmp eq ptr %38, %39
161  br i1 %cmp43, label %if.then44, label %if.else45
162
163if.then44:                                        ; preds = %if.else42
164  br label %if.end48
165
166if.else45:                                        ; preds = %if.else42
167  %40 = load ptr, ptr %id.addr, align 8
168  %41 = load ptr, ptr @str10, align 8
169  %cmp46 = icmp eq ptr %40, %41
170  br i1 %cmp46, label %if.then47, label %if.end
171
172if.then47:                                        ; preds = %if.else45
173  br label %if.end
174
175if.end:                                           ; preds = %if.then47, %if.else45
176  br label %if.end48
177
178if.end48:                                         ; preds = %if.end, %if.then44
179  br label %if.end49
180
181if.end49:                                         ; preds = %if.end48, %if.then41
182  br label %if.end50
183
184if.end50:                                         ; preds = %if.end49, %if.then38
185  br label %if.end51
186
187if.end51:                                         ; preds = %if.end50, %if.then35
188  br label %if.end52
189
190if.end52:                                         ; preds = %if.end51, %if.then32
191  br label %if.end53
192
193if.end53:                                         ; preds = %if.end52, %if.then29
194  br label %if.end54
195
196if.end54:                                         ; preds = %if.end53, %if.then26
197  br label %if.end55
198
199if.end55:                                         ; preds = %if.end54, %if.then12
200  br label %if.end56
201
202if.end56:                                         ; preds = %if.end55, %if.then
203  ret void
204}
205declare i32 @printf(ptr, ...)
206
207