xref: /llvm-project/clang/test/CodeGen/builtins-bitint.c (revision 9ad72df55cb74b29193270c28f6974d2af8e0b71)
17298ae3bSBjörn Pettersson // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
27298ae3bSBjörn Pettersson // RUN: %clang_cc1 -triple arm-unknown-unknown -O0 -std=c23 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-O0
37298ae3bSBjörn Pettersson // RUN: %clang_cc1 -triple arm-unknown-unknown -O1 -std=c23 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-O1
47298ae3bSBjörn Pettersson 
57298ae3bSBjörn Pettersson // Verify that the result from the intrinsic call is zero extended to avoid that
67298ae3bSBjörn Pettersson // we get a negative result from popcountg/ctzg/clzg.
77298ae3bSBjörn Pettersson 
87298ae3bSBjörn Pettersson // CHECK-O0-LABEL: define dso_local arm_aapcscc i32 @test_popcountg_ubi1(
97298ae3bSBjörn Pettersson // CHECK-O0-SAME: ) #[[ATTR0:[0-9]+]] {
107298ae3bSBjörn Pettersson // CHECK-O0-NEXT:  entry:
11*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[A:%.*]] = alloca i8, align 1
12*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    store i8 1, ptr [[A]], align 1
13*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A]], align 1
14*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
15*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP1:%.*]] = call i1 @llvm.ctpop.i1(i1 [[LOADEDV]])
167298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    [[CAST:%.*]] = zext i1 [[TMP1]] to i32
177298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    ret i32 [[CAST]]
187298ae3bSBjörn Pettersson //
197298ae3bSBjörn Pettersson // CHECK-O1-LABEL: define dso_local arm_aapcscc noundef i32 @test_popcountg_ubi1(
207298ae3bSBjörn Pettersson // CHECK-O1-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] {
217298ae3bSBjörn Pettersson // CHECK-O1-NEXT:  entry:
227298ae3bSBjörn Pettersson // CHECK-O1-NEXT:    ret i32 1
237298ae3bSBjörn Pettersson //
247298ae3bSBjörn Pettersson int test_popcountg_ubi1() {
257298ae3bSBjörn Pettersson   unsigned _BitInt(1) a = 1uwb;
267298ae3bSBjörn Pettersson   return __builtin_popcountg(a);
277298ae3bSBjörn Pettersson }
287298ae3bSBjörn Pettersson 
297298ae3bSBjörn Pettersson // CHECK-O0-LABEL: define dso_local arm_aapcscc i32 @test_popcountg_ubi2(
307298ae3bSBjörn Pettersson // CHECK-O0-SAME: ) #[[ATTR0]] {
317298ae3bSBjörn Pettersson // CHECK-O0-NEXT:  entry:
32*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[A:%.*]] = alloca i8, align 1
33*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    store i8 3, ptr [[A]], align 1
34*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A]], align 1
35*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i2
36*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP1:%.*]] = call i2 @llvm.ctpop.i2(i2 [[LOADEDV]])
377298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    [[CAST:%.*]] = zext i2 [[TMP1]] to i32
387298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    ret i32 [[CAST]]
397298ae3bSBjörn Pettersson //
407298ae3bSBjörn Pettersson // CHECK-O1-LABEL: define dso_local arm_aapcscc noundef i32 @test_popcountg_ubi2(
417298ae3bSBjörn Pettersson // CHECK-O1-SAME: ) local_unnamed_addr #[[ATTR0]] {
427298ae3bSBjörn Pettersson // CHECK-O1-NEXT:  entry:
437298ae3bSBjörn Pettersson // CHECK-O1-NEXT:    ret i32 2
447298ae3bSBjörn Pettersson //
457298ae3bSBjörn Pettersson int test_popcountg_ubi2() {
467298ae3bSBjörn Pettersson   unsigned _BitInt(2) a = 3uwb;
477298ae3bSBjörn Pettersson   return __builtin_popcountg(a);
487298ae3bSBjörn Pettersson }
497298ae3bSBjörn Pettersson 
507298ae3bSBjörn Pettersson // CHECK-O0-LABEL: define dso_local arm_aapcscc i32 @test_ctzg_ubi1(
517298ae3bSBjörn Pettersson // CHECK-O0-SAME: ) #[[ATTR0]] {
527298ae3bSBjörn Pettersson // CHECK-O0-NEXT:  entry:
53*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[A:%.*]] = alloca i8, align 1
54*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    store i8 0, ptr [[A]], align 1
55*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A]], align 1
56*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
57*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP1:%.*]] = call i1 @llvm.cttz.i1(i1 [[LOADEDV]], i1 false)
587298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    [[CAST:%.*]] = zext i1 [[TMP1]] to i32
597298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    ret i32 [[CAST]]
607298ae3bSBjörn Pettersson //
617298ae3bSBjörn Pettersson // CHECK-O1-LABEL: define dso_local arm_aapcscc noundef i32 @test_ctzg_ubi1(
627298ae3bSBjörn Pettersson // CHECK-O1-SAME: ) local_unnamed_addr #[[ATTR0]] {
637298ae3bSBjörn Pettersson // CHECK-O1-NEXT:  entry:
647298ae3bSBjörn Pettersson // CHECK-O1-NEXT:    ret i32 1
657298ae3bSBjörn Pettersson //
667298ae3bSBjörn Pettersson int test_ctzg_ubi1() {
677298ae3bSBjörn Pettersson   unsigned _BitInt(1) a = 0uwb;
687298ae3bSBjörn Pettersson   return __builtin_ctzg(a);
697298ae3bSBjörn Pettersson }
707298ae3bSBjörn Pettersson 
717298ae3bSBjörn Pettersson // CHECK-O0-LABEL: define dso_local arm_aapcscc i32 @test_ctzg_ubi2(
727298ae3bSBjörn Pettersson // CHECK-O0-SAME: ) #[[ATTR0]] {
737298ae3bSBjörn Pettersson // CHECK-O0-NEXT:  entry:
74*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[A:%.*]] = alloca i8, align 1
75*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    store i8 0, ptr [[A]], align 1
76*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A]], align 1
77*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i2
78*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP1:%.*]] = call i2 @llvm.cttz.i2(i2 [[LOADEDV]], i1 false)
797298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    [[CAST:%.*]] = zext i2 [[TMP1]] to i32
807298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    ret i32 [[CAST]]
817298ae3bSBjörn Pettersson //
827298ae3bSBjörn Pettersson // CHECK-O1-LABEL: define dso_local arm_aapcscc noundef i32 @test_ctzg_ubi2(
837298ae3bSBjörn Pettersson // CHECK-O1-SAME: ) local_unnamed_addr #[[ATTR0]] {
847298ae3bSBjörn Pettersson // CHECK-O1-NEXT:  entry:
857298ae3bSBjörn Pettersson // CHECK-O1-NEXT:    ret i32 2
867298ae3bSBjörn Pettersson //
877298ae3bSBjörn Pettersson int test_ctzg_ubi2() {
887298ae3bSBjörn Pettersson   unsigned _BitInt(2) a = 0uwb;
897298ae3bSBjörn Pettersson   return __builtin_ctzg(a);
907298ae3bSBjörn Pettersson }
917298ae3bSBjörn Pettersson 
927298ae3bSBjörn Pettersson // CHECK-O0-LABEL: define dso_local arm_aapcscc i32 @test_clzg_ubi1(
937298ae3bSBjörn Pettersson // CHECK-O0-SAME: ) #[[ATTR0]] {
947298ae3bSBjörn Pettersson // CHECK-O0-NEXT:  entry:
95*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[A:%.*]] = alloca i8, align 1
96*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    store i8 0, ptr [[A]], align 1
97*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A]], align 1
98*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
99*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP1:%.*]] = call i1 @llvm.ctlz.i1(i1 [[LOADEDV]], i1 false)
1007298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    [[CAST:%.*]] = zext i1 [[TMP1]] to i32
1017298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    ret i32 [[CAST]]
1027298ae3bSBjörn Pettersson //
1037298ae3bSBjörn Pettersson // CHECK-O1-LABEL: define dso_local arm_aapcscc noundef i32 @test_clzg_ubi1(
1047298ae3bSBjörn Pettersson // CHECK-O1-SAME: ) local_unnamed_addr #[[ATTR0]] {
1057298ae3bSBjörn Pettersson // CHECK-O1-NEXT:  entry:
1067298ae3bSBjörn Pettersson // CHECK-O1-NEXT:    ret i32 1
1077298ae3bSBjörn Pettersson //
1087298ae3bSBjörn Pettersson int test_clzg_ubi1() {
1097298ae3bSBjörn Pettersson   unsigned _BitInt(1) a = 0uwb;
1107298ae3bSBjörn Pettersson   return __builtin_clzg(a);
1117298ae3bSBjörn Pettersson }
1127298ae3bSBjörn Pettersson 
1137298ae3bSBjörn Pettersson // CHECK-O0-LABEL: define dso_local arm_aapcscc i32 @test_clzg_ubi2(
1147298ae3bSBjörn Pettersson // CHECK-O0-SAME: ) #[[ATTR0]] {
1157298ae3bSBjörn Pettersson // CHECK-O0-NEXT:  entry:
116*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[A:%.*]] = alloca i8, align 1
117*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    store i8 0, ptr [[A]], align 1
118*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A]], align 1
119*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i2
120*9ad72df5SMariya Podchishchaeva // CHECK-O0-NEXT:    [[TMP1:%.*]] = call i2 @llvm.ctlz.i2(i2 [[LOADEDV]], i1 false)
1217298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    [[CAST:%.*]] = zext i2 [[TMP1]] to i32
1227298ae3bSBjörn Pettersson // CHECK-O0-NEXT:    ret i32 [[CAST]]
1237298ae3bSBjörn Pettersson //
1247298ae3bSBjörn Pettersson // CHECK-O1-LABEL: define dso_local arm_aapcscc noundef i32 @test_clzg_ubi2(
1257298ae3bSBjörn Pettersson // CHECK-O1-SAME: ) local_unnamed_addr #[[ATTR0]] {
1267298ae3bSBjörn Pettersson // CHECK-O1-NEXT:  entry:
1277298ae3bSBjörn Pettersson // CHECK-O1-NEXT:    ret i32 2
1287298ae3bSBjörn Pettersson //
1297298ae3bSBjörn Pettersson int test_clzg_ubi2() {
1307298ae3bSBjörn Pettersson   unsigned _BitInt(2) a = 0uwb;
1317298ae3bSBjörn Pettersson   return __builtin_clzg(a);
1327298ae3bSBjörn Pettersson }
133