Skip to content

Commit 1e058c9

Browse files
committed
Add test for TLS handling change
1 parent 5748ad8 commit 1e058c9

File tree

1 file changed

+175
-0
lines changed

1 file changed

+175
-0
lines changed
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -o - %s | FileCheck %s
3+
; RUN: llc -o - -relocation-model=pic %s | FileCheck --check-prefix=CHECK_PIC %s
4+
target triple = "x86_64--linux-gnu"
5+
6+
@foo = dso_local thread_local global i32 0, align 4
7+
8+
declare i32 @rand()
9+
declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)
10+
11+
define i32 @tls_multi_use(i32 %arg) {
12+
; CHECK-LABEL: tls_multi_use:
13+
; CHECK: # %bb.0: # %entry
14+
; CHECK-NEXT: pushq %r14
15+
; CHECK-NEXT: .cfi_def_cfa_offset 16
16+
; CHECK-NEXT: pushq %rbx
17+
; CHECK-NEXT: .cfi_def_cfa_offset 24
18+
; CHECK-NEXT: pushq %rax
19+
; CHECK-NEXT: .cfi_def_cfa_offset 32
20+
; CHECK-NEXT: .cfi_offset %rbx, -24
21+
; CHECK-NEXT: .cfi_offset %r14, -16
22+
; CHECK-NEXT: movl %fs:foo@TPOFF, %ebx
23+
; CHECK-NEXT: testl %edi, %edi
24+
; CHECK-NEXT: movl %ebx, %eax
25+
; CHECK-NEXT: jne .LBB0_2
26+
; CHECK-NEXT: # %bb.1: # %if.then
27+
; CHECK-NEXT: movq %fs:0, %rax
28+
; CHECK-NEXT: leaq foo@TPOFF(%rax), %r14
29+
; CHECK-NEXT: callq rand@PLT
30+
; CHECK-NEXT: movl (%r14), %eax
31+
; CHECK-NEXT: .LBB0_2: # %if.end
32+
; CHECK-NEXT: addl %eax, %ebx
33+
; CHECK-NEXT: movl %ebx, %eax
34+
; CHECK-NEXT: addq $8, %rsp
35+
; CHECK-NEXT: .cfi_def_cfa_offset 24
36+
; CHECK-NEXT: popq %rbx
37+
; CHECK-NEXT: .cfi_def_cfa_offset 16
38+
; CHECK-NEXT: popq %r14
39+
; CHECK-NEXT: .cfi_def_cfa_offset 8
40+
; CHECK-NEXT: retq
41+
;
42+
; CHECK_PIC-LABEL: tls_multi_use:
43+
; CHECK_PIC: # %bb.0: # %entry
44+
; CHECK_PIC-NEXT: pushq %rbp
45+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 16
46+
; CHECK_PIC-NEXT: pushq %r14
47+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 24
48+
; CHECK_PIC-NEXT: pushq %rbx
49+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 32
50+
; CHECK_PIC-NEXT: .cfi_offset %rbx, -32
51+
; CHECK_PIC-NEXT: .cfi_offset %r14, -24
52+
; CHECK_PIC-NEXT: .cfi_offset %rbp, -16
53+
; CHECK_PIC-NEXT: movl %edi, %ebp
54+
; CHECK_PIC-NEXT: leaq .Lfoo$local@TLSLD(%rip), %rdi
55+
; CHECK_PIC-NEXT: callq __tls_get_addr@PLT
56+
; CHECK_PIC-NEXT: movl .Lfoo$local@DTPOFF(%rax), %ebx
57+
; CHECK_PIC-NEXT: testl %ebp, %ebp
58+
; CHECK_PIC-NEXT: movl %ebx, %ecx
59+
; CHECK_PIC-NEXT: jne .LBB0_2
60+
; CHECK_PIC-NEXT: # %bb.1: # %if.then
61+
; CHECK_PIC-NEXT: leaq .Lfoo$local@DTPOFF(%rax), %r14
62+
; CHECK_PIC-NEXT: callq rand@PLT
63+
; CHECK_PIC-NEXT: movl (%r14), %ecx
64+
; CHECK_PIC-NEXT: .LBB0_2: # %if.end
65+
; CHECK_PIC-NEXT: addl %ecx, %ebx
66+
; CHECK_PIC-NEXT: movl %ebx, %eax
67+
; CHECK_PIC-NEXT: popq %rbx
68+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 24
69+
; CHECK_PIC-NEXT: popq %r14
70+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 16
71+
; CHECK_PIC-NEXT: popq %rbp
72+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 8
73+
; CHECK_PIC-NEXT: retq
74+
entry:
75+
%addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @foo)
76+
%load0 = load i32, ptr %addr, align 4
77+
%cond = icmp eq i32 %arg, 0
78+
br i1 %cond, label %if.then, label %if.end
79+
80+
if.then:
81+
tail call i32 @rand()
82+
%load1 = load i32, ptr %addr, align 4
83+
br label %if.end
84+
85+
if.end:
86+
%phi = phi i32 [ %load1, %if.then ], [ %load0, %entry ]
87+
%add = add nsw i32 %load0, %phi
88+
ret i32 %add
89+
}
90+
91+
@foo_nonlocal = thread_local global i32 0, align 4
92+
93+
define i32 @tls_multi_use_nonlocal(i32 %arg) {
94+
; CHECK-LABEL: tls_multi_use_nonlocal:
95+
; CHECK: # %bb.0: # %entry
96+
; CHECK-NEXT: pushq %r14
97+
; CHECK-NEXT: .cfi_def_cfa_offset 16
98+
; CHECK-NEXT: pushq %rbx
99+
; CHECK-NEXT: .cfi_def_cfa_offset 24
100+
; CHECK-NEXT: pushq %rax
101+
; CHECK-NEXT: .cfi_def_cfa_offset 32
102+
; CHECK-NEXT: .cfi_offset %rbx, -24
103+
; CHECK-NEXT: .cfi_offset %r14, -16
104+
; CHECK-NEXT: movq foo_nonlocal@GOTTPOFF(%rip), %r14
105+
; CHECK-NEXT: movl %fs:(%r14), %ebx
106+
; CHECK-NEXT: testl %edi, %edi
107+
; CHECK-NEXT: movl %ebx, %eax
108+
; CHECK-NEXT: jne .LBB1_2
109+
; CHECK-NEXT: # %bb.1: # %if.then
110+
; CHECK-NEXT: addq %fs:0, %r14
111+
; CHECK-NEXT: callq rand@PLT
112+
; CHECK-NEXT: movl (%r14), %eax
113+
; CHECK-NEXT: .LBB1_2: # %if.end
114+
; CHECK-NEXT: addl %eax, %ebx
115+
; CHECK-NEXT: movl %ebx, %eax
116+
; CHECK-NEXT: addq $8, %rsp
117+
; CHECK-NEXT: .cfi_def_cfa_offset 24
118+
; CHECK-NEXT: popq %rbx
119+
; CHECK-NEXT: .cfi_def_cfa_offset 16
120+
; CHECK-NEXT: popq %r14
121+
; CHECK-NEXT: .cfi_def_cfa_offset 8
122+
; CHECK-NEXT: retq
123+
;
124+
; CHECK_PIC-LABEL: tls_multi_use_nonlocal:
125+
; CHECK_PIC: # %bb.0: # %entry
126+
; CHECK_PIC-NEXT: pushq %rbp
127+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 16
128+
; CHECK_PIC-NEXT: pushq %r14
129+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 24
130+
; CHECK_PIC-NEXT: pushq %rbx
131+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 32
132+
; CHECK_PIC-NEXT: .cfi_offset %rbx, -32
133+
; CHECK_PIC-NEXT: .cfi_offset %r14, -24
134+
; CHECK_PIC-NEXT: .cfi_offset %rbp, -16
135+
; CHECK_PIC-NEXT: movl %edi, %ebp
136+
; CHECK_PIC-NEXT: data16
137+
; CHECK_PIC-NEXT: leaq foo_nonlocal@TLSGD(%rip), %rdi
138+
; CHECK_PIC-NEXT: data16
139+
; CHECK_PIC-NEXT: data16
140+
; CHECK_PIC-NEXT: rex64
141+
; CHECK_PIC-NEXT: callq __tls_get_addr@PLT
142+
; CHECK_PIC-NEXT: movq %rax, %r14
143+
; CHECK_PIC-NEXT: movl (%rax), %ebx
144+
; CHECK_PIC-NEXT: testl %ebp, %ebp
145+
; CHECK_PIC-NEXT: movl %ebx, %eax
146+
; CHECK_PIC-NEXT: jne .LBB1_2
147+
; CHECK_PIC-NEXT: # %bb.1: # %if.then
148+
; CHECK_PIC-NEXT: callq rand@PLT
149+
; CHECK_PIC-NEXT: movl (%r14), %eax
150+
; CHECK_PIC-NEXT: .LBB1_2: # %if.end
151+
; CHECK_PIC-NEXT: addl %eax, %ebx
152+
; CHECK_PIC-NEXT: movl %ebx, %eax
153+
; CHECK_PIC-NEXT: popq %rbx
154+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 24
155+
; CHECK_PIC-NEXT: popq %r14
156+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 16
157+
; CHECK_PIC-NEXT: popq %rbp
158+
; CHECK_PIC-NEXT: .cfi_def_cfa_offset 8
159+
; CHECK_PIC-NEXT: retq
160+
entry:
161+
%addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @foo_nonlocal)
162+
%load0 = load i32, ptr %addr, align 4
163+
%cond = icmp eq i32 %arg, 0
164+
br i1 %cond, label %if.then, label %if.end
165+
166+
if.then:
167+
tail call i32 @rand()
168+
%load1 = load i32, ptr %addr, align 4
169+
br label %if.end
170+
171+
if.end:
172+
%phi = phi i32 [ %load1, %if.then ], [ %load0, %entry ]
173+
%add = add nsw i32 %load0, %phi
174+
ret i32 %add
175+
}

0 commit comments

Comments
 (0)