[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