xref: /llvm-project/clang/test/Headers/openmp-device-functions-bool.c (revision 63ca93c7d1d1ee91281ff7ccdbd7014151319324)
1dee1f5b3SMatt Arsenault // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2
2*63ca93c7SSergio Afonso // RUN: %clang_cc1 -x c -fopenmp -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-unknown -fopenmp-targets=amdgcn-amd-amdhsa -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -internal-isystem %S/../../lib/Headers/openmp_wrappers -internal-isystem %S/Inputs/include -emit-llvm %s -fopenmp-is-target-device  -o - | FileCheck %s --check-prefixes=CHECK,CHECK-C
3*63ca93c7SSergio Afonso // RUN: %clang_cc1 -x c++ -fopenmp -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-unknown -fopenmp-targets=amdgcn-amd-amdhsa -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -internal-isystem %S/../../lib/Headers/openmp_wrappers -internal-isystem %S/Inputs/include -emit-llvm %s -fopenmp-is-target-device  -o - | FileCheck %s --check-prefixes=CHECK,CHECK-CPP
4dee1f5b3SMatt Arsenault 
5dee1f5b3SMatt Arsenault // Test that we did not include <stdbool.h> in C, and OCKL functions using bool
6dee1f5b3SMatt Arsenault // produce an i1
7dee1f5b3SMatt Arsenault 
8dee1f5b3SMatt Arsenault #ifdef __cplusplus
9dee1f5b3SMatt Arsenault typedef bool ockl_bool;
10dee1f5b3SMatt Arsenault #define EXTERN_C extern "C"
11dee1f5b3SMatt Arsenault #else
12dee1f5b3SMatt Arsenault typedef _Bool ockl_bool;
13dee1f5b3SMatt Arsenault #define EXTERN_C
14dee1f5b3SMatt Arsenault #endif
15dee1f5b3SMatt Arsenault 
16dee1f5b3SMatt Arsenault #pragma omp begin declare target
17dee1f5b3SMatt Arsenault 
18dee1f5b3SMatt Arsenault // CHECK-LABEL: define hidden float @test_fdot2
19dee1f5b3SMatt Arsenault // CHECK-SAME: (<2 x half> noundef [[A:%.*]], <2 x half> noundef [[B:%.*]], float noundef [[C:%.*]], i1 noundef zeroext [[S:%.*]]) #[[ATTR0:[0-9]+]] {
20dee1f5b3SMatt Arsenault // CHECK-NEXT:  entry:
21dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[RETVAL:%.*]] = alloca float, align 4, addrspace(5)
22dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[A_ADDR:%.*]] = alloca <2 x half>, align 4, addrspace(5)
23dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[B_ADDR:%.*]] = alloca <2 x half>, align 4, addrspace(5)
24dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[C_ADDR:%.*]] = alloca float, align 4, addrspace(5)
25dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[S_ADDR:%.*]] = alloca i8, align 1, addrspace(5)
26dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
27dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
28dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr
29dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[C_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[C_ADDR]] to ptr
30dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[S_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[S_ADDR]] to ptr
31dee1f5b3SMatt Arsenault // CHECK-NEXT:    store <2 x half> [[A]], ptr [[A_ADDR_ASCAST]], align 4
32dee1f5b3SMatt Arsenault // CHECK-NEXT:    store <2 x half> [[B]], ptr [[B_ADDR_ASCAST]], align 4
33dee1f5b3SMatt Arsenault // CHECK-NEXT:    store float [[C]], ptr [[C_ADDR_ASCAST]], align 4
34dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[FROMBOOL:%.*]] = zext i1 [[S]] to i8
35dee1f5b3SMatt Arsenault // CHECK-NEXT:    store i8 [[FROMBOOL]], ptr [[S_ADDR_ASCAST]], align 1
36dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[A_ADDR_ASCAST]], align 4
37dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[B_ADDR_ASCAST]], align 4
38dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[C_ADDR_ASCAST]], align 4
39dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[TMP3:%.*]] = load i8, ptr [[S_ADDR_ASCAST]], align 1
40dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[TOBOOL:%.*]] = trunc i8 [[TMP3]] to i1
41dee1f5b3SMatt Arsenault // CHECK-NEXT:    [[CALL:%.*]] = call float @__ockl_fdot2(<2 x half> noundef [[TMP0]], <2 x half> noundef [[TMP1]], float noundef [[TMP2]], i1 noundef zeroext [[TOBOOL]]) #[[ATTR2:[0-9]+]]
42dee1f5b3SMatt Arsenault // CHECK-NEXT:    ret float [[CALL]]
43dee1f5b3SMatt Arsenault //
test_fdot2(__2f16 a,__2f16 b,float c,ockl_bool s)44dee1f5b3SMatt Arsenault EXTERN_C float test_fdot2(__2f16 a, __2f16 b, float c, ockl_bool s) {
45dee1f5b3SMatt Arsenault   return __ockl_fdot2(a, b, c, s);
46dee1f5b3SMatt Arsenault }
47dee1f5b3SMatt Arsenault 
48dee1f5b3SMatt Arsenault 
49dee1f5b3SMatt Arsenault #ifndef __cplusplus
50dee1f5b3SMatt Arsenault 
51dee1f5b3SMatt Arsenault enum my_bool {
52dee1f5b3SMatt Arsenault   false,
53dee1f5b3SMatt Arsenault   true
54dee1f5b3SMatt Arsenault };
55dee1f5b3SMatt Arsenault 
56dee1f5b3SMatt Arsenault // CHECK-C-LABEL: define hidden i32 @use_my_bool
57dee1f5b3SMatt Arsenault // CHECK-C-SAME: (i32 noundef [[B:%.*]]) #[[ATTR0]] {
58dee1f5b3SMatt Arsenault // CHECK-C-NEXT:  entry:
59dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5)
60dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
61dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[T:%.*]] = alloca i32, align 4, addrspace(5)
62dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[F:%.*]] = alloca i32, align 4, addrspace(5)
63dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
64dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr
65dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[T_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[T]] to ptr
66dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[F_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F]] to ptr
67dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 4
68dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    store volatile i32 1, ptr [[T_ASCAST]], align 4
69dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    store volatile i32 0, ptr [[F_ASCAST]], align 4
70dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 4
71dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
72dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[LNOT:%.*]] = xor i1 [[TOBOOL]], true
73dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[LNOT]] to i32
74dee1f5b3SMatt Arsenault // CHECK-C-NEXT:    ret i32 [[LNOT_EXT]]
75dee1f5b3SMatt Arsenault //
use_my_bool(enum my_bool b)76dee1f5b3SMatt Arsenault enum my_bool use_my_bool(enum my_bool b) {
77dee1f5b3SMatt Arsenault   volatile enum my_bool t = true;
78dee1f5b3SMatt Arsenault   volatile enum my_bool f = false;
79dee1f5b3SMatt Arsenault 
80dee1f5b3SMatt Arsenault   return !b;
81dee1f5b3SMatt Arsenault }
82dee1f5b3SMatt Arsenault 
83dee1f5b3SMatt Arsenault #endif
84dee1f5b3SMatt Arsenault 
85dee1f5b3SMatt Arsenault 
86dee1f5b3SMatt Arsenault 
87dee1f5b3SMatt Arsenault #pragma omp end declare target
88dee1f5b3SMatt Arsenault //// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
89dee1f5b3SMatt Arsenault // CHECK-CPP: {{.*}}
90