diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 8432779c107de..a19de550d092a 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -6369,6 +6369,14 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { "VGPR arguments must not have the `inreg` attribute", &Call); break; } + case Intrinsic::amdgcn_init_exec_from_input: { + const Argument *Arg = dyn_cast(Call.getOperand(0)); + Check(Arg && Arg->hasInRegAttr(), + "only inreg arguments to the parent function are valid as inputs to " + "this intrinsic", + &Call); + break; + } case Intrinsic::amdgcn_set_inactive_chain_arg: { auto CallerCC = Call.getCaller()->getCallingConv(); switch (CallerCC) { diff --git a/llvm/test/Verifier/AMDGPU/intrinsic-amdgpu-init-exec-from-input.ll b/llvm/test/Verifier/AMDGPU/intrinsic-amdgpu-init-exec-from-input.ll new file mode 100644 index 0000000000000..11426041924e4 --- /dev/null +++ b/llvm/test/Verifier/AMDGPU/intrinsic-amdgpu-init-exec-from-input.ll @@ -0,0 +1,25 @@ +; RUN: not llvm-as -disable-output 2>&1 %s | FileCheck %s + +declare void @llvm.amdgcn.init.exec.from.input(i32, i32 immarg) + +; CHECK: only inreg arguments to the parent function are valid as inputs to this intrinsic +; CHECK-NEXT: call void @llvm.amdgcn.init.exec.from.input(i32 0, i32 0) +define void @init_exec_from_input_fail_constant() { + call void @llvm.amdgcn.init.exec.from.input(i32 0, i32 0) + ret void +} + +; CHECK: only inreg arguments to the parent function are valid as inputs to this intrinsic +; CHECK-NEXT: call void @llvm.amdgcn.init.exec.from.input(i32 %b, i32 0) +define void @init_exec_from_input_fail_not_inreg(i32 inreg %a, i32 %b) { + call void @llvm.amdgcn.init.exec.from.input(i32 %b, i32 0) + ret void +} + +; CHECK: only inreg arguments to the parent function are valid as inputs to this intrinsic +; CHECK-NEXT: call void @llvm.amdgcn.init.exec.from.input(i32 %c, i32 0) +define void @init_exec_from_input_fail_instruction(i32 inreg %a, i32 %b) { + %c = add i32 %a, %b + call void @llvm.amdgcn.init.exec.from.input(i32 %c, i32 0) + ret void +}