xref: /aosp_15_r20/external/clang/test/CodeGen/builtins.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o %t %s
2*67e74705SXin Li // RUN: not grep __builtin %t
3*67e74705SXin Li // RUN: %clang_cc1 %s -emit-llvm -o - -triple x86_64-darwin-apple | FileCheck %s
4*67e74705SXin Li 
5*67e74705SXin Li int printf(const char *, ...);
6*67e74705SXin Li 
p(char * str,int x)7*67e74705SXin Li void p(char *str, int x) {
8*67e74705SXin Li   printf("%s: %d\n", str, x);
9*67e74705SXin Li }
q(char * str,double x)10*67e74705SXin Li void q(char *str, double x) {
11*67e74705SXin Li   printf("%s: %f\n", str, x);
12*67e74705SXin Li }
r(char * str,void * ptr)13*67e74705SXin Li void r(char *str, void *ptr) {
14*67e74705SXin Li   printf("%s: %p\n", str, ptr);
15*67e74705SXin Li }
16*67e74705SXin Li 
17*67e74705SXin Li int random(void);
18*67e74705SXin Li 
main()19*67e74705SXin Li int main() {
20*67e74705SXin Li   int N = random();
21*67e74705SXin Li #define P(n,args) p(#n #args, __builtin_##n args)
22*67e74705SXin Li #define Q(n,args) q(#n #args, __builtin_##n args)
23*67e74705SXin Li #define R(n,args) r(#n #args, __builtin_##n args)
24*67e74705SXin Li #define V(n,args) p(#n #args, (__builtin_##n args, 0))
25*67e74705SXin Li   P(types_compatible_p, (int, float));
26*67e74705SXin Li   P(choose_expr, (0, 10, 20));
27*67e74705SXin Li   P(constant_p, (sizeof(10)));
28*67e74705SXin Li   P(expect, (N == 12, 0));
29*67e74705SXin Li   V(prefetch, (&N));
30*67e74705SXin Li   V(prefetch, (&N, 1));
31*67e74705SXin Li   V(prefetch, (&N, 1, 0));
32*67e74705SXin Li 
33*67e74705SXin Li   // Numeric Constants
34*67e74705SXin Li 
35*67e74705SXin Li   Q(huge_val, ());
36*67e74705SXin Li   Q(huge_valf, ());
37*67e74705SXin Li   Q(huge_vall, ());
38*67e74705SXin Li   Q(inf, ());
39*67e74705SXin Li   Q(inff, ());
40*67e74705SXin Li   Q(infl, ());
41*67e74705SXin Li 
42*67e74705SXin Li   P(fpclassify, (0, 1, 2, 3, 4, 1.0));
43*67e74705SXin Li   P(fpclassify, (0, 1, 2, 3, 4, 1.0f));
44*67e74705SXin Li   P(fpclassify, (0, 1, 2, 3, 4, 1.0l));
45*67e74705SXin Li 
46*67e74705SXin Li   Q(nan, (""));
47*67e74705SXin Li   Q(nanf, (""));
48*67e74705SXin Li   Q(nanl, (""));
49*67e74705SXin Li   Q(nans, (""));
50*67e74705SXin Li   Q(nan, ("10"));
51*67e74705SXin Li   Q(nanf, ("10"));
52*67e74705SXin Li   Q(nanl, ("10"));
53*67e74705SXin Li   Q(nans, ("10"));
54*67e74705SXin Li 
55*67e74705SXin Li   P(isgreater, (1., 2.));
56*67e74705SXin Li   P(isgreaterequal, (1., 2.));
57*67e74705SXin Li   P(isless, (1., 2.));
58*67e74705SXin Li   P(islessequal, (1., 2.));
59*67e74705SXin Li   P(islessgreater, (1., 2.));
60*67e74705SXin Li   P(isunordered, (1., 2.));
61*67e74705SXin Li 
62*67e74705SXin Li   P(isinf, (1.));
63*67e74705SXin Li   P(isinf_sign, (1.));
64*67e74705SXin Li   P(isnan, (1.));
65*67e74705SXin Li 
66*67e74705SXin Li   // Bitwise & Numeric Functions
67*67e74705SXin Li 
68*67e74705SXin Li   P(abs, (N));
69*67e74705SXin Li 
70*67e74705SXin Li   P(clz, (N));
71*67e74705SXin Li   P(clzl, (N));
72*67e74705SXin Li   P(clzll, (N));
73*67e74705SXin Li   P(ctz, (N));
74*67e74705SXin Li   P(ctzl, (N));
75*67e74705SXin Li   P(ctzll, (N));
76*67e74705SXin Li   P(ffs, (N));
77*67e74705SXin Li   P(ffsl, (N));
78*67e74705SXin Li   P(ffsll, (N));
79*67e74705SXin Li   P(parity, (N));
80*67e74705SXin Li   P(parityl, (N));
81*67e74705SXin Li   P(parityll, (N));
82*67e74705SXin Li   P(popcount, (N));
83*67e74705SXin Li   P(popcountl, (N));
84*67e74705SXin Li   P(popcountll, (N));
85*67e74705SXin Li   Q(powi, (1.2f, N));
86*67e74705SXin Li   Q(powif, (1.2f, N));
87*67e74705SXin Li   Q(powil, (1.2f, N));
88*67e74705SXin Li 
89*67e74705SXin Li   // Lib functions
90*67e74705SXin Li   int a, b, n = random(); // Avoid optimizing out.
91*67e74705SXin Li   char s0[10], s1[] = "Hello";
92*67e74705SXin Li   V(strcat, (s0, s1));
93*67e74705SXin Li   V(strcmp, (s0, s1));
94*67e74705SXin Li   V(strncat, (s0, s1, n));
95*67e74705SXin Li   V(strchr, (s0, s1[0]));
96*67e74705SXin Li   V(strrchr, (s0, s1[0]));
97*67e74705SXin Li   V(strcpy, (s0, s1));
98*67e74705SXin Li   V(strncpy, (s0, s1, n));
99*67e74705SXin Li 
100*67e74705SXin Li   // Object size checking
101*67e74705SXin Li   V(__memset_chk, (s0, 0, sizeof s0, n));
102*67e74705SXin Li   V(__memcpy_chk, (s0, s1, sizeof s0, n));
103*67e74705SXin Li   V(__memmove_chk, (s0, s1, sizeof s0, n));
104*67e74705SXin Li   V(__mempcpy_chk, (s0, s1, sizeof s0, n));
105*67e74705SXin Li   V(__strncpy_chk, (s0, s1, sizeof s0, n));
106*67e74705SXin Li   V(__strcpy_chk, (s0, s1, n));
107*67e74705SXin Li   s0[0] = 0;
108*67e74705SXin Li   V(__strcat_chk, (s0, s1, n));
109*67e74705SXin Li   P(object_size, (s0, 0));
110*67e74705SXin Li   P(object_size, (s0, 1));
111*67e74705SXin Li   P(object_size, (s0, 2));
112*67e74705SXin Li   P(object_size, (s0, 3));
113*67e74705SXin Li 
114*67e74705SXin Li   // Whatever
115*67e74705SXin Li 
116*67e74705SXin Li   P(bswap16, (N));
117*67e74705SXin Li   P(bswap32, (N));
118*67e74705SXin Li   P(bswap64, (N));
119*67e74705SXin Li 
120*67e74705SXin Li   // CHECK: @llvm.bitreverse.i8
121*67e74705SXin Li   // CHECK: @llvm.bitreverse.i16
122*67e74705SXin Li   // CHECK: @llvm.bitreverse.i32
123*67e74705SXin Li   // CHECK: @llvm.bitreverse.i64
124*67e74705SXin Li   P(bitreverse8, (N));
125*67e74705SXin Li   P(bitreverse16, (N));
126*67e74705SXin Li   P(bitreverse32, (N));
127*67e74705SXin Li   P(bitreverse64, (N));
128*67e74705SXin Li 
129*67e74705SXin Li   // FIXME
130*67e74705SXin Li   // V(clear_cache, (&N, &N+1));
131*67e74705SXin Li   V(trap, ());
132*67e74705SXin Li   R(extract_return_addr, (&N));
133*67e74705SXin Li   P(signbit, (1.0));
134*67e74705SXin Li 
135*67e74705SXin Li   return 0;
136*67e74705SXin Li }
137*67e74705SXin Li 
138*67e74705SXin Li 
139*67e74705SXin Li 
foo()140*67e74705SXin Li void foo() {
141*67e74705SXin Li  __builtin_strcat(0, 0);
142*67e74705SXin Li }
143*67e74705SXin Li 
144*67e74705SXin Li // CHECK-LABEL: define void @bar(
bar()145*67e74705SXin Li void bar() {
146*67e74705SXin Li   float f;
147*67e74705SXin Li   double d;
148*67e74705SXin Li   long double ld;
149*67e74705SXin Li 
150*67e74705SXin Li   // LLVM's hex representation of float constants is really unfortunate;
151*67e74705SXin Li   // basically it does a float-to-double "conversion" and then prints the
152*67e74705SXin Li   // hex form of that.  That gives us weird artifacts like exponents
153*67e74705SXin Li   // that aren't numerically similar to the original exponent and
154*67e74705SXin Li   // significand bit-patterns that are offset by three bits (because
155*67e74705SXin Li   // the exponent was expanded from 8 bits to 11).
156*67e74705SXin Li   //
157*67e74705SXin Li   // 0xAE98 == 1010111010011000
158*67e74705SXin Li   // 0x15D3 == 1010111010011
159*67e74705SXin Li 
160*67e74705SXin Li   f = __builtin_huge_valf();     // CHECK: float    0x7FF0000000000000
161*67e74705SXin Li   d = __builtin_huge_val();      // CHECK: double   0x7FF0000000000000
162*67e74705SXin Li   ld = __builtin_huge_vall();    // CHECK: x86_fp80 0xK7FFF8000000000000000
163*67e74705SXin Li   f = __builtin_nanf("");        // CHECK: float    0x7FF8000000000000
164*67e74705SXin Li   d = __builtin_nan("");         // CHECK: double   0x7FF8000000000000
165*67e74705SXin Li   ld = __builtin_nanl("");       // CHECK: x86_fp80 0xK7FFFC000000000000000
166*67e74705SXin Li   f = __builtin_nanf("0xAE98");  // CHECK: float    0x7FF815D300000000
167*67e74705SXin Li   d = __builtin_nan("0xAE98");   // CHECK: double   0x7FF800000000AE98
168*67e74705SXin Li   ld = __builtin_nanl("0xAE98"); // CHECK: x86_fp80 0xK7FFFC00000000000AE98
169*67e74705SXin Li   f = __builtin_nansf("");       // CHECK: float    0x7FF4000000000000
170*67e74705SXin Li   d = __builtin_nans("");        // CHECK: double   0x7FF4000000000000
171*67e74705SXin Li   ld = __builtin_nansl("");      // CHECK: x86_fp80 0xK7FFFA000000000000000
172*67e74705SXin Li   f = __builtin_nansf("0xAE98"); // CHECK: float    0x7FF015D300000000
173*67e74705SXin Li   d = __builtin_nans("0xAE98");  // CHECK: double   0x7FF000000000AE98
174*67e74705SXin Li   ld = __builtin_nansl("0xAE98");// CHECK: x86_fp80 0xK7FFF800000000000AE98
175*67e74705SXin Li 
176*67e74705SXin Li }
177*67e74705SXin Li // CHECK: }
178*67e74705SXin Li 
179*67e74705SXin Li 
180*67e74705SXin Li // CHECK-LABEL: define void @test_float_builtins
test_float_builtins(float F,double D,long double LD)181*67e74705SXin Li void test_float_builtins(float F, double D, long double LD) {
182*67e74705SXin Li   volatile int res;
183*67e74705SXin Li   res = __builtin_isinf(F);
184*67e74705SXin Li   // CHECK:  call float @llvm.fabs.f32(float
185*67e74705SXin Li   // CHECK:  fcmp oeq float {{.*}}, 0x7FF0000000000000
186*67e74705SXin Li 
187*67e74705SXin Li   res = __builtin_isinf(D);
188*67e74705SXin Li   // CHECK:  call double @llvm.fabs.f64(double
189*67e74705SXin Li   // CHECK:  fcmp oeq double {{.*}}, 0x7FF0000000000000
190*67e74705SXin Li 
191*67e74705SXin Li   res = __builtin_isinf(LD);
192*67e74705SXin Li   // CHECK:  call x86_fp80 @llvm.fabs.f80(x86_fp80
193*67e74705SXin Li   // CHECK:  fcmp oeq x86_fp80 {{.*}}, 0xK7FFF8000000000000000
194*67e74705SXin Li 
195*67e74705SXin Li   res = __builtin_isinf_sign(F);
196*67e74705SXin Li   // CHECK:  %[[ABS:.*]] = call float @llvm.fabs.f32(float %[[ARG:.*]])
197*67e74705SXin Li   // CHECK:  %[[ISINF:.*]] = fcmp oeq float %[[ABS]], 0x7FF0000000000000
198*67e74705SXin Li   // CHECK:  %[[BITCAST:.*]] = bitcast float %[[ARG]] to i32
199*67e74705SXin Li   // CHECK:  %[[ISNEG:.*]] = icmp slt i32 %[[BITCAST]], 0
200*67e74705SXin Li   // CHECK:  %[[SIGN:.*]] = select i1 %[[ISNEG]], i32 -1, i32 1
201*67e74705SXin Li   // CHECK:  select i1 %[[ISINF]], i32 %[[SIGN]], i32 0
202*67e74705SXin Li 
203*67e74705SXin Li   res = __builtin_isinf_sign(D);
204*67e74705SXin Li   // CHECK:  %[[ABS:.*]] = call double @llvm.fabs.f64(double %[[ARG:.*]])
205*67e74705SXin Li   // CHECK:  %[[ISINF:.*]] = fcmp oeq double %[[ABS]], 0x7FF0000000000000
206*67e74705SXin Li   // CHECK:  %[[BITCAST:.*]] = bitcast double %[[ARG]] to i64
207*67e74705SXin Li   // CHECK:  %[[ISNEG:.*]] = icmp slt i64 %[[BITCAST]], 0
208*67e74705SXin Li   // CHECK:  %[[SIGN:.*]] = select i1 %[[ISNEG]], i32 -1, i32 1
209*67e74705SXin Li   // CHECK:  select i1 %[[ISINF]], i32 %[[SIGN]], i32 0
210*67e74705SXin Li 
211*67e74705SXin Li   res = __builtin_isinf_sign(LD);
212*67e74705SXin Li   // CHECK:  %[[ABS:.*]] = call x86_fp80 @llvm.fabs.f80(x86_fp80 %[[ARG:.*]])
213*67e74705SXin Li   // CHECK:  %[[ISINF:.*]] = fcmp oeq x86_fp80 %[[ABS]], 0xK7FFF8000000000000000
214*67e74705SXin Li   // CHECK:  %[[BITCAST:.*]] = bitcast x86_fp80 %[[ARG]] to i80
215*67e74705SXin Li   // CHECK:  %[[ISNEG:.*]] = icmp slt i80 %[[BITCAST]], 0
216*67e74705SXin Li   // CHECK:  %[[SIGN:.*]] = select i1 %[[ISNEG]], i32 -1, i32 1
217*67e74705SXin Li   // CHECK:  select i1 %[[ISINF]], i32 %[[SIGN]], i32 0
218*67e74705SXin Li 
219*67e74705SXin Li   res = __builtin_isfinite(F);
220*67e74705SXin Li   // CHECK: call float @llvm.fabs.f32(float
221*67e74705SXin Li   // CHECK: fcmp one float {{.*}}, 0x7FF0000000000000
222*67e74705SXin Li 
223*67e74705SXin Li   res = __builtin_isnormal(F);
224*67e74705SXin Li   // CHECK: fcmp oeq float
225*67e74705SXin Li   // CHECK: call float @llvm.fabs.f32(float
226*67e74705SXin Li   // CHECK: fcmp ult float {{.*}}, 0x7FF0000000000000
227*67e74705SXin Li   // CHECK: fcmp uge float {{.*}}, 0x3810000000000000
228*67e74705SXin Li   // CHECK: and i1
229*67e74705SXin Li   // CHECK: and i1
230*67e74705SXin Li }
231*67e74705SXin Li 
232*67e74705SXin Li // CHECK-LABEL: define void @test_float_builtin_ops
test_float_builtin_ops(float F,double D,long double LD)233*67e74705SXin Li void test_float_builtin_ops(float F, double D, long double LD) {
234*67e74705SXin Li   volatile float resf;
235*67e74705SXin Li   volatile double resd;
236*67e74705SXin Li   volatile long double resld;
237*67e74705SXin Li 
238*67e74705SXin Li   resf = __builtin_fmodf(F,F);
239*67e74705SXin Li   // CHECK: frem float
240*67e74705SXin Li 
241*67e74705SXin Li   resd = __builtin_fmod(D,D);
242*67e74705SXin Li   // CHECK: frem double
243*67e74705SXin Li 
244*67e74705SXin Li   resld = __builtin_fmodl(LD,LD);
245*67e74705SXin Li   // CHECK: frem x86_fp80
246*67e74705SXin Li 
247*67e74705SXin Li   resf = __builtin_fabsf(F);
248*67e74705SXin Li   resd = __builtin_fabs(D);
249*67e74705SXin Li   resld = __builtin_fabsl(LD);
250*67e74705SXin Li   // CHECK: call float @llvm.fabs.f32(float
251*67e74705SXin Li   // CHECK: call double @llvm.fabs.f64(double
252*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.fabs.f80(x86_fp80
253*67e74705SXin Li 
254*67e74705SXin Li   resf = __builtin_canonicalizef(F);
255*67e74705SXin Li   resd = __builtin_canonicalize(D);
256*67e74705SXin Li   resld = __builtin_canonicalizel(LD);
257*67e74705SXin Li   // CHECK: call float @llvm.canonicalize.f32(float
258*67e74705SXin Li   // CHECK: call double @llvm.canonicalize.f64(double
259*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.canonicalize.f80(x86_fp80
260*67e74705SXin Li 
261*67e74705SXin Li   resf = __builtin_fminf(F, F);
262*67e74705SXin Li   // CHECK: call float @llvm.minnum.f32
263*67e74705SXin Li 
264*67e74705SXin Li   resd = __builtin_fmin(D, D);
265*67e74705SXin Li   // CHECK: call double @llvm.minnum.f64
266*67e74705SXin Li 
267*67e74705SXin Li   resld = __builtin_fminl(LD, LD);
268*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.minnum.f80
269*67e74705SXin Li 
270*67e74705SXin Li   resf = __builtin_fmaxf(F, F);
271*67e74705SXin Li   // CHECK: call float @llvm.maxnum.f32
272*67e74705SXin Li 
273*67e74705SXin Li   resd = __builtin_fmax(D, D);
274*67e74705SXin Li   // CHECK: call double @llvm.maxnum.f64
275*67e74705SXin Li 
276*67e74705SXin Li   resld = __builtin_fmaxl(LD, LD);
277*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.maxnum.f80
278*67e74705SXin Li 
279*67e74705SXin Li   resf = __builtin_fabsf(F);
280*67e74705SXin Li   // CHECK: call float @llvm.fabs.f32
281*67e74705SXin Li 
282*67e74705SXin Li   resd = __builtin_fabs(D);
283*67e74705SXin Li   // CHECK: call double @llvm.fabs.f64
284*67e74705SXin Li 
285*67e74705SXin Li   resld = __builtin_fabsl(LD);
286*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.fabs.f80
287*67e74705SXin Li 
288*67e74705SXin Li   resf = __builtin_copysignf(F, F);
289*67e74705SXin Li   // CHECK: call float @llvm.copysign.f32
290*67e74705SXin Li 
291*67e74705SXin Li   resd = __builtin_copysign(D, D);
292*67e74705SXin Li   // CHECK: call double @llvm.copysign.f64
293*67e74705SXin Li 
294*67e74705SXin Li   resld = __builtin_copysignl(LD, LD);
295*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.copysign.f80
296*67e74705SXin Li 
297*67e74705SXin Li 
298*67e74705SXin Li   resf = __builtin_ceilf(F);
299*67e74705SXin Li   // CHECK: call float @llvm.ceil.f32
300*67e74705SXin Li 
301*67e74705SXin Li   resd = __builtin_ceil(D);
302*67e74705SXin Li   // CHECK: call double @llvm.ceil.f64
303*67e74705SXin Li 
304*67e74705SXin Li   resld = __builtin_ceill(LD);
305*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.ceil.f80
306*67e74705SXin Li 
307*67e74705SXin Li   resf = __builtin_floorf(F);
308*67e74705SXin Li   // CHECK: call float @llvm.floor.f32
309*67e74705SXin Li 
310*67e74705SXin Li   resd = __builtin_floor(D);
311*67e74705SXin Li   // CHECK: call double @llvm.floor.f64
312*67e74705SXin Li 
313*67e74705SXin Li   resld = __builtin_floorl(LD);
314*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.floor.f80
315*67e74705SXin Li 
316*67e74705SXin Li   resf = __builtin_truncf(F);
317*67e74705SXin Li   // CHECK: call float @llvm.trunc.f32
318*67e74705SXin Li 
319*67e74705SXin Li   resd = __builtin_trunc(D);
320*67e74705SXin Li   // CHECK: call double @llvm.trunc.f64
321*67e74705SXin Li 
322*67e74705SXin Li   resld = __builtin_truncl(LD);
323*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.trunc.f80
324*67e74705SXin Li 
325*67e74705SXin Li   resf = __builtin_rintf(F);
326*67e74705SXin Li   // CHECK: call float @llvm.rint.f32
327*67e74705SXin Li 
328*67e74705SXin Li   resd = __builtin_rint(D);
329*67e74705SXin Li   // CHECK: call double @llvm.rint.f64
330*67e74705SXin Li 
331*67e74705SXin Li   resld = __builtin_rintl(LD);
332*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.rint.f80
333*67e74705SXin Li 
334*67e74705SXin Li   resf = __builtin_nearbyintf(F);
335*67e74705SXin Li   // CHECK: call float @llvm.nearbyint.f32
336*67e74705SXin Li 
337*67e74705SXin Li   resd = __builtin_nearbyint(D);
338*67e74705SXin Li   // CHECK: call double @llvm.nearbyint.f64
339*67e74705SXin Li 
340*67e74705SXin Li   resld = __builtin_nearbyintl(LD);
341*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.nearbyint.f80
342*67e74705SXin Li 
343*67e74705SXin Li   resf = __builtin_roundf(F);
344*67e74705SXin Li   // CHECK: call float @llvm.round.f32
345*67e74705SXin Li 
346*67e74705SXin Li   resd = __builtin_round(D);
347*67e74705SXin Li   // CHECK: call double @llvm.round.f64
348*67e74705SXin Li 
349*67e74705SXin Li   resld = __builtin_roundl(LD);
350*67e74705SXin Li   // CHECK: call x86_fp80 @llvm.round.f80
351*67e74705SXin Li 
352*67e74705SXin Li }
353*67e74705SXin Li 
354*67e74705SXin Li // __builtin_longjmp isn't supported on all platforms, so only test it on X86.
355*67e74705SXin Li #ifdef __x86_64__
356*67e74705SXin Li // CHECK-LABEL: define void @test_builtin_longjmp
test_builtin_longjmp(void ** buffer)357*67e74705SXin Li void test_builtin_longjmp(void **buffer) {
358*67e74705SXin Li   // CHECK: [[BITCAST:%.*]] = bitcast
359*67e74705SXin Li   // CHECK-NEXT: call void @llvm.eh.sjlj.longjmp(i8* [[BITCAST]])
360*67e74705SXin Li   __builtin_longjmp(buffer, 1);
361*67e74705SXin Li   // CHECK-NEXT: unreachable
362*67e74705SXin Li }
363*67e74705SXin Li #endif
364*67e74705SXin Li 
365*67e74705SXin Li // CHECK-LABEL: define i64 @test_builtin_readcyclecounter
test_builtin_readcyclecounter()366*67e74705SXin Li long long test_builtin_readcyclecounter() {
367*67e74705SXin Li   // CHECK: call i64 @llvm.readcyclecounter()
368*67e74705SXin Li   return __builtin_readcyclecounter();
369*67e74705SXin Li }
370