forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288408 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
2 changed files
with
85 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters