diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-10 23:27:10 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-10 23:27:10 +0000 |
commit | fcad79671f22c8994663c6780862b9c38d3609c3 (patch) | |
tree | dce1123afde2279ce6fad0f3a7a852c28db3bf2e /utils/TableGen/CodeGenRegisters.h | |
parent | 9d236f909cec671ef2ff186c8fce6d2e1540a0a9 (diff) | |
download | llvm-fcad79671f22c8994663c6780862b9c38d3609c3.tar.gz llvm-fcad79671f22c8994663c6780862b9c38d3609c3.tar.bz2 llvm-fcad79671f22c8994663c6780862b9c38d3609c3.tar.xz |
Compute secondary sub-registers.
The sub-registers explicitly listed in SubRegs in the .td files form a
tree. In a complicated register bank, it is possible to have
sub-register relationships across sub-trees. For example, the ARM NEON
double vector Q0_Q1 is a tree:
Q0_Q1 = [Q0, Q1], Q0 = [D0, D1], Q1 = [D2, D3]
But we also define the DPair register D1_D2 = [D1, D2] which is fully
contained in Q0_Q1.
This patch teaches TableGen to find such sub-register relationships, and
assign sub-register indices to them. In the example, TableGen will
create a dsub_1_dsub_2 sub-register index, and add D1_D2 as a
sub-register of Q0_Q1.
This will eventually enable the coalescer to handle copies of skewed
sub-registers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156587 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenRegisters.h')
-rw-r--r-- | utils/TableGen/CodeGenRegisters.h | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/utils/TableGen/CodeGenRegisters.h b/utils/TableGen/CodeGenRegisters.h index 1d0e30f9fb..23cc53932d 100644 --- a/utils/TableGen/CodeGenRegisters.h +++ b/utils/TableGen/CodeGenRegisters.h @@ -67,6 +67,7 @@ namespace llvm { // Return a conflicting composite, or NULL CodeGenSubRegIndex *addComposite(CodeGenSubRegIndex *A, CodeGenSubRegIndex *B) { + assert(A && B); std::pair<CompMap::iterator, bool> Ins = Composed.insert(std::make_pair(A, B)); return (Ins.second || Ins.first->second == B) ? 0 : Ins.first->second; @@ -108,6 +109,9 @@ namespace llvm { // This includes unique entries for all sub-sub-registers. const SubRegMap &computeSubRegs(CodeGenRegBank&); + // Compute extra sub-registers by combining the existing sub-registers. + void computeSecondarySubRegs(CodeGenRegBank&); + const SubRegMap &getSubRegs() const { assert(SubRegsComplete && "Must precompute sub-registers"); return SubRegs; @@ -123,11 +127,11 @@ namespace llvm { return SubReg2Idx.lookup(Reg); } - // List of super-registers in topological order, small to large. typedef std::vector<const CodeGenRegister*> SuperRegList; - // Get the list of super-registers. This is valid after getSubReg - // visits all registers during RegBank construction. + // Get the list of super-registers in topological order, small to large. + // This is valid after computeSubRegs visits all registers during RegBank + // construction. const SuperRegList &getSuperRegs() const { assert(SubRegsComplete && "Must precompute sub-registers"); return SuperRegs; @@ -170,6 +174,9 @@ namespace llvm { SmallVector<CodeGenSubRegIndex*, 8> ExplicitSubRegIndices; SmallVector<CodeGenRegister*, 8> ExplicitSubRegs; + // Super-registers where this is the first explicit sub-register. + SuperRegList LeadingSuperRegs; + SubRegMap SubRegs; SuperRegList SuperRegs; DenseMap<const CodeGenRegister*, CodeGenSubRegIndex*> SubReg2Idx; @@ -349,6 +356,10 @@ namespace llvm { DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx; unsigned NumNamedIndices; + typedef std::map<SmallVector<CodeGenSubRegIndex*, 8>, + CodeGenSubRegIndex*> ConcatIdxMap; + ConcatIdxMap ConcatIdx; + // Registers. std::vector<CodeGenRegister*> Registers; DenseMap<Record*, CodeGenRegister*> Def2Reg; @@ -419,6 +430,17 @@ namespace llvm { CodeGenSubRegIndex *getCompositeSubRegIndex(CodeGenSubRegIndex *A, CodeGenSubRegIndex *B); + // Find or create a sub-register index representing the concatenation of + // non-overlapping sibling indices. + CodeGenSubRegIndex * + getConcatSubRegIndex(const SmallVector<CodeGenSubRegIndex*, 8>&); + + void + addConcatSubRegIndex(const SmallVector<CodeGenSubRegIndex*, 8> &Parts, + CodeGenSubRegIndex *Idx) { + ConcatIdx.insert(std::make_pair(Parts, Idx)); + } + const std::vector<CodeGenRegister*> &getRegisters() { return Registers; } // Find a register from its Record def. |