1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
2; RUN: opt -S -mtriple=amdgcn-amd- -amdgpu-annotate-kernel-features %s | FileCheck -check-prefixes=CHECK,AKF_CHECK %s
3; RUN: opt -S -mtriple=amdgcn-amd- -amdgpu-attributor %s | FileCheck -check-prefixes=CHECK,ATTRIBUTOR_CHECK %s
4
5@x = global i32 0
6
7; Propagate the uniform-work-group-attribute from the kernel to callee if it doesn't have it
8;.
9; CHECK: @[[X:[a-zA-Z0-9_$"\\.-]+]] = global i32 0
10;.
11define void @func() #0 {
12; CHECK-LABEL: define {{[^@]+}}@func
13; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
14; CHECK-NEXT:    store i32 0, i32* @x, align 4
15; CHECK-NEXT:    ret void
16;
17  store i32 0, i32* @x
18  ret void
19}
20
21define amdgpu_kernel void @kernel1() #1 {
22; AKF_CHECK-LABEL: define {{[^@]+}}@kernel1
23; AKF_CHECK-SAME: () #[[ATTR1:[0-9]+]] {
24; AKF_CHECK-NEXT:    call void @func()
25; AKF_CHECK-NEXT:    ret void
26;
27; ATTRIBUTOR_CHECK-LABEL: define {{[^@]+}}@kernel1
28; ATTRIBUTOR_CHECK-SAME: () #[[ATTR1:[0-9]+]] {
29; ATTRIBUTOR_CHECK-NEXT:    call void @func() #[[ATTR4:[0-9]+]]
30; ATTRIBUTOR_CHECK-NEXT:    ret void
31;
32  call void @func()
33  ret void
34}
35
36; External declaration of a function
37define weak_odr void @weak_func() #0 {
38; AKF_CHECK-LABEL: define {{[^@]+}}@weak_func
39; AKF_CHECK-SAME: () #[[ATTR0]] {
40; AKF_CHECK-NEXT:    store i32 0, i32* @x, align 4
41; AKF_CHECK-NEXT:    ret void
42;
43; ATTRIBUTOR_CHECK-LABEL: define {{[^@]+}}@weak_func
44; ATTRIBUTOR_CHECK-SAME: () #[[ATTR2:[0-9]+]] {
45; ATTRIBUTOR_CHECK-NEXT:    store i32 0, i32* @x, align 4
46; ATTRIBUTOR_CHECK-NEXT:    ret void
47;
48  store i32 0, i32* @x
49  ret void
50}
51
52define amdgpu_kernel void @kernel2() #2 {
53; AKF_CHECK-LABEL: define {{[^@]+}}@kernel2
54; AKF_CHECK-SAME: () #[[ATTR2:[0-9]+]] {
55; AKF_CHECK-NEXT:    call void @weak_func()
56; AKF_CHECK-NEXT:    ret void
57;
58; ATTRIBUTOR_CHECK-LABEL: define {{[^@]+}}@kernel2
59; ATTRIBUTOR_CHECK-SAME: () #[[ATTR3:[0-9]+]] {
60; ATTRIBUTOR_CHECK-NEXT:    call void @weak_func() #[[ATTR5:[0-9]+]]
61; ATTRIBUTOR_CHECK-NEXT:    ret void
62;
63  call void @weak_func()
64  ret void
65}
66
67attributes #0 = { nounwind }
68attributes #1 = { "uniform-work-group-size"="false" }
69attributes #2 = { "uniform-work-group-size"="true" }
70;.
71; AKF_CHECK: attributes #[[ATTR0]] = { nounwind "uniform-work-group-size"="false" }
72; AKF_CHECK: attributes #[[ATTR1]] = { "amdgpu-calls" "uniform-work-group-size"="false" }
73; AKF_CHECK: attributes #[[ATTR2]] = { "amdgpu-calls" "uniform-work-group-size"="true" }
74;.
75; ATTRIBUTOR_CHECK: attributes #[[ATTR0]] = { nounwind writeonly "uniform-work-group-size"="false" }
76; ATTRIBUTOR_CHECK: attributes #[[ATTR1]] = { "amdgpu-calls" "uniform-work-group-size"="false" }
77; ATTRIBUTOR_CHECK: attributes #[[ATTR2]] = { nounwind "uniform-work-group-size"="false" }
78; ATTRIBUTOR_CHECK: attributes #[[ATTR3]] = { "amdgpu-calls" "uniform-work-group-size"="true" }
79; ATTRIBUTOR_CHECK: attributes #[[ATTR4]] = { nounwind writeonly }
80; ATTRIBUTOR_CHECK: attributes #[[ATTR5]] = { nounwind }
81;.
82