221 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals --version 32; RUN: opt -S -mtriple=amdgcn-- -passes=amdgpu-attributor,amdgpu-lower-module-lds < %s --amdgpu-lower-module-lds-strategy=table | FileCheck -check-prefixes=CHECK,TABLE %s3 4; FIXME: Work around update_test_checks bug in constant expression handling by manually deleting part of the last global pattern5 6@function.lds = addrspace(3) global i16 poison7@other.kernel.lds = addrspace(3) global i16 poison8@recursive.kernel.lds = addrspace(3) global i16 poison9 10;.11; CHECK: @llvm.amdgcn.kernel.k0_f0.lds = internal addrspace(3) global %llvm.amdgcn.kernel.k0_f0.lds.t poison, align 2, !absolute_symbol [[META0:![0-9]+]]12; CHECK: @llvm.amdgcn.kernel.k1_f0.lds = internal addrspace(3) global %llvm.amdgcn.kernel.k1_f0.lds.t poison, align 2, !absolute_symbol [[META0]]13; CHECK: @llvm.amdgcn.kernel.kernel_lds.lds = internal addrspace(3) global %llvm.amdgcn.kernel.kernel_lds.lds.t poison, align 2, !absolute_symbol [[META0]]14; CHECK: @llvm.amdgcn.kernel.kernel_lds_recursion.lds = internal addrspace(3) global %llvm.amdgcn.kernel.kernel_lds_recursion.lds.t poison, align 2, !absolute_symbol [[META0]]15; CHECK: @llvm.amdgcn.lds.offset.table = internal addrspace(4) constant [3 x [2 x i32]]16;.17define internal void @lds_use_through_indirect() {18; CHECK-LABEL: define internal void @lds_use_through_indirect(19; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {20; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.amdgcn.lds.kernel.id()21; CHECK-NEXT: [[FUNCTION_LDS2:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 022; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(4) [[FUNCTION_LDS2]], align 423; CHECK-NEXT: [[FUNCTION_LDS3:%.*]] = inttoptr i32 [[TMP2]] to ptr addrspace(3)24; CHECK-NEXT: [[LD:%.*]] = load i16, ptr addrspace(3) [[FUNCTION_LDS3]], align 225; CHECK-NEXT: [[MUL:%.*]] = mul i16 [[LD]], 726; CHECK-NEXT: [[FUNCTION_LDS:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 027; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(4) [[FUNCTION_LDS]], align 428; CHECK-NEXT: [[FUNCTION_LDS1:%.*]] = inttoptr i32 [[TMP3]] to ptr addrspace(3)29; CHECK-NEXT: store i16 [[MUL]], ptr addrspace(3) [[FUNCTION_LDS1]], align 230; CHECK-NEXT: ret void31;32 %ld = load i16, ptr addrspace(3) @function.lds33 %mul = mul i16 %ld, 734 store i16 %mul, ptr addrspace(3) @function.lds35 ret void36}37 38define internal void @indirectly_called() {39; CHECK-LABEL: define internal void @indirectly_called(40; CHECK-SAME: ) #[[ATTR0]] {41; CHECK-NEXT: store volatile ptr @indirectly_called, ptr addrspace(1) null, align 842; CHECK-NEXT: call void @lds_use_through_indirect()43; CHECK-NEXT: ret void44;45 store volatile ptr @indirectly_called, ptr addrspace(1) null46 call void @lds_use_through_indirect()47 ret void48}49 50define internal void @calls_indirectly_called() {51; CHECK-LABEL: define internal void @calls_indirectly_called(52; CHECK-SAME: ) #[[ATTR0]] {53; CHECK-NEXT: call void @indirectly_called()54; CHECK-NEXT: ret void55;56 call void @indirectly_called()57 ret void58}59 60; TODO: Should still have "amdgpu-no-lds-kernel-id" attached61define internal void @no_lds_global_use_leaf() {62; CHECK-LABEL: define internal void @no_lds_global_use_leaf(63; CHECK-SAME: ) #[[ATTR1:[0-9]+]] {64; CHECK-NEXT: ret void65;66 ret void67}68 69; Should have "amdgpu-no-lds-kernel-id" stripped70define internal void @f0() {71; CHECK-LABEL: define internal void @f0(72; CHECK-SAME: ) #[[ATTR0]] {73; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.amdgcn.lds.kernel.id()74; CHECK-NEXT: [[FUNCTION_LDS2:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 075; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(4) [[FUNCTION_LDS2]], align 476; CHECK-NEXT: [[FUNCTION_LDS3:%.*]] = inttoptr i32 [[TMP2]] to ptr addrspace(3)77; CHECK-NEXT: [[LD:%.*]] = load i16, ptr addrspace(3) [[FUNCTION_LDS3]], align 278; CHECK-NEXT: [[MUL:%.*]] = mul i16 [[LD]], 479; CHECK-NEXT: [[FUNCTION_LDS:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 080; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(4) [[FUNCTION_LDS]], align 481; CHECK-NEXT: [[FUNCTION_LDS1:%.*]] = inttoptr i32 [[TMP3]] to ptr addrspace(3)82; CHECK-NEXT: store i16 [[MUL]], ptr addrspace(3) [[FUNCTION_LDS1]], align 283; CHECK-NEXT: call void @no_lds_global_use_leaf()84; CHECK-NEXT: ret void85;86 %ld = load i16, ptr addrspace(3) @function.lds87 %mul = mul i16 %ld, 488 store i16 %mul, ptr addrspace(3) @function.lds89 call void @no_lds_global_use_leaf()90 ret void91}92 93; Should have "amdgpu-no-lds-kernel-id" stripped94define internal void @f0_transitive() {95; CHECK-LABEL: define internal void @f0_transitive(96; CHECK-SAME: ) #[[ATTR0]] {97; CHECK-NEXT: call void @f0()98; CHECK-NEXT: call void @no_lds_global_use_leaf()99; CHECK-NEXT: ret void100;101 call void @f0()102 call void @no_lds_global_use_leaf()103 ret void104}105 106define amdgpu_kernel void @k0_f0() {107; CHECK-LABEL: define amdgpu_kernel void @k0_f0(108; CHECK-SAME: ) #[[ATTR2:[0-9]+]] !llvm.amdgcn.lds.kernel.id [[META2:![0-9]+]] {109; CHECK-NEXT: call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.kernel.k0_f0.lds) ]110; CHECK-NEXT: call void @f0_transitive()111; CHECK-NEXT: ret void112;113 call void @f0_transitive()114 ret void115}116 117define amdgpu_kernel void @k1_f0() {118; CHECK-LABEL: define amdgpu_kernel void @k1_f0(119; CHECK-SAME: ) #[[ATTR3:[0-9]+]] !llvm.amdgcn.lds.kernel.id [[META3:![0-9]+]] {120; CHECK-NEXT: call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.kernel.k1_f0.lds) ], !alias.scope [[META4:![0-9]+]], !noalias [[META7:![0-9]+]]121; CHECK-NEXT: call void @f0_transitive()122; CHECK-NEXT: [[FPTR:%.*]] = load volatile ptr, ptr addrspace(1) null, align 8123; CHECK-NEXT: call void [[FPTR]]()124; CHECK-NEXT: call void @calls_indirectly_called()125; CHECK-NEXT: ret void126;127 call void @f0_transitive()128 %fptr = load volatile ptr, ptr addrspace(1) null129 call void %fptr()130 call void @calls_indirectly_called()131 ret void132}133 134; Should still have "amdgpu-no-lds-kernel-id" attached135define amdgpu_kernel void @kernel_lds() {136; CHECK-LABEL: define amdgpu_kernel void @kernel_lds(137; CHECK-SAME: ) #[[ATTR4:[0-9]+]] {138; CHECK-NEXT: [[LD:%.*]] = load i16, ptr addrspace(3) @llvm.amdgcn.kernel.kernel_lds.lds, align 2139; CHECK-NEXT: [[MUL:%.*]] = mul i16 [[LD]], 42140; CHECK-NEXT: store i16 [[MUL]], ptr addrspace(3) @llvm.amdgcn.kernel.kernel_lds.lds, align 2141; CHECK-NEXT: ret void142;143 %ld = load i16, ptr addrspace(3) @other.kernel.lds144 %mul = mul i16 %ld, 42145 store i16 %mul, ptr addrspace(3) @other.kernel.lds146 ret void147}148 149define internal i16 @mutual_recursion_0(i16 %arg) {150; CHECK-LABEL: define internal i16 @mutual_recursion_0(151; CHECK-SAME: i16 [[ARG:%.*]]) #[[ATTR0]] {152; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.amdgcn.lds.kernel.id()153; CHECK-NEXT: [[RECURSIVE_KERNEL_LDS:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 1154; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(4) [[RECURSIVE_KERNEL_LDS]], align 4155; CHECK-NEXT: [[RECURSIVE_KERNEL_LDS1:%.*]] = inttoptr i32 [[TMP2]] to ptr addrspace(3)156; CHECK-NEXT: [[LD:%.*]] = load i16, ptr addrspace(3) [[RECURSIVE_KERNEL_LDS1]], align 2157; CHECK-NEXT: [[MUL:%.*]] = mul i16 [[LD]], 7158; CHECK-NEXT: [[RET:%.*]] = call i16 @mutual_recursion_1(i16 [[LD]])159; CHECK-NEXT: [[ADD:%.*]] = add i16 [[RET]], 1160; CHECK-NEXT: ret i16 [[ADD]]161;162 %ld = load i16, ptr addrspace(3) @recursive.kernel.lds163 %mul = mul i16 %ld, 7164 %ret = call i16 @mutual_recursion_1(i16 %ld)165 %add = add i16 %ret, 1166 ret i16 %add167}168 169define internal void @mutual_recursion_1(i16 %arg) {170; CHECK-LABEL: define internal void @mutual_recursion_1(171; CHECK-SAME: i16 [[ARG:%.*]]) #[[ATTR0]] {172; CHECK-NEXT: call void @mutual_recursion_0(i16 [[ARG]])173; CHECK-NEXT: ret void174;175 call void @mutual_recursion_0(i16 %arg)176 ret void177}178 179define amdgpu_kernel void @kernel_lds_recursion() {180; CHECK-LABEL: define amdgpu_kernel void @kernel_lds_recursion(181; CHECK-SAME: ) #[[ATTR5:[0-9]+]] !llvm.amdgcn.lds.kernel.id [[META9:![0-9]+]] {182; CHECK-NEXT: call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.kernel.kernel_lds_recursion.lds) ], !alias.scope [[META10:![0-9]+]], !noalias [[META13:![0-9]+]]183; CHECK-NEXT: call void @mutual_recursion_0(i16 0)184; CHECK-NEXT: ret void185;186 call void @mutual_recursion_0(i16 0)187 ret void188}189 190!llvm.module.flags = !{!1}191!1 = !{i32 1, !"amdhsa_code_object_version", i32 400}192 193;.194; CHECK: attributes #[[ATTR0]] = { "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-multigrid-sync-arg" "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" }195; CHECK: attributes #[[ATTR1]] = { "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "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" }196; CHECK: attributes #[[ATTR2]] = { "amdgpu-lds-size"="2" "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-multigrid-sync-arg" "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" }197; CHECK: attributes #[[ATTR3]] = { "amdgpu-lds-size"="4" "uniform-work-group-size"="false" }198; CHECK: attributes #[[ATTR4]] = { "amdgpu-lds-size"="2" "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "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" }199; CHECK: attributes #[[ATTR5]] = { "amdgpu-lds-size"="4" "amdgpu-no-cluster-id-x" "amdgpu-no-cluster-id-y" "amdgpu-no-cluster-id-z" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-flat-scratch-init" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-multigrid-sync-arg" "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" }200; CHECK: attributes #[[ATTR6:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(none) }201; CHECK: attributes #[[ATTR7:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }202;.203; CHECK: [[META0]] = !{i32 0, i32 1}204; CHECK: [[META1:![0-9]+]] = !{i32 1, !"amdhsa_code_object_version", i32 400}205; CHECK: [[META2]] = !{i32 0}206; CHECK: [[META3]] = !{i32 1}207; CHECK: [[META4]] = !{[[META5:![0-9]+]]}208; CHECK: [[META5]] = distinct !{[[META5]], [[META6:![0-9]+]]}209; CHECK: [[META6]] = distinct !{[[META6]]}210; CHECK: [[META7]] = !{[[META8:![0-9]+]]}211; CHECK: [[META8]] = distinct !{[[META8]], [[META6]]}212; CHECK: [[META9]] = !{i32 2}213; CHECK: [[META10]] = !{[[META11:![0-9]+]]}214; CHECK: [[META11]] = distinct !{[[META11]], [[META12:![0-9]+]]}215; CHECK: [[META12]] = distinct !{[[META12]]}216; CHECK: [[META13]] = !{[[META14:![0-9]+]]}217; CHECK: [[META14]] = distinct !{[[META14]], [[META12]]}218;.219;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:220; TABLE: {{.*}}221