xref: /llvm-project/clang/test/CodeGenCXX/attr-target-version-riscv.cpp (revision c77e836123d056d98051ee980003593706f9284d)
1*f658c1bfSPiyou Chen // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --include-generated-funcs --version 4
2*f658c1bfSPiyou Chen // RUN: %clang_cc1 -std=c++11 -triple riscv64-linux-gnu -target-feature +i -target-feature +m -emit-llvm %s -o - | FileCheck %s
3*f658c1bfSPiyou Chen 
4*f658c1bfSPiyou Chen __attribute__((target_version("arch=+v"))) int foo1(void) { return 1; }
5*f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo1(void) { return 1; }
6*f658c1bfSPiyou Chen 
7*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb"))) int foo2(void) { return 1; }
8*f658c1bfSPiyou Chen __attribute__((target_version("arch=+m"))) int foo2(void) { return 1; }
9*f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo2(void) { return 1; }
10*f658c1bfSPiyou Chen 
11*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+c"))) int foo3(void) { return 1; }
12*f658c1bfSPiyou Chen __attribute__((target_version("arch=+m"))) int foo3(void) { return 1; }
13*f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo3(void) { return 1; }
14*f658c1bfSPiyou Chen 
15*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zba"))) int foo4(void) { return 1; }
16*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb"))) int foo4(void) { return 1; }
17*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+zba"))) int foo4(void) { return 1; }
18*f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo4(void) { return 1; }
19*f658c1bfSPiyou Chen 
20*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zba"))) int foo5(void) { return 1; }
21*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+zba"))) int foo5(void) { return 1; }
22*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb"))) int foo5(void) { return 1; }
23*f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo5(void) { return 1; }
24*f658c1bfSPiyou Chen 
25*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zba"))) int foo6(void) { return 1; }
26*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb"))) int foo6(void) { return 1; }
27*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+zba;priority=10"))) int foo6(void) { return 1; }
28*f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo6(void) { return 1; }
29*f658c1bfSPiyou Chen 
30*f658c1bfSPiyou Chen __attribute__((target_version("priority=8;arch=+zba"))) int foo7(void) { return 1; }
31*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb;priority=9"))) int foo7(void) { return 1; }
32*f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+zba;priority=10"))) int foo7(void) { return 1; }
33*f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo7(void) { return 1; }
34*f658c1bfSPiyou Chen 
35*f658c1bfSPiyou Chen int bar() { return foo1() + foo2() + foo3(); }
36*f658c1bfSPiyou Chen //.
37*f658c1bfSPiyou Chen // CHECK: @__riscv_feature_bits = external dso_local global { i32, [2 x i64] }
38*f658c1bfSPiyou Chen // CHECK: @_Z4foo1v = weak_odr ifunc i32 (), ptr @_Z4foo1v.resolver
39*f658c1bfSPiyou Chen // CHECK: @_Z4foo2v = weak_odr ifunc i32 (), ptr @_Z4foo2v.resolver
40*f658c1bfSPiyou Chen // CHECK: @_Z4foo3v = weak_odr ifunc i32 (), ptr @_Z4foo3v.resolver
41*f658c1bfSPiyou Chen // CHECK: @_Z4foo4v = weak_odr ifunc i32 (), ptr @_Z4foo4v.resolver
42*f658c1bfSPiyou Chen // CHECK: @_Z4foo5v = weak_odr ifunc i32 (), ptr @_Z4foo5v.resolver
43*f658c1bfSPiyou Chen // CHECK: @_Z4foo6v = weak_odr ifunc i32 (), ptr @_Z4foo6v.resolver
44*f658c1bfSPiyou Chen // CHECK: @_Z4foo7v = weak_odr ifunc i32 (), ptr @_Z4foo7v.resolver
45*f658c1bfSPiyou Chen //.
46*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo1v._v(
47*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
48*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
49*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
50*f658c1bfSPiyou Chen //
51*f658c1bfSPiyou Chen //
52*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo1v.default(
53*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
54*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
55*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
56*f658c1bfSPiyou Chen //
57*f658c1bfSPiyou Chen //
58*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo2v._zbb(
59*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2:[0-9]+]] {
60*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
61*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
62*f658c1bfSPiyou Chen //
63*f658c1bfSPiyou Chen //
64*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo2v._m(
65*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
66*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
67*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
68*f658c1bfSPiyou Chen //
69*f658c1bfSPiyou Chen //
70*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo2v.default(
71*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
72*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
73*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
74*f658c1bfSPiyou Chen //
75*f658c1bfSPiyou Chen //
76*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo3v._c_zbb(
77*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR3:[0-9]+]] {
78*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
79*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
80*f658c1bfSPiyou Chen //
81*f658c1bfSPiyou Chen //
82*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo3v._m(
83*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
84*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
85*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
86*f658c1bfSPiyou Chen //
87*f658c1bfSPiyou Chen //
88*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo3v.default(
89*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
90*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
91*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
92*f658c1bfSPiyou Chen //
93*f658c1bfSPiyou Chen //
94*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo4v._zba(
95*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR4:[0-9]+]] {
96*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
97*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
98*f658c1bfSPiyou Chen //
99*f658c1bfSPiyou Chen //
100*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo4v._zbb(
101*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2]] {
102*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
103*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
104*f658c1bfSPiyou Chen //
105*f658c1bfSPiyou Chen //
106*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo4v._zba_zbb(
107*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR5:[0-9]+]] {
108*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
109*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
110*f658c1bfSPiyou Chen //
111*f658c1bfSPiyou Chen //
112*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo4v.default(
113*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
114*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
115*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
116*f658c1bfSPiyou Chen //
117*f658c1bfSPiyou Chen //
118*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo5v._zba(
119*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR4]] {
120*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
121*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
122*f658c1bfSPiyou Chen //
123*f658c1bfSPiyou Chen //
124*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo5v._zba_zbb(
125*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR5]] {
126*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
127*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
128*f658c1bfSPiyou Chen //
129*f658c1bfSPiyou Chen //
130*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo5v._zbb(
131*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2]] {
132*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
133*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
134*f658c1bfSPiyou Chen //
135*f658c1bfSPiyou Chen //
136*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo5v.default(
137*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
138*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
139*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
140*f658c1bfSPiyou Chen //
141*f658c1bfSPiyou Chen //
142*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo6v._zba(
143*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR4]] {
144*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
145*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
146*f658c1bfSPiyou Chen //
147*f658c1bfSPiyou Chen //
148*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo6v._zbb(
149*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2]] {
150*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
151*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
152*f658c1bfSPiyou Chen //
153*f658c1bfSPiyou Chen //
154*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo6v._zba_zbb(
155*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR5]] {
156*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
157*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
158*f658c1bfSPiyou Chen //
159*f658c1bfSPiyou Chen //
160*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo6v.default(
161*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
162*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
163*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
164*f658c1bfSPiyou Chen //
165*f658c1bfSPiyou Chen //
166*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo7v._zba(
167*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR4]] {
168*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
169*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
170*f658c1bfSPiyou Chen //
171*f658c1bfSPiyou Chen //
172*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo7v._zbb(
173*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2]] {
174*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
175*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
176*f658c1bfSPiyou Chen //
177*f658c1bfSPiyou Chen //
178*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo7v._zba_zbb(
179*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR5]] {
180*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
181*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
182*f658c1bfSPiyou Chen //
183*f658c1bfSPiyou Chen //
184*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo7v.default(
185*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
186*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
187*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 1
188*f658c1bfSPiyou Chen //
189*f658c1bfSPiyou Chen //
190*f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local noundef signext i32 @_Z3barv(
191*f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] {
192*f658c1bfSPiyou Chen // CHECK-NEXT:  entry:
193*f658c1bfSPiyou Chen // CHECK-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_Z4foo1v()
194*f658c1bfSPiyou Chen // CHECK-NEXT:    [[CALL1:%.*]] = call noundef signext i32 @_Z4foo2v()
195*f658c1bfSPiyou Chen // CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
196*f658c1bfSPiyou Chen // CHECK-NEXT:    [[CALL2:%.*]] = call noundef signext i32 @_Z4foo3v()
197*f658c1bfSPiyou Chen // CHECK-NEXT:    [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
198*f658c1bfSPiyou Chen // CHECK-NEXT:    ret i32 [[ADD3]]
199*f658c1bfSPiyou Chen //
200*f658c1bfSPiyou Chen //
201*f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @_Z4foo1v.resolver() comdat {
202*f658c1bfSPiyou Chen // CHECK-NEXT:  resolver_entry:
203*f658c1bfSPiyou Chen // CHECK-NEXT:    call void @__init_riscv_feature_bits(ptr null)
204*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
205*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 2097152
206*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 2097152
207*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
208*f658c1bfSPiyou Chen // CHECK:       resolver_return:
209*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo1v._v
210*f658c1bfSPiyou Chen // CHECK:       resolver_else:
211*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo1v.default
212*f658c1bfSPiyou Chen //
213*f658c1bfSPiyou Chen //
214*f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @_Z4foo2v.resolver() comdat {
215*f658c1bfSPiyou Chen // CHECK-NEXT:  resolver_entry:
216*f658c1bfSPiyou Chen // CHECK-NEXT:    call void @__init_riscv_feature_bits(ptr null)
217*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
218*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 268435456
219*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435456
220*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
221*f658c1bfSPiyou Chen // CHECK:       resolver_return:
222*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo2v._zbb
223*f658c1bfSPiyou Chen // CHECK:       resolver_else:
224*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
225*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP4:%.*]] = and i64 [[TMP3]], 4096
226*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
227*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
228*f658c1bfSPiyou Chen // CHECK:       resolver_return1:
229*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo2v._m
230*f658c1bfSPiyou Chen // CHECK:       resolver_else2:
231*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo2v.default
232*f658c1bfSPiyou Chen //
233*f658c1bfSPiyou Chen //
234*f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @_Z4foo3v.resolver() comdat {
235*f658c1bfSPiyou Chen // CHECK-NEXT:  resolver_entry:
236*f658c1bfSPiyou Chen // CHECK-NEXT:    call void @__init_riscv_feature_bits(ptr null)
237*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
238*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 268435460
239*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435460
240*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
241*f658c1bfSPiyou Chen // CHECK:       resolver_return:
242*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo3v._c_zbb
243*f658c1bfSPiyou Chen // CHECK:       resolver_else:
244*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
245*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP4:%.*]] = and i64 [[TMP3]], 4096
246*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
247*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
248*f658c1bfSPiyou Chen // CHECK:       resolver_return1:
249*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo3v._m
250*f658c1bfSPiyou Chen // CHECK:       resolver_else2:
251*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo3v.default
252*f658c1bfSPiyou Chen //
253*f658c1bfSPiyou Chen //
254*f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @_Z4foo4v.resolver() comdat {
255*f658c1bfSPiyou Chen // CHECK-NEXT:  resolver_entry:
256*f658c1bfSPiyou Chen // CHECK-NEXT:    call void @__init_riscv_feature_bits(ptr null)
257*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
258*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
259*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
260*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
261*f658c1bfSPiyou Chen // CHECK:       resolver_return:
262*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo4v._zba
263*f658c1bfSPiyou Chen // CHECK:       resolver_else:
264*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
265*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
266*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
267*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
268*f658c1bfSPiyou Chen // CHECK:       resolver_return1:
269*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo4v._zbb
270*f658c1bfSPiyou Chen // CHECK:       resolver_else2:
271*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
272*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP6]], 402653184
273*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 402653184
274*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
275*f658c1bfSPiyou Chen // CHECK:       resolver_return3:
276*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo4v._zba_zbb
277*f658c1bfSPiyou Chen // CHECK:       resolver_else4:
278*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo4v.default
279*f658c1bfSPiyou Chen //
280*f658c1bfSPiyou Chen //
281*f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @_Z4foo5v.resolver() comdat {
282*f658c1bfSPiyou Chen // CHECK-NEXT:  resolver_entry:
283*f658c1bfSPiyou Chen // CHECK-NEXT:    call void @__init_riscv_feature_bits(ptr null)
284*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
285*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
286*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
287*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
288*f658c1bfSPiyou Chen // CHECK:       resolver_return:
289*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo5v._zba
290*f658c1bfSPiyou Chen // CHECK:       resolver_else:
291*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
292*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP4:%.*]] = and i64 [[TMP3]], 402653184
293*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 402653184
294*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
295*f658c1bfSPiyou Chen // CHECK:       resolver_return1:
296*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo5v._zba_zbb
297*f658c1bfSPiyou Chen // CHECK:       resolver_else2:
298*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
299*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
300*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
301*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
302*f658c1bfSPiyou Chen // CHECK:       resolver_return3:
303*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo5v._zbb
304*f658c1bfSPiyou Chen // CHECK:       resolver_else4:
305*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo5v.default
306*f658c1bfSPiyou Chen //
307*f658c1bfSPiyou Chen //
308*f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @_Z4foo6v.resolver() comdat {
309*f658c1bfSPiyou Chen // CHECK-NEXT:  resolver_entry:
310*f658c1bfSPiyou Chen // CHECK-NEXT:    call void @__init_riscv_feature_bits(ptr null)
311*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
312*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
313*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
314*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
315*f658c1bfSPiyou Chen // CHECK:       resolver_return:
316*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo6v._zba_zbb
317*f658c1bfSPiyou Chen // CHECK:       resolver_else:
318*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
319*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP4:%.*]] = and i64 [[TMP3]], 134217728
320*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 134217728
321*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
322*f658c1bfSPiyou Chen // CHECK:       resolver_return1:
323*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo6v._zba
324*f658c1bfSPiyou Chen // CHECK:       resolver_else2:
325*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
326*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
327*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
328*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
329*f658c1bfSPiyou Chen // CHECK:       resolver_return3:
330*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo6v._zbb
331*f658c1bfSPiyou Chen // CHECK:       resolver_else4:
332*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo6v.default
333*f658c1bfSPiyou Chen //
334*f658c1bfSPiyou Chen //
335*f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @_Z4foo7v.resolver() comdat {
336*f658c1bfSPiyou Chen // CHECK-NEXT:  resolver_entry:
337*f658c1bfSPiyou Chen // CHECK-NEXT:    call void @__init_riscv_feature_bits(ptr null)
338*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
339*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
340*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
341*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
342*f658c1bfSPiyou Chen // CHECK:       resolver_return:
343*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo7v._zba_zbb
344*f658c1bfSPiyou Chen // CHECK:       resolver_else:
345*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
346*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
347*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
348*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
349*f658c1bfSPiyou Chen // CHECK:       resolver_return1:
350*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo7v._zbb
351*f658c1bfSPiyou Chen // CHECK:       resolver_else2:
352*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
353*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP6]], 134217728
354*f658c1bfSPiyou Chen // CHECK-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 134217728
355*f658c1bfSPiyou Chen // CHECK-NEXT:    br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
356*f658c1bfSPiyou Chen // CHECK:       resolver_return3:
357*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo7v._zba
358*f658c1bfSPiyou Chen // CHECK:       resolver_else4:
359*f658c1bfSPiyou Chen // CHECK-NEXT:    ret ptr @_Z4foo7v.default
360*f658c1bfSPiyou Chen //
361*f658c1bfSPiyou Chen //.
362*f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR0]] = { mustprogress noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+d,+f,+i,+m,+v,+zicsr,+zmmul,+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b" }
363*f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR1]] = { mustprogress noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+m,+zmmul" }
364*f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR2]] = { mustprogress noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+m,+zbb,+zmmul" }
365*f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR3]] = { mustprogress noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+c,+i,+m,+zbb,+zmmul" }
366*f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR4]] = { mustprogress noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+m,+zba,+zmmul" }
367*f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR5]] = { mustprogress noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+m,+zba,+zbb,+zmmul" }
368*f658c1bfSPiyou Chen //.
369*f658c1bfSPiyou Chen // CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
370*f658c1bfSPiyou Chen // CHECK: [[META1:![0-9]+]] = !{i32 1, !"target-abi", !"lp64"}
371*f658c1bfSPiyou Chen // CHECK: [[META2:![0-9]+]] = !{i32 6, !"riscv-isa", [[META3:![0-9]+]]}
372*f658c1bfSPiyou Chen // CHECK: [[META3]] = !{!"rv64i2p1_m2p0_zmmul1p0"}
373*f658c1bfSPiyou Chen // CHECK: [[META4:![0-9]+]] = !{i32 8, !"SmallDataLimit", i32 0}
374*f658c1bfSPiyou Chen // CHECK: [[META5:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
375*f658c1bfSPiyou Chen //.
376