CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
126 lines
6.5 KiB
LLVM
126 lines
6.5 KiB
LLVM
; RUN: not llvm-as %s -disable-output 2>&1 | FileCheck %s
|
|
|
|
declare void @llvm.amdgcn.cs.chain(ptr, i32, <4 x i32>, { ptr, <3 x i32> }, i32, ...) noreturn
|
|
declare i32 @llvm.amdgcn.set.inactive.chain.arg(i32, i32) convergent willreturn nofree nocallback readnone
|
|
|
|
define amdgpu_cs_chain void @bad_flags(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr, i32 %flags) {
|
|
; CHECK: immarg operand has non-immediate parameter
|
|
; CHECK-NEXT: i32 %flags
|
|
; CHECK-NEXT: @llvm.amdgcn.cs.chain
|
|
call void(ptr, i32, <4 x i32>, { ptr, <3 x i32> }, i32, ...) @llvm.amdgcn.cs.chain(ptr %fn, i32 %exec, <4 x i32> %sgpr, { ptr, <3 x i32> } %vgpr, i32 %flags)
|
|
unreachable
|
|
}
|
|
|
|
define amdgpu_cs_chain void @bad_vgpr_args(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } inreg %vgpr) {
|
|
; CHECK: VGPR arguments must not have the `inreg` attribute
|
|
; CHECK-NEXT: @llvm.amdgcn.cs.chain
|
|
call void(ptr, i32, <4 x i32>, { ptr, <3 x i32> }, i32, ...) @llvm.amdgcn.cs.chain(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } inreg %vgpr, i32 0)
|
|
unreachable
|
|
}
|
|
|
|
define amdgpu_cs_chain void @bad_sgpr_args(ptr %fn, i32 %exec, <4 x i32> %sgpr, { ptr, <3 x i32> } %vgpr) {
|
|
; CHECK: SGPR arguments must have the `inreg` attribute
|
|
; CHECK-NEXT: @llvm.amdgcn.cs.chain
|
|
call void(ptr, i32, <4 x i32>, { ptr, <3 x i32> }, i32, ...) @llvm.amdgcn.cs.chain(ptr %fn, i32 %exec, <4 x i32> %sgpr, { ptr, <3 x i32> } %vgpr, i32 0)
|
|
unreachable
|
|
}
|
|
|
|
define amdgpu_cs_chain void @bad_exec(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr, i32 %flags) {
|
|
; CHECK: Intrinsic called with incompatible signature
|
|
; CHECK-NEXT: @llvm.amdgcn.cs.chain
|
|
call void(ptr, <4 x i32>, <4 x i32>, { ptr, <3 x i32> }, i32, ...) @llvm.amdgcn.cs.chain(ptr %fn, <4 x i32> %sgpr, <4 x i32> %sgpr, { ptr, <3 x i32> } %vgpr, i32 %flags)
|
|
unreachable
|
|
}
|
|
|
|
define amdgpu_cs_chain void @not_unreachable(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr) {
|
|
; CHECK: llvm.amdgcn.cs.chain must be followed by unreachable
|
|
; CHECK-NEXT: @llvm.amdgcn.cs.chain
|
|
call void(ptr, i32, <4 x i32>, { ptr, <3 x i32> }, i32, ...) @llvm.amdgcn.cs.chain(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr, i32 0)
|
|
ret void
|
|
}
|
|
|
|
define void @bad_caller_default_cc(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr) {
|
|
; CHECK: Intrinsic can only be used from functions with the amdgpu_cs_chain or amdgpu_cs_chain_preserve calling conventions
|
|
; CHECK-NEXT: @llvm.amdgcn.set.inactive.chain.arg
|
|
%unused = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 0, i32 1)
|
|
|
|
; CHECK: Intrinsic cannot be called from functions with this calling convention
|
|
; CHECK-NEXT: @llvm.amdgcn.cs.chain
|
|
call void(ptr, i32, <4 x i32>, { ptr, <3 x i32> }, i32, ...) @llvm.amdgcn.cs.chain(ptr %fn, i32 %exec, <4 x i32> %sgpr, { ptr, <3 x i32> } %vgpr, i32 0)
|
|
unreachable
|
|
}
|
|
|
|
define amdgpu_kernel void @bad_caller_amdgpu_kernel(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr) {
|
|
; CHECK: Intrinsic can only be used from functions with the amdgpu_cs_chain or amdgpu_cs_chain_preserve calling conventions
|
|
; CHECK-NEXT: @llvm.amdgcn.set.inactive.chain.arg
|
|
%unused = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 0, i32 1)
|
|
|
|
; CHECK: Intrinsic cannot be called from functions with this calling convention
|
|
; CHECK-NEXT: @llvm.amdgcn.cs.chain
|
|
call void(ptr, i32, <4 x i32>, { ptr, <3 x i32> }, i32, ...) @llvm.amdgcn.cs.chain(ptr %fn, i32 %exec, <4 x i32> %sgpr, { ptr, <3 x i32> } %vgpr, i32 0)
|
|
unreachable
|
|
}
|
|
|
|
define amdgpu_gfx void @bad_caller_amdgpu_gfx(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr) {
|
|
; CHECK: Intrinsic can only be used from functions with the amdgpu_cs_chain or amdgpu_cs_chain_preserve calling conventions
|
|
; CHECK-NEXT: @llvm.amdgcn.set.inactive.chain.arg
|
|
%unused = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 0, i32 1)
|
|
|
|
; CHECK: Intrinsic cannot be called from functions with this calling convention
|
|
; CHECK-NEXT: @llvm.amdgcn.cs.chain
|
|
call void(ptr, i32, <4 x i32>, { ptr, <3 x i32> }, i32, ...) @llvm.amdgcn.cs.chain(ptr %fn, i32 %exec, <4 x i32> %sgpr, { ptr, <3 x i32> } %vgpr, i32 0)
|
|
unreachable
|
|
}
|
|
|
|
define amdgpu_vs void @bad_caller_amdgpu_vs(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr) {
|
|
; CHECK: Intrinsic can only be used from functions with the amdgpu_cs_chain or amdgpu_cs_chain_preserve calling conventions
|
|
; CHECK-NEXT: @llvm.amdgcn.set.inactive.chain.arg
|
|
%unused = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 0, i32 1)
|
|
|
|
; Unlike llvm.amdgcn.set.inactive.chain.arg, llvm.amdgcn.cs.chain may be called from amdgpu_vs functions.
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_cs void @bad_caller_amdgpu_cs(ptr %fn, i32 %exec, <4 x i32> inreg %sgpr, { ptr, <3 x i32> } %vgpr) {
|
|
; CHECK: Intrinsic can only be used from functions with the amdgpu_cs_chain or amdgpu_cs_chain_preserve calling conventions
|
|
; CHECK-NEXT: @llvm.amdgcn.set.inactive.chain.arg
|
|
%unused = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 0, i32 1)
|
|
|
|
; Unlike llvm.amdgcn.set.inactive.chain.arg, llvm.amdgcn.cs.chain may be called from amdgpu_cs functions.
|
|
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_cs_chain void @set_inactive_chain_arg_sgpr(ptr addrspace(1) %out, i32 %active, i32 inreg %inactive) {
|
|
; CHECK: Value for inactive lanes must be a VGPR function argument
|
|
; CHECK-NEXT: @llvm.amdgcn.set.inactive.chain.arg
|
|
%tmp = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 %active, i32 %inactive) #0
|
|
store i32 %tmp, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_cs_chain void @set_inactive_chain_arg_const(ptr addrspace(1) %out, i32 %active) {
|
|
; CHECK: Value for inactive lanes must be a function argument
|
|
; CHECK-NEXT: llvm.amdgcn.set.inactive.chain.arg
|
|
%tmp = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 %active, i32 29) #0
|
|
store i32 %tmp, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_cs_chain void @set_inactive_chain_arg_computed(ptr addrspace(1) %out, i32 %active) {
|
|
; CHECK: Value for inactive lanes must be a function argument
|
|
; CHECK-NEXT: @llvm.amdgcn.set.inactive.chain.arg
|
|
%inactive = add i32 %active, 127
|
|
%tmp = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 %active, i32 %inactive) #0
|
|
store i32 %tmp, ptr addrspace(1) %out
|
|
ret void
|
|
}
|
|
|
|
define amdgpu_cs_chain void @set_inactive_chain_arg_inreg(ptr addrspace(1) %out, i32 %active, i32 %inactive) {
|
|
; CHECK: Value for inactive lanes must not have the `inreg` attribute
|
|
; CHECK-NEXT: @llvm.amdgcn.set.inactive.chain.arg
|
|
%tmp = call i32 @llvm.amdgcn.set.inactive.chain.arg(i32 %active, i32 inreg %inactive) #0
|
|
store i32 %tmp, ptr addrspace(1) %out
|
|
ret void
|
|
}
|