[TableGen] Fix crash when using HwModes in CodeEmitterGen
authorJames Molloy <jmolloy@google.com>
Wed, 9 Oct 2019 09:15:34 +0000 (09:15 +0000)
committerJames Molloy <jmolloy@google.com>
Wed, 9 Oct 2019 09:15:34 +0000 (09:15 +0000)
When an instruction has an encoding definition for only a subset of
the available HwModes, ensure we just avoid generating an encoding
rather than crash.

llvm-svn: 374150

llvm/test/TableGen/HwModeEncodeDecode.td
llvm/utils/TableGen/CodeEmitterGen.cpp

index b76d856..1c9b86f 100644 (file)
@@ -56,6 +56,15 @@ def bar: Instruction {
   let Inst{1-0} = 0b10;
   let AsmString = "bar  $factor";
 }
+
+def baz : Instruction {
+  let InOperandList = (ins i32imm:$factor);
+  bits<32> Inst;
+  let EncodingInfos = EncodingByHwMode<
+    [ModeB], [fooTypeEncA]
+  >;
+  let AsmString = "foo  $factor";
+}
 }
 
 // DECODER-LABEL: DecoderTable_ModeA32[] =
index b021d08..42f69cb 100644 (file)
@@ -367,7 +367,8 @@ void CodeEmitterGen::emitInstructionBaseValues(
     if (const RecordVal *RV = R->getValue("EncodingInfos")) {
       if (auto *DI = dyn_cast_or_null<DefInit>(RV->getValue())) {
         EncodingInfoByHwMode EBM(DI->getDef(), HWM);
-        EncodingDef = EBM.get(HwMode);
+        if (EBM.hasMode(HwMode))
+          EncodingDef = EBM.get(HwMode);
       }
     }
     BitsInit *BI = EncodingDef->getValueAsBitsInit("Inst");