; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 5 ; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 -passes=amdgpu-attributor %s -o - | FileCheck %s declare void @unknown() ; fixed_cluster_dims_0 is only used by fixed_cluster_dims_1 that is expected to ; have fixed dims. define internal void @fixed_cluster_dims_before_0() { ; CHECK-LABEL: define internal void @fixed_cluster_dims_before_0( ; CHECK-SAME: ) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: call void @unknown() ; CHECK-NEXT: ret void ; call void @unknown() ret void } ; fixed_cluster_dims_1 is used by two kernels with the same cluster dims. define internal void @fixed_cluster_dims_1() { ; CHECK-LABEL: define internal void @fixed_cluster_dims_1( ; CHECK-SAME: ) #[[ATTR1]] { ; CHECK-NEXT: call void @fixed_cluster_dims_before_0() ; CHECK-NEXT: call void @unknown() ; CHECK-NEXT: ret void ; call void @fixed_cluster_dims_before_0() call void @unknown() ret void } ; no_cluster_dims_0 is only used by no_cluster_dims_1 that is expected to not use ; cluster. define internal void @no_cluster_dims_0() { ; CHECK-LABEL: define internal void @no_cluster_dims_0( ; CHECK-SAME: ) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: call void @unknown() ; CHECK-NEXT: ret void ; call void @unknown() ret void } ; no_cluster_dims_1 is used by two kernels that don't use cluster. define internal void @no_cluster_dims_1() { ; CHECK-LABEL: define internal void @no_cluster_dims_1( ; CHECK-SAME: ) #[[ATTR2]] { ; CHECK-NEXT: call void @unknown() ; CHECK-NEXT: call void @no_cluster_dims_0() ; CHECK-NEXT: ret void ; call void @unknown() call void @no_cluster_dims_0() ret void } ; non_fixed_cluster_dims is used by two kernels with different cluster dims, so ; it will use cluster but cluster dims is unknown. define internal void @non_fixed_cluster_dims() { ; CHECK-LABEL: define internal void @non_fixed_cluster_dims( ; CHECK-SAME: ) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: call void @unknown() ; CHECK-NEXT: ret void ; call void @unknown() ret void } ; unknown_cluster_dims is used by a kernel that uses cluster and another one that ; doesn't use cluster, so it is unknown that whether cluster is used or not. define internal void @unknown_cluster_dims() { ; CHECK-LABEL: define internal void @unknown_cluster_dims( ; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: call void @unknown() ; CHECK-NEXT: ret void ; call void @unknown() ret void } ; unknown_cluster_use is used by a kernel that we don't know whether cluster will ; be used or not (because it doesn't have any attribute), so it is unknown that ; whether cluster is used or not. define internal void @unknown_cluster_use() { ; CHECK-LABEL: define internal void @unknown_cluster_use( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: call void @unknown() ; CHECK-NEXT: ret void ; call void @unknown() ret void } ; unknown_call_site has unknown call site, so it is unknown that whether cluster ; is used or not. define void @unknown_call_site() { ; CHECK-LABEL: define void @unknown_call_site( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: call void @unknown() ; CHECK-NEXT: ret void ; call void @unknown() ret void } define amdgpu_kernel void @cluster_kernel_0() #0 { ; CHECK-LABEL: define amdgpu_kernel void @cluster_kernel_0( ; CHECK-SAME: ) #[[ATTR1]] { ; CHECK-NEXT: call void @fixed_cluster_dims_1() ; CHECK-NEXT: call void @non_fixed_cluster_dims() ; CHECK-NEXT: call void @unknown_cluster_dims() ; CHECK-NEXT: call void @unknown_call_site() ; CHECK-NEXT: ret void ; call void @fixed_cluster_dims_1() call void @non_fixed_cluster_dims() call void @unknown_cluster_dims() call void @unknown_call_site() ret void } define amdgpu_kernel void @cluster_kernel_0_1() #0 { ; CHECK-LABEL: define amdgpu_kernel void @cluster_kernel_0_1( ; CHECK-SAME: ) #[[ATTR1]] { ; CHECK-NEXT: call void @fixed_cluster_dims_1() ; CHECK-NEXT: ret void ; call void @fixed_cluster_dims_1() ret void } define amdgpu_kernel void @cluster_kernel_1() #1 { ; CHECK-LABEL: define amdgpu_kernel void @cluster_kernel_1( ; CHECK-SAME: ) #[[ATTR4:[0-9]+]] { ; CHECK-NEXT: call void @non_fixed_cluster_dims() ; CHECK-NEXT: ret void ; call void @non_fixed_cluster_dims() ret void } define amdgpu_kernel void @no_cluster_kernel() #2 { ; CHECK-LABEL: define amdgpu_kernel void @no_cluster_kernel( ; CHECK-SAME: ) #[[ATTR2]] { ; CHECK-NEXT: call void @no_cluster_dims_1() ; CHECK-NEXT: call void @unknown_cluster_dims() ; CHECK-NEXT: ret void ; call void @no_cluster_dims_1() call void @unknown_cluster_dims() ret void } define amdgpu_kernel void @no_cluster_kernel_1() #2 { ; CHECK-LABEL: define amdgpu_kernel void @no_cluster_kernel_1( ; CHECK-SAME: ) #[[ATTR2]] { ; CHECK-NEXT: call void @no_cluster_dims_1() ; CHECK-NEXT: ret void ; call void @no_cluster_dims_1() ret void } define amdgpu_kernel void @unknown_cluster_use_kernel() { ; CHECK-LABEL: define amdgpu_kernel void @unknown_cluster_use_kernel( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: call void @unknown_cluster_use() ; CHECK-NEXT: ret void ; call void @unknown_cluster_use() ret void } attributes #0 = { "amdgpu-cluster-dims"="2,2,2" } attributes #1 = { "amdgpu-cluster-dims"="1,2,1" } attributes #2 = { "amdgpu-cluster-dims"="0,0,0" } ;. ; CHECK: attributes #[[ATTR0]] = { "target-cpu"="gfx1250" } ; CHECK: attributes #[[ATTR1]] = { "amdgpu-cluster-dims"="2,2,2" "target-cpu"="gfx1250" } ; CHECK: attributes #[[ATTR2]] = { "amdgpu-cluster-dims"="0,0,0" "target-cpu"="gfx1250" } ; CHECK: attributes #[[ATTR3]] = { "amdgpu-cluster-dims"="1024,1024,1024" "target-cpu"="gfx1250" } ; CHECK: attributes #[[ATTR4]] = { "amdgpu-cluster-dims"="1,2,1" "target-cpu"="gfx1250" } ;.