Skip to content

Commit 0da8d0f

Browse files
authored
[AMDGPU] Change handling of unsupported non-compute shaders with HSA (#126798)
Previous handling in `SITargetLowering::LowerFormalArguments` only reported a diagnostic message and continued execution by returning a non-usable `SDValue`. This results in llvm crashing later with an unrelated error. This commit changes the detection of an unsupported non-compute shader to be a fatal error right away. As an example situation, take the usage of an `amdgpu_ps` function and the `amdgcn-unknown-amdhsa` target triple. ``` define amdgpu_ps void @foo(ptr %p, i32 %i) { store i32 %i, ptr %p ret void } ``` Compiling this code (with `llc -mtriple=amdgcn-unknown-amdhsa -mcpu=gfx942`, for example) fails with: ``` error: <unknown>:0:0: in function foo void (ptr, i32): unsupported non-compute shaders with HSA llc: [...]/git/trunk21.0/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:11790: void llvm::SelectionDAGISel::LowerArguments(const llvm::Function&): Assertion `InVals.size() == Ins.size() && "LowerFormalArguments didn't emit the correct number of values!"' failed. [...] ```
1 parent d2240cd commit 0da8d0f

File tree

2 files changed

+58
-11
lines changed

2 files changed

+58
-11
lines changed

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2822,12 +2822,13 @@ SDValue SITargetLowering::LowerFormalArguments(
28222822
const Function &Fn = MF.getFunction();
28232823
FunctionType *FType = MF.getFunction().getFunctionType();
28242824
SIMachineFunctionInfo *Info = MF.getInfo<SIMachineFunctionInfo>();
2825+
bool IsError = false;
28252826

28262827
if (Subtarget->isAmdHsaOS() && AMDGPU::isGraphics(CallConv)) {
28272828
DiagnosticInfoUnsupported NoGraphicsHSA(
28282829
Fn, "unsupported non-compute shaders with HSA", DL.getDebugLoc());
28292830
DAG.getContext()->diagnose(NoGraphicsHSA);
2830-
return DAG.getEntryNode();
2831+
IsError = true;
28312832
}
28322833

28332834
SmallVector<ISD::InputArg, 16> Splits;
@@ -2936,7 +2937,7 @@ SDValue SITargetLowering::LowerFormalArguments(
29362937

29372938
for (unsigned i = 0, e = Ins.size(), ArgIdx = 0; i != e; ++i) {
29382939
const ISD::InputArg &Arg = Ins[i];
2939-
if (Arg.isOrigArg() && Skipped[Arg.getOrigArgIndex()]) {
2940+
if ((Arg.isOrigArg() && Skipped[Arg.getOrigArgIndex()]) || IsError) {
29402941
InVals.push_back(DAG.getUNDEF(Arg.VT));
29412942
continue;
29422943
}
Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,65 @@
1-
; RUN: not llc -mtriple=amdgcn-unknown-amdhsa < %s 2>&1 | FileCheck %s
1+
; RUN: not llc -mtriple=amdgcn-unknown-amdhsa -O0 -filetype=null < %s 2>&1 | FileCheck %s
22

3-
; CHECK: in function pixel_s{{.*}}: unsupported non-compute shaders with HSA
4-
define amdgpu_ps void @pixel_shader() #0 {
3+
@I = global i32 42
4+
@P = global ptr @I
5+
6+
; CHECK: error: <unknown>:0:0: in function pixel_shader_zero_args void (): unsupported non-compute shaders with HSA
7+
; CHECK: error: <unknown>:0:0: in function pixel_shader_one_arg void (ptr): unsupported non-compute shaders with HSA
8+
; CHECK: error: <unknown>:0:0: in function pixel_shader_two_args void (ptr, i32): unsupported non-compute shaders with HSA
9+
; CHECK: error: <unknown>:0:0: in function vertex_shader_zero_args void (): unsupported non-compute shaders with HSA
10+
; CHECK: error: <unknown>:0:0: in function vertex_shader_one_arg void (ptr): unsupported non-compute shaders with HSA
11+
; CHECK: error: <unknown>:0:0: in function vertex_shader_two_args void (ptr, i32): unsupported non-compute shaders with HSA
12+
; CHECK: error: <unknown>:0:0: in function geometry_shader_zero_args void (): unsupported non-compute shaders with HSA
13+
; CHECK: error: <unknown>:0:0: in function geometry_shader_one_arg void (ptr): unsupported non-compute shaders with HSA
14+
; CHECK: error: <unknown>:0:0: in function geometry_shader_two_args void (ptr, i32): unsupported non-compute shaders with HSA
15+
16+
define amdgpu_ps void @pixel_shader_zero_args() {
17+
%i = load i32, ptr @I
18+
store i32 %i, ptr @P
19+
ret void
20+
}
21+
22+
define amdgpu_ps void @pixel_shader_one_arg(ptr %p) {
23+
%i = load i32, ptr @I
24+
store i32 %i, ptr %p
525
ret void
626
}
727

8-
; CHECK: in function vertex_s{{.*}}: unsupported non-compute shaders with HSA
9-
define amdgpu_vs void @vertex_shader() #0 {
28+
define amdgpu_ps void @pixel_shader_two_args(ptr %p, i32 %i) {
29+
store i32 %i, ptr %p
1030
ret void
1131
}
1232

13-
; CHECK: in function geometry_s{{.*}}: unsupported non-compute shaders with HSA
14-
define amdgpu_gs void @geometry_shader() #0 {
33+
define amdgpu_vs void @vertex_shader_zero_args() {
34+
%i = load i32, ptr @I
35+
store i32 %i, ptr @P
1536
ret void
1637
}
1738

18-
!llvm.module.flags = !{!0}
19-
!0 = !{i32 1, !"amdhsa_code_object_version", i32 400}
39+
define amdgpu_vs void @vertex_shader_one_arg(ptr %p) {
40+
%i = load i32, ptr @I
41+
store i32 %i, ptr %p
42+
ret void
43+
}
44+
45+
define amdgpu_vs void @vertex_shader_two_args(ptr %p, i32 %i) {
46+
store i32 %i, ptr %p
47+
ret void
48+
}
49+
50+
define amdgpu_gs void @geometry_shader_zero_args() {
51+
%i = load i32, ptr @I
52+
store i32 %i, ptr @P
53+
ret void
54+
}
55+
56+
define amdgpu_gs void @geometry_shader_one_arg(ptr %p) {
57+
%i = load i32, ptr @I
58+
store i32 %i, ptr %p
59+
ret void
60+
}
61+
62+
define amdgpu_gs void @geometry_shader_two_args(ptr %p, i32 %i) {
63+
store i32 %i, ptr %p
64+
ret void
65+
}

0 commit comments

Comments
 (0)