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-amdhsa -amdgpu-attributor %s | FileCheck %s 3 4; Check propagation of amdgpu-flat-work-group-size attribute. 5 6; Called from a single kernel with 1,256 7define internal void @default_to_1_256() { 8; CHECK-LABEL: define {{[^@]+}}@default_to_1_256 9; CHECK-SAME: () #[[ATTR0:[0-9]+]] { 10; CHECK-NEXT: ret void 11; 12 ret void 13} 14 15define amdgpu_kernel void @kernel_1_256() #0 { 16; CHECK-LABEL: define {{[^@]+}}@kernel_1_256 17; CHECK-SAME: () #[[ATTR0]] { 18; CHECK-NEXT: call void @default_to_1_256() 19; CHECK-NEXT: ret void 20; 21 call void @default_to_1_256() 22 ret void 23} 24 25; Called from a single kernel with 64,128 26define internal void @default_to_64_128() { 27; CHECK-LABEL: define {{[^@]+}}@default_to_64_128 28; CHECK-SAME: () #[[ATTR1:[0-9]+]] { 29; CHECK-NEXT: ret void 30; 31 ret void 32} 33 34define amdgpu_kernel void @kernel_64_128() #1 { 35; CHECK-LABEL: define {{[^@]+}}@kernel_64_128 36; CHECK-SAME: () #[[ATTR1]] { 37; CHECK-NEXT: call void @default_to_64_128() 38; CHECK-NEXT: call void @flat_group_64_64() 39; CHECK-NEXT: call void @default_to_64_256() 40; CHECK-NEXT: call void @flat_group_128_256() 41; CHECK-NEXT: ret void 42; 43 call void @default_to_64_128() 44 call void @flat_group_64_64() 45 call void @default_to_64_256() 46 call void @flat_group_128_256() 47 ret void 48} 49 50; Called from kernels with 128,512 and 512,512 51define internal void @default_to_128_512() { 52; CHECK-LABEL: define {{[^@]+}}@default_to_128_512 53; CHECK-SAME: () #[[ATTR2:[0-9]+]] { 54; CHECK-NEXT: ret void 55; 56 ret void 57} 58 59; This already has a strict bounds, but called from kernels with wider 60; bounds, and should not be changed. 61define internal void @flat_group_64_64() #2 { 62; CHECK-LABEL: define {{[^@]+}}@flat_group_64_64 63; CHECK-SAME: () #[[ATTR3:[0-9]+]] { 64; CHECK-NEXT: ret void 65; 66 ret void 67} 68 69; 128,256 -> 128,128 70define internal void @flat_group_128_256() #3 { 71; CHECK-LABEL: define {{[^@]+}}@flat_group_128_256 72; CHECK-SAME: () #[[ATTR4:[0-9]+]] { 73; CHECK-NEXT: ret void 74; 75 ret void 76} 77 78define internal void @flat_group_512_1024() #4 { 79; CHECK-LABEL: define {{[^@]+}}@flat_group_512_1024 80; CHECK-SAME: () #[[ATTR5:[0-9]+]] { 81; CHECK-NEXT: ret void 82; 83 ret void 84} 85 86define amdgpu_kernel void @kernel_128_512() #5 { 87; CHECK-LABEL: define {{[^@]+}}@kernel_128_512 88; CHECK-SAME: () #[[ATTR2]] { 89; CHECK-NEXT: call void @default_to_128_512() 90; CHECK-NEXT: call void @flat_group_64_64() 91; CHECK-NEXT: ret void 92; 93 call void @default_to_128_512() 94 call void @flat_group_64_64() 95 ret void 96} 97 98define amdgpu_kernel void @kernel_512_512() #6 { 99; CHECK-LABEL: define {{[^@]+}}@kernel_512_512 100; CHECK-SAME: () #[[ATTR5]] { 101; CHECK-NEXT: call void @default_to_128_512() 102; CHECK-NEXT: call void @flat_group_512_1024() 103; CHECK-NEXT: ret void 104; 105 call void @default_to_128_512() 106 call void @flat_group_512_1024() 107 ret void 108} 109 110; Called from kernels with 128,256 and 64,128 => 64,256 111define internal void @default_to_64_256() { 112; CHECK-LABEL: define {{[^@]+}}@default_to_64_256 113; CHECK-SAME: () #[[ATTR6:[0-9]+]] { 114; CHECK-NEXT: ret void 115; 116 ret void 117} 118 119; The kernel's lower bound is higher than the callee's lower bound, so 120; this should probably be illegal. 121define amdgpu_kernel void @kernel_128_256() #3 { 122; CHECK-LABEL: define {{[^@]+}}@kernel_128_256 123; CHECK-SAME: () #[[ATTR7:[0-9]+]] { 124; CHECK-NEXT: call void @default_to_64_256() 125; CHECK-NEXT: ret void 126; 127 call void @default_to_64_256() 128 ret void 129} 130 131; 64,128 -> 64,128 132define internal void @merge_cycle_0() #1 { 133; CHECK-LABEL: define {{[^@]+}}@merge_cycle_0 134; CHECK-SAME: () #[[ATTR1]] { 135; CHECK-NEXT: call void @merge_cycle_1() 136; CHECK-NEXT: ret void 137; 138 call void @merge_cycle_1() 139 ret void 140} 141 142; 128,256 -> 128,128 143define internal void @merge_cycle_1() #3 { 144; CHECK-LABEL: define {{[^@]+}}@merge_cycle_1 145; CHECK-SAME: () #[[ATTR4]] { 146; CHECK-NEXT: call void @merge_cycle_0() 147; CHECK-NEXT: ret void 148; 149 call void @merge_cycle_0() 150 ret void 151} 152 153define amdgpu_kernel void @kernel_64_256() #7 { 154; CHECK-LABEL: define {{[^@]+}}@kernel_64_256 155; CHECK-SAME: () #[[ATTR6]] { 156; CHECK-NEXT: call void @merge_cycle_0() 157; CHECK-NEXT: call void @default_captured_address() 158; CHECK-NEXT: call void @externally_visible_default() 159; CHECK-NEXT: [[F32:%.*]] = call float bitcast (i32 ()* @bitcasted_function to float ()*)() 160; CHECK-NEXT: ret void 161; 162 call void @merge_cycle_0() 163 call void @default_captured_address() 164 call void @externally_visible_default() 165 %f32 = call float bitcast (i32 ()* @bitcasted_function to float ()*)() 166 ret void 167} 168 169define internal void @default_captured_address() { 170; CHECK-LABEL: define {{[^@]+}}@default_captured_address 171; CHECK-SAME: () #[[ATTR8:[0-9]+]] { 172; CHECK-NEXT: store volatile void ()* @default_captured_address, void ()** undef, align 8 173; CHECK-NEXT: ret void 174; 175 store volatile void ()* @default_captured_address, void ()** undef, align 8 176 ret void 177} 178 179define void @externally_visible_default() { 180; CHECK-LABEL: define {{[^@]+}}@externally_visible_default 181; CHECK-SAME: () #[[ATTR8]] { 182; CHECK-NEXT: ret void 183; 184 ret void 185} 186 187; 1,1024 -> 64,256 188define internal i32 @bitcasted_function() { 189; CHECK-LABEL: define {{[^@]+}}@bitcasted_function 190; CHECK-SAME: () #[[ATTR6]] { 191; CHECK-NEXT: ret i32 0 192; 193 ret i32 0 194} 195 196attributes #0 = { "amdgpu-flat-work-group-size"="1,256" } 197attributes #1 = { "amdgpu-flat-work-group-size"="64,128" } 198attributes #2 = { "amdgpu-flat-work-group-size"="64,64" } 199attributes #3 = { "amdgpu-flat-work-group-size"="128,256" } 200attributes #4 = { "amdgpu-flat-work-group-size"="512,1024" } 201attributes #5 = { "amdgpu-flat-work-group-size"="128,512" } 202attributes #6 = { "amdgpu-flat-work-group-size"="512,512" } 203attributes #7 = { "amdgpu-flat-work-group-size"="64,256" } 204;. 205; CHECK: attributes #[[ATTR0]] = { "amdgpu-flat-work-group-size"="1,256" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 206; CHECK: attributes #[[ATTR1]] = { "amdgpu-flat-work-group-size"="64,128" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 207; CHECK: attributes #[[ATTR2]] = { "amdgpu-flat-work-group-size"="128,512" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 208; CHECK: attributes #[[ATTR3]] = { "amdgpu-flat-work-group-size"="64,64" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 209; CHECK: attributes #[[ATTR4]] = { "amdgpu-flat-work-group-size"="128,128" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 210; CHECK: attributes #[[ATTR5]] = { "amdgpu-flat-work-group-size"="512,512" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 211; CHECK: attributes #[[ATTR6]] = { "amdgpu-flat-work-group-size"="64,256" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 212; CHECK: attributes #[[ATTR7]] = { "amdgpu-flat-work-group-size"="128,256" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 213; CHECK: attributes #[[ATTR8]] = { "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" } 214;. 215