494 lines
25 KiB
LLVM
494 lines
25 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart
|
|
; RUN: opt -mtriple=amdgcn-amd-amdhsa -S -passes=amdgpu-lower-kernel-attributes,instcombine,infer-alignment %s | FileCheck -check-prefix=GCN %s
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_local_size_x(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_local_size_x(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_LOCAL_SIZE:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 12
|
|
; GCN-NEXT: [[LOCAL_SIZE:%.*]] = load i16, ptr addrspace(4) [[GEP_LOCAL_SIZE]], align 4
|
|
; GCN-NEXT: store i16 [[LOCAL_SIZE]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%group.id = tail call i32 @llvm.amdgcn.workgroup.id.x()
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%block.count.x = load i32, ptr addrspace(4) %implicitarg.ptr, align 4
|
|
%cmp.id.count = icmp ult i32 %group.id, %block.count.x
|
|
%local.size.offset = select i1 %cmp.id.count, i64 12, i64 18
|
|
%gep.local.size = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 %local.size.offset
|
|
%local.size = load i16, ptr addrspace(4) %gep.local.size, align 2
|
|
store i16 %local.size, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_local_size_y(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_local_size_y(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_LOCAL_SIZE:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 14
|
|
; GCN-NEXT: [[LOCAL_SIZE:%.*]] = load i16, ptr addrspace(4) [[GEP_LOCAL_SIZE]], align 2
|
|
; GCN-NEXT: store i16 [[LOCAL_SIZE]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%group.id = tail call i32 @llvm.amdgcn.workgroup.id.y()
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.block.count.y = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 4
|
|
%block.count.y = load i32, ptr addrspace(4) %gep.block.count.y, align 4
|
|
%cmp.id.count = icmp ult i32 %group.id, %block.count.y
|
|
%local.size.offset = select i1 %cmp.id.count, i64 14, i64 20
|
|
%gep.local.size = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 %local.size.offset
|
|
%local.size = load i16, ptr addrspace(4) %gep.local.size, align 2
|
|
store i16 %local.size, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_local_size_z(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_local_size_z(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_LOCAL_SIZE:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 16
|
|
; GCN-NEXT: [[LOCAL_SIZE:%.*]] = load i16, ptr addrspace(4) [[GEP_LOCAL_SIZE]], align 4
|
|
; GCN-NEXT: store i16 [[LOCAL_SIZE]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%group.id = tail call i32 @llvm.amdgcn.workgroup.id.z()
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.block.count.z = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 8
|
|
%block.count.z = load i32, ptr addrspace(4) %gep.block.count.z, align 4
|
|
%cmp.id.count = icmp ult i32 %group.id, %block.count.z
|
|
%local.size.offset = select i1 %cmp.id.count, i64 16, i64 22
|
|
%gep.local.size = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 %local.size.offset
|
|
%local.size = load i16, ptr addrspace(4) %gep.local.size, align 2
|
|
store i16 %local.size, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_x(ptr addrspace(1) %out) #2 {
|
|
; GCN-LABEL: @get_remainder_x(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_X:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 18
|
|
; GCN-NEXT: [[REMAINDER_X:%.*]] = load i16, ptr addrspace(4) [[GEP_X]], align 2, !range [[RNG1:![0-9]+]]
|
|
; GCN-NEXT: store i16 [[REMAINDER_X]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.x = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 18
|
|
%remainder.x = load i16, ptr addrspace(4) %gep.x, align 2
|
|
store i16 %remainder.x, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_y(ptr addrspace(1) %out) #2 {
|
|
; GCN-LABEL: @get_remainder_y(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_Y:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 20
|
|
; GCN-NEXT: [[REMAINDER_Y:%.*]] = load i16, ptr addrspace(4) [[GEP_Y]], align 4, !range [[RNG1]]
|
|
; GCN-NEXT: store i16 [[REMAINDER_Y]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.y = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 20
|
|
%remainder.y = load i16, ptr addrspace(4) %gep.y, align 2
|
|
store i16 %remainder.y, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_z(ptr addrspace(1) %out) #2 {
|
|
; GCN-LABEL: @get_remainder_z(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_Z:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 22
|
|
; GCN-NEXT: [[REMAINDER_Z:%.*]] = load i16, ptr addrspace(4) [[GEP_Z]], align 2, !range [[RNG1]]
|
|
; GCN-NEXT: store i16 [[REMAINDER_Z]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.z = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 22
|
|
%remainder.z = load i16, ptr addrspace(4) %gep.z, align 2
|
|
store i16 %remainder.z, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_x_uniform(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_remainder_x_uniform(
|
|
; GCN-NEXT: store i16 0, ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.x = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 18
|
|
%remainder.x = load i16, ptr addrspace(4) %gep.x, align 2
|
|
store i16 %remainder.x, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_y_uniform(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_remainder_y_uniform(
|
|
; GCN-NEXT: store i16 0, ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.y = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 20
|
|
%remainder.y = load i16, ptr addrspace(4) %gep.y, align 2
|
|
store i16 %remainder.y, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_z_uniform(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_remainder_z_uniform(
|
|
; GCN-NEXT: store i16 0, ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.z = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 22
|
|
%remainder.z = load i16, ptr addrspace(4) %gep.z, align 2
|
|
store i16 %remainder.z, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_work_group_size_x(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_work_group_size_x(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_X:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 12
|
|
; GCN-NEXT: [[GROUP_SIZE_X:%.*]] = load i16, ptr addrspace(4) [[GEP_X]], align 4, !range [[RNG2:![0-9]+]]
|
|
; GCN-NEXT: store i16 [[GROUP_SIZE_X]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.x = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 12
|
|
%group.size.x = load i16, ptr addrspace(4) %gep.x, align 2
|
|
store i16 %group.size.x, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_work_group_size_y(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_work_group_size_y(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_Y:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 14
|
|
; GCN-NEXT: [[GROUP_SIZE_Y:%.*]] = load i16, ptr addrspace(4) [[GEP_Y]], align 2, !range [[RNG2]]
|
|
; GCN-NEXT: store i16 [[GROUP_SIZE_Y]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.y = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 14
|
|
%group.size.y = load i16, ptr addrspace(4) %gep.y, align 2
|
|
store i16 %group.size.y, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_work_group_size_z(ptr addrspace(1) %out) #0 {
|
|
; GCN-LABEL: @get_work_group_size_z(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_Z:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 16
|
|
; GCN-NEXT: [[GROUP_SIZE_Z:%.*]] = load i16, ptr addrspace(4) [[GEP_Z]], align 4, !range [[RNG2]]
|
|
; GCN-NEXT: store i16 [[GROUP_SIZE_Z]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.z = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 16
|
|
%group.size.z = load i16, ptr addrspace(4) %gep.z, align 2
|
|
store i16 %group.size.z, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_work_group_size_x_reqd(ptr addrspace(1) %out) #0 !reqd_work_group_size !0 {
|
|
; GCN-LABEL: @get_work_group_size_x_reqd(
|
|
; GCN-NEXT: store i16 8, ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.x = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 12
|
|
%group.size.x = load i16, ptr addrspace(4) %gep.x, align 2
|
|
store i16 %group.size.x, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_work_group_size_y_reqd(ptr addrspace(1) %out) #0 !reqd_work_group_size !0 {
|
|
; GCN-LABEL: @get_work_group_size_y_reqd(
|
|
; GCN-NEXT: store i16 16, ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.y = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 14
|
|
%group.size.y = load i16, ptr addrspace(4) %gep.y, align 2
|
|
store i16 %group.size.y, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
|
|
define amdgpu_kernel void @get_work_group_size_z_reqd(ptr addrspace(1) %out) #0 !reqd_work_group_size !0 {
|
|
; GCN-LABEL: @get_work_group_size_z_reqd(
|
|
; GCN-NEXT: store i16 2, ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.z = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 16
|
|
%group.size.z = load i16, ptr addrspace(4) %gep.z, align 2
|
|
store i16 %group.size.z, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_x_wrong_type(ptr addrspace(1) %out) #2 {
|
|
; GCN-LABEL: @get_remainder_x_wrong_type(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_X:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 18
|
|
; GCN-NEXT: [[REMAINDER_X:%.*]] = load half, ptr addrspace(4) [[GEP_X]], align 2
|
|
; GCN-NEXT: store half [[REMAINDER_X]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.x = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 18
|
|
%remainder.x = load half, ptr addrspace(4) %gep.x, align 2
|
|
store half %remainder.x, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_y_wrong_type(ptr addrspace(1) %out) #2 {
|
|
; GCN-LABEL: @get_remainder_y_wrong_type(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_X:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 20
|
|
; GCN-NEXT: [[REMAINDER_X:%.*]] = load half, ptr addrspace(4) [[GEP_X]], align 4
|
|
; GCN-NEXT: store half [[REMAINDER_X]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.x = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 20
|
|
%remainder.x = load half, ptr addrspace(4) %gep.x, align 2
|
|
store half %remainder.x, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_z_wrong_type(ptr addrspace(1) %out) #2 {
|
|
; GCN-LABEL: @get_remainder_z_wrong_type(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_X:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 22
|
|
; GCN-NEXT: [[REMAINDER_X:%.*]] = load half, ptr addrspace(4) [[GEP_X]], align 2
|
|
; GCN-NEXT: store half [[REMAINDER_X]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.x = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 22
|
|
%remainder.x = load half, ptr addrspace(4) %gep.x, align 2
|
|
store half %remainder.x, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_kernel void @get_remainder_x_existing_range(ptr addrspace(1) %out) #2 {
|
|
; GCN-LABEL: @get_remainder_x_existing_range(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_X:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 18
|
|
; GCN-NEXT: [[REMAINDER_X:%.*]] = load i16, ptr addrspace(4) [[GEP_X]], align 2, !range [[RNG4:![0-9]+]]
|
|
; GCN-NEXT: store i16 [[REMAINDER_X]], ptr addrspace(1) [[OUT:%.*]], align 2
|
|
; GCN-NEXT: ret void
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.x = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 18
|
|
%remainder.x = load i16, ptr addrspace(4) %gep.x, align 2, !range !{i16 0, i16 10}
|
|
store i16 %remainder.x, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define i16 @get_grid_dims_i16() #2 {
|
|
; GCN-LABEL: @get_grid_dims_i16(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load i16, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4, !range [[RNG5:![0-9]+]]
|
|
; GCN-NEXT: ret i16 [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i16, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret i16 %grid.dims
|
|
}
|
|
|
|
; Ignore wrong type
|
|
define half @get_grid_dims_f16() #2 {
|
|
; GCN-half: @get_grid_dims_i16(
|
|
; GCN-LABEL: @get_grid_dims_f16(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load half, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4
|
|
; GCN-NEXT: ret half [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load half, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret half %grid.dims
|
|
}
|
|
|
|
; Undersized, OK
|
|
define i8 @get_grid_dims_i8() #2 {
|
|
; GCN-LABEL: @get_grid_dims_i8(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load i8, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4, !range [[RNG6:![0-9]+]]
|
|
; GCN-NEXT: ret i8 [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i8, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret i8 %grid.dims
|
|
}
|
|
|
|
define i1 @get_grid_dims_i1() #2 {
|
|
; GCN-LABEL: @get_grid_dims_i1(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load i1, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4
|
|
; GCN-NEXT: ret i1 [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i1, ptr addrspace(4) %gep.grid.dims, align 1
|
|
ret i1 %grid.dims
|
|
}
|
|
|
|
; Undersized, theoretically ok but would require special case
|
|
; construction of the wrapped range.
|
|
define i2 @get_grid_dims_i2() #2 {
|
|
; GCN-LABEL: @get_grid_dims_i2(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load i2, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4
|
|
; GCN-NEXT: ret i2 [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i2, ptr addrspace(4) %gep.grid.dims, align 1
|
|
ret i2 %grid.dims
|
|
}
|
|
|
|
define i3 @get_grid_dims_i3() #2 {
|
|
; GCN-LABEL: @get_grid_dims_i3(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load i3, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4, !range [[RNG7:![0-9]+]]
|
|
; GCN-NEXT: ret i3 [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i3, ptr addrspace(4) %gep.grid.dims, align 1
|
|
ret i3 %grid.dims
|
|
}
|
|
|
|
; Oversized, ignore
|
|
define i32 @get_grid_dims_i32() #2 {
|
|
; GCN-LABEL: @get_grid_dims_i32(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load i32, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4
|
|
; GCN-NEXT: ret i32 [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i32, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret i32 %grid.dims
|
|
}
|
|
|
|
define i16 @get_grid_dims_reqd_work_group_size_1d() #2 !reqd_work_group_size !2 {
|
|
; GCN-LABEL: @get_grid_dims_reqd_work_group_size_1d(
|
|
; GCN-NEXT: ret i16 1
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i16, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret i16 %grid.dims
|
|
}
|
|
|
|
define i16 @get_grid_dims_reqd_work_group_size_2d() #2 !reqd_work_group_size !3 {
|
|
; GCN-LABEL: @get_grid_dims_reqd_work_group_size_2d(
|
|
; GCN-NEXT: ret i16 2
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i16, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret i16 %grid.dims
|
|
}
|
|
|
|
define i16 @get_grid_dims_reqd_work_group_size_2d_weird() #2 !reqd_work_group_size !5 {
|
|
; GCN-LABEL: @get_grid_dims_reqd_work_group_size_2d_weird(
|
|
; GCN-NEXT: ret i16 2
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i16, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret i16 %grid.dims
|
|
}
|
|
|
|
define i16 @get_grid_dims_reqd_work_group_size_3d() #2 !reqd_work_group_size !0 {
|
|
; GCN-LABEL: @get_grid_dims_reqd_work_group_size_3d(
|
|
; GCN-NEXT: ret i16 3
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i16, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret i16 %grid.dims
|
|
}
|
|
|
|
define i16 @get_grid_dims_reqd_work_group_size_3d_weird() #2 !reqd_work_group_size !4 {
|
|
; GCN-LABEL: @get_grid_dims_reqd_work_group_size_3d_weird(
|
|
; GCN-NEXT: ret i16 3
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i16, ptr addrspace(4) %gep.grid.dims, align 2
|
|
ret i16 %grid.dims
|
|
}
|
|
|
|
define i1 @get_grid_dims_i1_reqd_work_group_size() #2 !reqd_work_group_size !3 {
|
|
; GCN-LABEL: @get_grid_dims_i1_reqd_work_group_size(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load i1, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4
|
|
; GCN-NEXT: ret i1 [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i1, ptr addrspace(4) %gep.grid.dims, align 1
|
|
ret i1 %grid.dims
|
|
}
|
|
|
|
define i16 @get_grid_dims_existing_range() #2 {
|
|
; GCN-LABEL: @get_grid_dims_existing_range(
|
|
; GCN-NEXT: [[IMPLICITARG_PTR:%.*]] = tail call dereferenceable(256) ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
; GCN-NEXT: [[GEP_GRID_DIMS:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(4) [[IMPLICITARG_PTR]], i64 64
|
|
; GCN-NEXT: [[GRID_DIMS:%.*]] = load i16, ptr addrspace(4) [[GEP_GRID_DIMS]], align 4, !range [[RNG12:![0-9]+]]
|
|
; GCN-NEXT: ret i16 [[GRID_DIMS]]
|
|
;
|
|
%implicitarg.ptr = tail call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr()
|
|
%gep.grid.dims = getelementptr inbounds i8, ptr addrspace(4) %implicitarg.ptr, i64 64
|
|
%grid.dims = load i16, ptr addrspace(4) %gep.grid.dims, align 2, !range !{i16 1, i16 2}
|
|
ret i16 %grid.dims
|
|
}
|
|
|
|
declare ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr() #1
|
|
declare i32 @llvm.amdgcn.workgroup.id.x() #1
|
|
declare i32 @llvm.amdgcn.workgroup.id.y() #1
|
|
declare i32 @llvm.amdgcn.workgroup.id.z() #1
|
|
|
|
!llvm.module.flags = !{!1}
|
|
|
|
attributes #0 = { nounwind "uniform-work-group-size" }
|
|
attributes #1 = { nounwind readnone speculatable }
|
|
attributes #2 = { nounwind }
|
|
!0 = !{i32 8, i32 16, i32 2}
|
|
!1 = !{i32 1, !"amdhsa_code_object_version", i32 500}
|
|
|
|
!2 = !{i32 64, i32 1, i32 1}
|
|
!3 = !{i32 32, i32 4, i32 1}
|
|
!4 = !{i32 32, i32 1, i32 2}
|
|
!5 = !{i32 1, i32 32, i32 1}
|
|
|
|
;.
|
|
; GCN: [[RNG1]] = !{i16 0, i16 1024}
|
|
; GCN: [[RNG2]] = !{i16 1, i16 1025}
|
|
; GCN: [[RNG4]] = !{i16 0, i16 10}
|
|
; GCN: [[RNG5]] = !{i16 1, i16 4}
|
|
; GCN: [[RNG6]] = !{i8 1, i8 4}
|
|
; GCN: [[RNG7]] = !{i3 1, i3 -4}
|
|
; GCN: [[RNG12]] = !{i16 1, i16 2}
|
|
;.
|