[GlobalISel][TableGen] Fix seg fault for zero instruction
authorGabriel Hjort Ã…kerlund <gabriel.hjort.akerlund@ericsson.com>
Tue, 24 Nov 2020 06:12:54 +0000 (07:12 +0100)
committerMikael Holmen <mikael.holmen@ericsson.com>
Tue, 24 Nov 2020 06:47:58 +0000 (07:47 +0100)
Tablegen seg faulted when parsing a Pat where the destination part has
no output (zero instruction), due to a register class lookup using
nullptr.

Reviewed By: Paul-C-Anagnostopoulos

Differential Revision: https://reviews.llvm.org/D90829

llvm/test/TableGen/GlobalISelEmitter-zero-instr.td [new file with mode: 0644]
llvm/utils/TableGen/GlobalISelEmitter.cpp

diff --git a/llvm/test/TableGen/GlobalISelEmitter-zero-instr.td b/llvm/test/TableGen/GlobalISelEmitter-zero-instr.td
new file mode 100644 (file)
index 0000000..c8a8cab
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: llvm-tblgen -gen-global-isel -optimize-match-table=false -I %p/../../include -I %p/Common %s -o /dev/null --warn-on-skipped-patterns 2>&1 < %s 2>&1 | FileCheck %s
+
+include "llvm/Target/Target.td"
+include "GlobalISelEmitterCommon.td"
+
+// CHECK: warning: Skipped pattern: Dst pattern root isn't a known leaf
+def : Pat<(zext (i16 (trunc i32:$src))),
+          (i32 $src)>;
index ffd9cf0..f81876b 100644 (file)
@@ -5086,9 +5086,9 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
 
   if (Dst->isLeaf()) {
     Record *RCDef = getInitValueAsRegClass(Dst->getLeafValue());
-
-    const CodeGenRegisterClass &RC = Target.getRegisterClass(RCDef);
     if (RCDef) {
+      const CodeGenRegisterClass &RC = Target.getRegisterClass(RCDef);
+
       // We need to replace the def and all its uses with the specified
       // operand. However, we must also insert COPY's wherever needed.
       // For now, emit a copy and let the register allocator clean up.