xref: /llvm-project/clang/test/CodeGenSYCL/function-attrs.cpp (revision 7e59223ac4b045178c287a56154113d5989572f4)
12dc6579fSMatt Arsenault // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals --version 3
2*7e59223aSFangrui Song // RUN: %clang_cc1 -fsycl-is-device -disable-llvm-passes \
32dc6579fSMatt Arsenault // RUN:  -triple spir64 -fexceptions -emit-llvm -fno-ident %s -o - | FileCheck %s
46b868139SHarald van Dijk 
56b868139SHarald van Dijk int foo();
66b868139SHarald van Dijk 
72dc6579fSMatt Arsenault // CHECK-LABEL: define dso_local spir_func void @_Z3barv(
82dc6579fSMatt Arsenault // CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
92dc6579fSMatt Arsenault // CHECK-NEXT:  entry:
102dc6579fSMatt Arsenault // CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
112dc6579fSMatt Arsenault // CHECK-NEXT:    [[A_ASCAST:%.*]] = addrspacecast ptr [[A]] to ptr addrspace(4)
122dc6579fSMatt Arsenault // CHECK-NEXT:    [[CALL:%.*]] = call spir_func noundef i32 @_Z3foov() #[[ATTR1:[0-9]+]]
132dc6579fSMatt Arsenault // CHECK-NEXT:    store i32 [[CALL]], ptr addrspace(4) [[A_ASCAST]], align 4
142dc6579fSMatt Arsenault // CHECK-NEXT:    ret void
152dc6579fSMatt Arsenault //
bar()166b868139SHarald van Dijk void bar() {
176b868139SHarald van Dijk   int a = foo();
186b868139SHarald van Dijk }
196b868139SHarald van Dijk 
202dc6579fSMatt Arsenault // CHECK-LABEL: define dso_local spir_func noundef i32 @_Z3foov(
212dc6579fSMatt Arsenault // CHECK-SAME: ) #[[ATTR0]] {
222dc6579fSMatt Arsenault // CHECK-NEXT:  entry:
232dc6579fSMatt Arsenault // CHECK-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
242dc6579fSMatt Arsenault // CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr [[RETVAL]] to ptr addrspace(4)
252dc6579fSMatt Arsenault // CHECK-NEXT:    ret i32 1
262dc6579fSMatt Arsenault //
foo()276b868139SHarald van Dijk int foo() {
286b868139SHarald van Dijk   return 1;
296b868139SHarald van Dijk }
306b868139SHarald van Dijk 
316b868139SHarald van Dijk template <typename Name, typename Func>
kernel_single_task(const Func & kernelFunc)326b868139SHarald van Dijk __attribute__((sycl_kernel)) void kernel_single_task(const Func &kernelFunc) {
336b868139SHarald van Dijk   kernelFunc();
346b868139SHarald van Dijk }
356b868139SHarald van Dijk 
362dc6579fSMatt Arsenault // CHECK-LABEL: define dso_local noundef i32 @main(
372dc6579fSMatt Arsenault // CHECK-SAME: ) #[[ATTR0]] {
382dc6579fSMatt Arsenault // CHECK-NEXT:  entry:
392dc6579fSMatt Arsenault // CHECK-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
402dc6579fSMatt Arsenault // CHECK-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 1
412dc6579fSMatt Arsenault // CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr [[RETVAL]] to ptr addrspace(4)
422dc6579fSMatt Arsenault // CHECK-NEXT:    [[REF_TMP_ASCAST:%.*]] = addrspacecast ptr [[REF_TMP]] to ptr addrspace(4)
432dc6579fSMatt Arsenault // CHECK-NEXT:    store i32 0, ptr addrspace(4) [[RETVAL_ASCAST]], align 4
442dc6579fSMatt Arsenault // CHECK-NEXT:    call spir_func void @_Z18kernel_single_taskIZ4mainE11fake_kernelZ4mainEUlvE_EvRKT0_(ptr addrspace(4) noundef align 1 dereferenceable(1) [[REF_TMP_ASCAST]]) #[[ATTR1]]
452dc6579fSMatt Arsenault // CHECK-NEXT:    ret i32 0
462dc6579fSMatt Arsenault //
main()476b868139SHarald van Dijk int main() {
486b868139SHarald van Dijk   kernel_single_task<class fake_kernel>([] { bar(); });
496b868139SHarald van Dijk   return 0;
506b868139SHarald van Dijk }
512dc6579fSMatt Arsenault //.
522dc6579fSMatt Arsenault // CHECK: attributes #0 = { convergent mustprogress noinline norecurse nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
532dc6579fSMatt Arsenault // CHECK: attributes #1 = { convergent nounwind }
542dc6579fSMatt Arsenault //.
552dc6579fSMatt Arsenault // CHECK: !0 = !{i32 1, !"wchar_size", i32 4}
562dc6579fSMatt Arsenault //.
57