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