xref: /llvm-project/llvm/test/CodeGen/RISCV/tls-models.ll (revision 03a61d34ebf4f8eeaa6861bec3ab39c75bb41778)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -relocation-model=pic < %s \
3; RUN:     | FileCheck -check-prefix=RV32-PIC %s
4; RUN: llc -mtriple=riscv32 -relocation-model=pic < %s -enable-tlsdesc \
5; RUN:     | FileCheck -check-prefix=RV32-PIC-TLSDESC %s
6; RUN: llc -mtriple=riscv64 -relocation-model=pic < %s \
7; RUN:     | FileCheck -check-prefix=RV64-PIC %s
8; RUN: llc -mtriple=riscv64 -relocation-model=pic -enable-tlsdesc < %s \
9; RUN:     | FileCheck -check-prefix=RV64-PIC-TLSDESC %s
10; RUN: llc -mtriple=riscv32 < %s | FileCheck -check-prefix=RV32-NOPIC %s
11; RUN: llc -mtriple=riscv32 < %s -enable-tlsdesc | FileCheck -check-prefix=RV32-NOPIC-TLSDESC %s
12; RUN: llc -mtriple=riscv64 < %s | FileCheck -check-prefix=RV64-NOPIC %s
13; RUN: llc -mtriple=riscv64 < %s -enable-tlsdesc | FileCheck -check-prefix=RV64-NOPIC-TLSDESC %s
14
15; Check that TLS symbols are lowered correctly based on the specified
16; model. Make sure they're external to avoid them all being optimised to Local
17; Exec for the executable.
18
19@unspecified = external thread_local global i32
20@ld = external thread_local(localdynamic) global i32
21@ie = external thread_local(initialexec) global i32
22@le = external thread_local(localexec) global i32
23
24
25; No model specified
26
27define ptr @f1() nounwind {
28; RV32-PIC-LABEL: f1:
29; RV32-PIC:       # %bb.0: # %entry
30; RV32-PIC-NEXT:    addi sp, sp, -16
31; RV32-PIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
32; RV32-PIC-NEXT:  .Lpcrel_hi0:
33; RV32-PIC-NEXT:    auipc a0, %tls_gd_pcrel_hi(unspecified)
34; RV32-PIC-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi0)
35; RV32-PIC-NEXT:    call __tls_get_addr
36; RV32-PIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
37; RV32-PIC-NEXT:    addi sp, sp, 16
38; RV32-PIC-NEXT:    ret
39;
40; RV64-PIC-LABEL: f1:
41; RV64-PIC:       # %bb.0: # %entry
42; RV64-PIC-NEXT:    addi sp, sp, -16
43; RV64-PIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
44; RV64-PIC-NEXT:  .Lpcrel_hi0:
45; RV64-PIC-NEXT:    auipc a0, %tls_gd_pcrel_hi(unspecified)
46; RV64-PIC-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi0)
47; RV64-PIC-NEXT:    call __tls_get_addr
48; RV64-PIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
49; RV64-PIC-NEXT:    addi sp, sp, 16
50; RV64-PIC-NEXT:    ret
51;
52; RV32-NOPIC-LABEL: f1:
53; RV32-NOPIC:       # %bb.0: # %entry
54; RV32-NOPIC-NEXT:  .Lpcrel_hi0:
55; RV32-NOPIC-NEXT:    auipc a0, %tls_ie_pcrel_hi(unspecified)
56; RV32-NOPIC-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi0)(a0)
57; RV32-NOPIC-NEXT:    add a0, a0, tp
58; RV32-NOPIC-NEXT:    ret
59;
60; RV64-NOPIC-LABEL: f1:
61; RV64-NOPIC:       # %bb.0: # %entry
62; RV64-NOPIC-NEXT:  .Lpcrel_hi0:
63; RV64-NOPIC-NEXT:    auipc a0, %tls_ie_pcrel_hi(unspecified)
64; RV64-NOPIC-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)
65; RV64-NOPIC-NEXT:    add a0, a0, tp
66; RV64-NOPIC-NEXT:    ret
67;
68; RV32-PIC-TLSDESC-LABEL: f1:
69; RV32-PIC-TLSDESC:       # %bb.0: # %entry
70; RV32-PIC-TLSDESC-NEXT:  .Ltlsdesc_hi0:
71; RV32-PIC-TLSDESC-NEXT:    auipc a0, %tlsdesc_hi(unspecified)
72; RV32-PIC-TLSDESC-NEXT:    lw a1, %tlsdesc_load_lo(.Ltlsdesc_hi0)(a0)
73; RV32-PIC-TLSDESC-NEXT:    addi a0, a0, %tlsdesc_add_lo(.Ltlsdesc_hi0)
74; RV32-PIC-TLSDESC-NEXT:    jalr t0, 0(a1), %tlsdesc_call(.Ltlsdesc_hi0)
75; RV32-PIC-TLSDESC-NEXT:    add a0, a0, tp
76; RV32-PIC-TLSDESC-NEXT:    ret
77;
78; RV64-PIC-TLSDESC-LABEL: f1:
79; RV64-PIC-TLSDESC:       # %bb.0: # %entry
80; RV64-PIC-TLSDESC-NEXT:  .Ltlsdesc_hi0:
81; RV64-PIC-TLSDESC-NEXT:    auipc a0, %tlsdesc_hi(unspecified)
82; RV64-PIC-TLSDESC-NEXT:    ld a1, %tlsdesc_load_lo(.Ltlsdesc_hi0)(a0)
83; RV64-PIC-TLSDESC-NEXT:    addi a0, a0, %tlsdesc_add_lo(.Ltlsdesc_hi0)
84; RV64-PIC-TLSDESC-NEXT:    jalr t0, 0(a1), %tlsdesc_call(.Ltlsdesc_hi0)
85; RV64-PIC-TLSDESC-NEXT:    add a0, a0, tp
86; RV64-PIC-TLSDESC-NEXT:    ret
87;
88; RV32-NOPIC-TLSDESC-LABEL: f1:
89; RV32-NOPIC-TLSDESC:       # %bb.0: # %entry
90; RV32-NOPIC-TLSDESC-NEXT:  .Lpcrel_hi0:
91; RV32-NOPIC-TLSDESC-NEXT:    auipc a0, %tls_ie_pcrel_hi(unspecified)
92; RV32-NOPIC-TLSDESC-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi0)(a0)
93; RV32-NOPIC-TLSDESC-NEXT:    add a0, a0, tp
94; RV32-NOPIC-TLSDESC-NEXT:    ret
95;
96; RV64-NOPIC-TLSDESC-LABEL: f1:
97; RV64-NOPIC-TLSDESC:       # %bb.0: # %entry
98; RV64-NOPIC-TLSDESC-NEXT:  .Lpcrel_hi0:
99; RV64-NOPIC-TLSDESC-NEXT:    auipc a0, %tls_ie_pcrel_hi(unspecified)
100; RV64-NOPIC-TLSDESC-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)
101; RV64-NOPIC-TLSDESC-NEXT:    add a0, a0, tp
102; RV64-NOPIC-TLSDESC-NEXT:    ret
103entry:
104  ret ptr @unspecified
105}
106
107
108; localdynamic specified
109
110define ptr @f2() nounwind {
111; RV32-PIC-LABEL: f2:
112; RV32-PIC:       # %bb.0: # %entry
113; RV32-PIC-NEXT:    addi sp, sp, -16
114; RV32-PIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
115; RV32-PIC-NEXT:  .Lpcrel_hi1:
116; RV32-PIC-NEXT:    auipc a0, %tls_gd_pcrel_hi(ld)
117; RV32-PIC-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi1)
118; RV32-PIC-NEXT:    call __tls_get_addr
119; RV32-PIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
120; RV32-PIC-NEXT:    addi sp, sp, 16
121; RV32-PIC-NEXT:    ret
122;
123; RV64-PIC-LABEL: f2:
124; RV64-PIC:       # %bb.0: # %entry
125; RV64-PIC-NEXT:    addi sp, sp, -16
126; RV64-PIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
127; RV64-PIC-NEXT:  .Lpcrel_hi1:
128; RV64-PIC-NEXT:    auipc a0, %tls_gd_pcrel_hi(ld)
129; RV64-PIC-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi1)
130; RV64-PIC-NEXT:    call __tls_get_addr
131; RV64-PIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
132; RV64-PIC-NEXT:    addi sp, sp, 16
133; RV64-PIC-NEXT:    ret
134;
135; RV32-NOPIC-LABEL: f2:
136; RV32-NOPIC:       # %bb.0: # %entry
137; RV32-NOPIC-NEXT:  .Lpcrel_hi1:
138; RV32-NOPIC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ld)
139; RV32-NOPIC-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi1)(a0)
140; RV32-NOPIC-NEXT:    add a0, a0, tp
141; RV32-NOPIC-NEXT:    ret
142;
143; RV64-NOPIC-LABEL: f2:
144; RV64-NOPIC:       # %bb.0: # %entry
145; RV64-NOPIC-NEXT:  .Lpcrel_hi1:
146; RV64-NOPIC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ld)
147; RV64-NOPIC-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi1)(a0)
148; RV64-NOPIC-NEXT:    add a0, a0, tp
149; RV64-NOPIC-NEXT:    ret
150entry:
151  ret ptr @ld
152}
153
154
155; initialexec specified
156
157define ptr @f3() nounwind {
158; RV32-PIC-LABEL: f3:
159; RV32-PIC:       # %bb.0: # %entry
160; RV32-PIC-NEXT:  .Lpcrel_hi2:
161; RV32-PIC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ie)
162; RV32-PIC-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi2)(a0)
163; RV32-PIC-NEXT:    add a0, a0, tp
164; RV32-PIC-NEXT:    ret
165;
166; RV64-PIC-LABEL: f3:
167; RV64-PIC:       # %bb.0: # %entry
168; RV64-PIC-NEXT:  .Lpcrel_hi2:
169; RV64-PIC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ie)
170; RV64-PIC-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)
171; RV64-PIC-NEXT:    add a0, a0, tp
172; RV64-PIC-NEXT:    ret
173;
174; RV32-NOPIC-LABEL: f3:
175; RV32-NOPIC:       # %bb.0: # %entry
176; RV32-NOPIC-NEXT:  .Lpcrel_hi2:
177; RV32-NOPIC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ie)
178; RV32-NOPIC-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi2)(a0)
179; RV32-NOPIC-NEXT:    add a0, a0, tp
180; RV32-NOPIC-NEXT:    ret
181;
182; RV64-NOPIC-LABEL: f3:
183; RV64-NOPIC:       # %bb.0: # %entry
184; RV64-NOPIC-NEXT:  .Lpcrel_hi2:
185; RV64-NOPIC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ie)
186; RV64-NOPIC-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)
187; RV64-NOPIC-NEXT:    add a0, a0, tp
188; RV64-NOPIC-NEXT:    ret
189;
190; RV32-PIC-TLSDESC-LABEL: f3:
191; RV32-PIC-TLSDESC:       # %bb.0: # %entry
192; RV32-PIC-TLSDESC-NEXT:  .Lpcrel_hi0:
193; RV32-PIC-TLSDESC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ie)
194; RV32-PIC-TLSDESC-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi0)(a0)
195; RV32-PIC-TLSDESC-NEXT:    add a0, a0, tp
196; RV32-PIC-TLSDESC-NEXT:    ret
197;
198; RV64-PIC-TLSDESC-LABEL: f3:
199; RV64-PIC-TLSDESC:       # %bb.0: # %entry
200; RV64-PIC-TLSDESC-NEXT:  .Lpcrel_hi0:
201; RV64-PIC-TLSDESC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ie)
202; RV64-PIC-TLSDESC-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)
203; RV64-PIC-TLSDESC-NEXT:    add a0, a0, tp
204; RV64-PIC-TLSDESC-NEXT:    ret
205;
206; RV32-NOPIC-TLSDESC-LABEL: f3:
207; RV32-NOPIC-TLSDESC:       # %bb.0: # %entry
208; RV32-NOPIC-TLSDESC-NEXT:  .Lpcrel_hi2:
209; RV32-NOPIC-TLSDESC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ie)
210; RV32-NOPIC-TLSDESC-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi2)(a0)
211; RV32-NOPIC-TLSDESC-NEXT:    add a0, a0, tp
212; RV32-NOPIC-TLSDESC-NEXT:    ret
213;
214; RV64-NOPIC-TLSDESC-LABEL: f3:
215; RV64-NOPIC-TLSDESC:       # %bb.0: # %entry
216; RV64-NOPIC-TLSDESC-NEXT:  .Lpcrel_hi2:
217; RV64-NOPIC-TLSDESC-NEXT:    auipc a0, %tls_ie_pcrel_hi(ie)
218; RV64-NOPIC-TLSDESC-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)
219; RV64-NOPIC-TLSDESC-NEXT:    add a0, a0, tp
220; RV64-NOPIC-TLSDESC-NEXT:    ret
221entry:
222  ret ptr @ie
223}
224
225
226; localexec specified
227
228define ptr @f4() nounwind {
229; RV32-PIC-LABEL: f4:
230; RV32-PIC:       # %bb.0: # %entry
231; RV32-PIC-NEXT:    lui a0, %tprel_hi(le)
232; RV32-PIC-NEXT:    add a0, a0, tp, %tprel_add(le)
233; RV32-PIC-NEXT:    addi a0, a0, %tprel_lo(le)
234; RV32-PIC-NEXT:    ret
235;
236; RV64-PIC-LABEL: f4:
237; RV64-PIC:       # %bb.0: # %entry
238; RV64-PIC-NEXT:    lui a0, %tprel_hi(le)
239; RV64-PIC-NEXT:    add a0, a0, tp, %tprel_add(le)
240; RV64-PIC-NEXT:    addi a0, a0, %tprel_lo(le)
241; RV64-PIC-NEXT:    ret
242;
243; RV32-NOPIC-LABEL: f4:
244; RV32-NOPIC:       # %bb.0: # %entry
245; RV32-NOPIC-NEXT:    lui a0, %tprel_hi(le)
246; RV32-NOPIC-NEXT:    add a0, a0, tp, %tprel_add(le)
247; RV32-NOPIC-NEXT:    addi a0, a0, %tprel_lo(le)
248; RV32-NOPIC-NEXT:    ret
249;
250; RV64-NOPIC-LABEL: f4:
251; RV64-NOPIC:       # %bb.0: # %entry
252; RV64-NOPIC-NEXT:    lui a0, %tprel_hi(le)
253; RV64-NOPIC-NEXT:    add a0, a0, tp, %tprel_add(le)
254; RV64-NOPIC-NEXT:    addi a0, a0, %tprel_lo(le)
255; RV64-NOPIC-NEXT:    ret
256;
257; RV32-PIC-TLSDESC-LABEL: f4:
258; RV32-PIC-TLSDESC:       # %bb.0: # %entry
259; RV32-PIC-TLSDESC-NEXT:    lui a0, %tprel_hi(le)
260; RV32-PIC-TLSDESC-NEXT:    add a0, a0, tp, %tprel_add(le)
261; RV32-PIC-TLSDESC-NEXT:    addi a0, a0, %tprel_lo(le)
262; RV32-PIC-TLSDESC-NEXT:    ret
263;
264; RV64-PIC-TLSDESC-LABEL: f4:
265; RV64-PIC-TLSDESC:       # %bb.0: # %entry
266; RV64-PIC-TLSDESC-NEXT:    lui a0, %tprel_hi(le)
267; RV64-PIC-TLSDESC-NEXT:    add a0, a0, tp, %tprel_add(le)
268; RV64-PIC-TLSDESC-NEXT:    addi a0, a0, %tprel_lo(le)
269; RV64-PIC-TLSDESC-NEXT:    ret
270;
271; RV32-NOPIC-TLSDESC-LABEL: f4:
272; RV32-NOPIC-TLSDESC:       # %bb.0: # %entry
273; RV32-NOPIC-TLSDESC-NEXT:    lui a0, %tprel_hi(le)
274; RV32-NOPIC-TLSDESC-NEXT:    add a0, a0, tp, %tprel_add(le)
275; RV32-NOPIC-TLSDESC-NEXT:    addi a0, a0, %tprel_lo(le)
276; RV32-NOPIC-TLSDESC-NEXT:    ret
277;
278; RV64-NOPIC-TLSDESC-LABEL: f4:
279; RV64-NOPIC-TLSDESC:       # %bb.0: # %entry
280; RV64-NOPIC-TLSDESC-NEXT:    lui a0, %tprel_hi(le)
281; RV64-NOPIC-TLSDESC-NEXT:    add a0, a0, tp, %tprel_add(le)
282; RV64-NOPIC-TLSDESC-NEXT:    addi a0, a0, %tprel_lo(le)
283; RV64-NOPIC-TLSDESC-NEXT:    ret
284entry:
285  ret ptr @le
286}
287