Skip to content

Commit cde11ed

Browse files
arsenmAlexisPerry
authored andcommitted
DAG: Fix asserting on invalid inline asm constraints (llvm#95935)
1 parent bab4c0f commit cde11ed

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10023,9 +10023,12 @@ void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
1002310023
break;
1002410024
}
1002510025

10026-
assert((OpInfo.ConstraintType == TargetLowering::C_RegisterClass ||
10027-
OpInfo.ConstraintType == TargetLowering::C_Register) &&
10028-
"Unknown constraint type!");
10026+
if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10027+
OpInfo.ConstraintType != TargetLowering::C_Register) {
10028+
emitInlineAsmError(Call, "unknown asm constraint '" +
10029+
Twine(OpInfo.ConstraintCode) + "'");
10030+
return;
10031+
}
1002910032

1003010033
// TODO: Support this.
1003110034
if (OpInfo.isIndirect) {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
; RUN: not llc -march=amdgcn < %s 2>&1 | FileCheck -check-prefix=ERR %s
2+
3+
; ERR: error: couldn't allocate output register for constraint 'q'
4+
define void @crash_use_invalid_output_constraint_block(ptr addrspace(1) %arg) {
5+
bb:
6+
%v = call i32 asm sideeffect "", "=q"()
7+
br label %use
8+
9+
use:
10+
store i32 %v, ptr addrspace(1) %arg
11+
ret void
12+
}
13+
14+
; ERR: error: unknown asm constraint 'q'
15+
define void @invalid_input_constraint() {
16+
call void asm sideeffect "", "q"(i32 1)
17+
ret void
18+
}
19+
20+
; ERR: error: unknown asm constraint 'q'
21+
define void @invalid_input_constraint_multi() {
22+
call void asm sideeffect "", "q,q"(i32 1, i16 2)
23+
ret void
24+
}
25+
26+
; ERR: error: unknown asm constraint 'q'
27+
define void @invalid_input_constraint_multi_valid() {
28+
call void asm sideeffect "", "q,v"(i32 1, i64 2)
29+
ret void
30+
}
31+
32+
; ERR: error: couldn't allocate output register for constraint 'q'
33+
define void @crash_use_invalid_output_constraint_block_multi(ptr addrspace(1) %arg) {
34+
bb:
35+
%v = call { i32, i32 } asm sideeffect "", "=q,=q"()
36+
br label %use
37+
38+
use:
39+
store { i32, i32 } %v, ptr addrspace(1) %arg
40+
ret void
41+
}
42+
43+
; ERR: error: couldn't allocate output register for constraint 'q'
44+
define void @crash_use_invalid_output_constraint_block_multi_valid(ptr addrspace(1) %arg) {
45+
bb:
46+
%v = call { i32, i32 } asm sideeffect "", "=q,=v"()
47+
br label %use
48+
49+
use:
50+
store { i32, i32 } %v, ptr addrspace(1) %arg
51+
ret void
52+
}

0 commit comments

Comments
 (0)