[llvm] r288408 - [tablegen] Delete duplicates from a vector without skipping elements

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 1 11:38:51 PST 2016


Author: vedantk
Date: Thu Dec  1 13:38:50 2016
New Revision: 288408

URL: http://llvm.org/viewvc/llvm-project?rev=288408&view=rev
Log:
[tablegen] Delete duplicates from a vector without skipping elements

Tablegen's -gen-instr-info pass has a bug in its emitEnums() routine.
The function intends for values in a vector to be deduplicated, but it
accidentally skips over elements after performing a deletion.

I think there are smarter ways of doing this deduplication, but we can
do that in a follow-up commit if there's interest. See the thread:
[PATCH] TableGen InstrMapping Bug fix.

Patch by Tyler Kenney!

Added:
    llvm/trunk/test/TableGen/DuplicateFieldValues.td
Modified:
    llvm/trunk/utils/TableGen/CodeGenMapTable.cpp

Added: llvm/trunk/test/TableGen/DuplicateFieldValues.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/DuplicateFieldValues.td?rev=288408&view=auto
==============================================================================
--- llvm/trunk/test/TableGen/DuplicateFieldValues.td (added)
+++ llvm/trunk/test/TableGen/DuplicateFieldValues.td Thu Dec  1 13:38:50 2016
@@ -0,0 +1,84 @@
+// RUN: llvm-tblgen -gen-instr-info -I %p/../../include %s | FileCheck %s
+
+// CHECK: ABCForm_A
+// CHECK-NOT: ABCForm_A
+
+//
+// include Target.td for InstrMapping class and define minimally required objects
+//
+
+include "llvm/Target/Target.td"
+
+class DFVReg<string n> : Register<n> {
+  let Namespace = "DFV";
+}
+
+def R0 : DFVReg<"r0">;
+def DFVRegClass : RegisterClass<"DFV",[i32],0,(add R0)>;
+def DFVInstrInfo : InstrInfo;
+
+def DFVTest : Target {
+  let InstructionSet = DFVInstrInfo;
+}
+
+//
+// Define a number of a InstrMappings with repeated ValueCol fields
+//
+
+class ABCRel;
+
+def getAFormFromBForm : InstrMapping {
+  let FilterClass = "ABCRel";
+  let RowFields = ["BaseName"];
+  let ColFields = ["ABCForm"];
+  let KeyCol = ["B"];
+  let ValueCols = [["A"]];
+}
+
+def getAFormFromCForm : InstrMapping {
+  let FilterClass = "ABCRel";
+  let RowFields = ["BaseName"];
+  let ColFields = ["ABCForm"];
+  let KeyCol = ["C"];
+  let ValueCols = [["A"]];
+}
+
+def getAFormFromDForm : InstrMapping {
+  let FilterClass = "ABCRel";
+  let RowFields = ["BaseName"];
+  let ColFields = ["ABCForm"];
+  let KeyCol = ["D"];
+  let ValueCols = [["A"]];
+}
+
+def getAFormFromEForm : InstrMapping {
+  let FilterClass = "ABCRel";
+  let RowFields = ["BaseName"];
+  let ColFields = ["ABCForm"];
+  let KeyCol = ["E"];
+  let ValueCols = [["A"]];
+}
+
+class I : Instruction {
+  let Namespace = "DFV";
+  let OutOperandList = (outs);
+  let InOperandList = (ins);
+
+  string BaseName = "";
+  string ABCForm = "";
+}
+
+class isAForm { string ABCForm = "A"; }
+class isBForm { string ABCForm = "B"; }
+class isCForm { string ABCForm = "C"; }
+class isDForm { string ABCForm = "D"; }
+class isEForm { string ABCForm = "E"; }
+
+let BaseName = "0" in {
+  def A0 : I, ABCRel, isAForm;
+  def B0 : I, ABCRel, isBForm;
+  def C0 : I, ABCRel, isCForm;
+  def D0 : I, ABCRel, isDForm;
+  def E0 : I, ABCRel, isEForm;
+}
+

Modified: llvm/trunk/utils/TableGen/CodeGenMapTable.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenMapTable.cpp?rev=288408&r1=288407&r2=288408&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenMapTable.cpp (original)
+++ llvm/trunk/utils/TableGen/CodeGenMapTable.cpp Thu Dec  1 13:38:50 2016
@@ -542,6 +542,7 @@ static void emitEnums(raw_ostream &OS, R
       for (unsigned j = i+1; j < FieldValues.size(); j++) {
         if (CurVal == FieldValues[j]) {
           FieldValues.erase(FieldValues.begin()+j);
+          --j;
         }
       }
     }




More information about the llvm-commits mailing list