Skip to content

Commit daa7154

Browse files
committed
Check std::optional before dereferencing
1 parent 0690683 commit daa7154

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

llvm/test/TableGen/GlobalISelEmitter/undef-tied-input.td

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
1-
// RUN: llvm-tblgen -gen-global-isel -I %p/../../../include -I %p/../Common %s | FileCheck %s
1+
// RUN: llvm-tblgen -gen-global-isel -warn-on-skipped-patterns \
2+
// RUN: -I %p/../../../include -I %p/../Common %s 2> %t | FileCheck %s
3+
// RUN: FileCheck -check-prefix=ERR %s < %t
24

35
include "llvm/Target/Target.td"
46
include "GlobalISelEmitterCommon.td"
57

6-
def undef_tied : OperandWithDefaultOps<untyped, (ops (i32 undef_tied_input))> {
8+
def undef_tied_1 : OperandWithDefaultOps<untyped, (ops (i32 undef_tied_input))> {
79
let MIOperandInfo = (ops GPR32:$inactive);
810
}
911

12+
def undef_tied_2 : OperandWithDefaultOps<i32, (ops (untyped undef_tied_input))> {
13+
let MIOperandInfo = (ops GPR32:$inactive);
14+
}
15+
16+
let Constraints = "$opt.inactive = $rd" in
17+
def I1 : I<(outs GPR32:$rd), (ins GPR32:$rs, undef_tied_1:$opt),
18+
[(set GPR32:$rd, (abs i32:$rs))]>;
19+
20+
// ERR: [[#@LINE+2]]:5: warning: Skipped pattern: unsupported type
1021
let Constraints = "$opt.inactive = $rd" in
11-
def I1 : I<(outs GPR32:$rd), (ins GPR32:$rs, undef_tied:$opt),
22+
def I2 : I<(outs GPR32:$rd), (ins GPR32:$rs, undef_tied_2:$opt),
1223
[(set GPR32:$rd, (abs i32:$rs))]>;
1324

1425
// CHECK-LABEL: // (abs:{ *:[i32] } i32:{ *:[i32] }:$rs) => (I1:{ *:[i32] } i32:{ *:[i32] }:$rs)

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,13 +1306,18 @@ Error GlobalISelEmitter::importLeafNodeRenderer(
13061306

13071307
if (R->getName() == "undef_tied_input") {
13081308
std::optional<LLTCodeGen> OpTyOrNone = MVTToLLT(N.getSimpleType(0));
1309+
if (!OpTyOrNone)
1310+
return failedImport("unsupported type");
1311+
13091312
unsigned TempRegID = M.allocateTempRegID();
13101313
M.insertAction<MakeTempRegisterAction>(InsertPt, *OpTyOrNone, TempRegID);
1314+
13111315
auto I = M.insertAction<BuildMIAction>(
13121316
InsertPt, M.allocateOutputInsnID(),
13131317
&Target.getInstruction(RK.getDef("IMPLICIT_DEF")));
13141318
auto &ImpDefBuilder = static_cast<BuildMIAction &>(**I);
13151319
ImpDefBuilder.addRenderer<TempRegRenderer>(TempRegID, /*IsDef=*/true);
1320+
13161321
MIBuilder.addRenderer<TempRegRenderer>(TempRegID);
13171322
return Error::success();
13181323
}

0 commit comments

Comments
 (0)