diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-10-19 16:30:56 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-10-19 16:30:56 +0000 |
commit | 7bb63ac029bfe00e24ed4628d46252fde200c0e4 (patch) | |
tree | bef164dbea221259c650eb92a85ba19c45873625 /llvm/lib/Target/Hexagon/RDFGraph.h | |
parent | 4554e161bea9915c73f67788e1e3efd88eb92c7a (diff) | |
download | bcm5719-llvm-7bb63ac029bfe00e24ed4628d46252fde200c0e4.tar.gz bcm5719-llvm-7bb63ac029bfe00e24ed4628d46252fde200c0e4.zip |
[RDF] Switch RefMap in liveness calculation to use lane masks
This required reengineering of some of the part of liveness calculation,
including fixing some issues caused by the limitations of the previous
approach. The current code is not necessarily the fastest, but it should
be functionally correct (at least more so than before). The compile-time
performance will be addressed in the future.
llvm-svn: 284609
Diffstat (limited to 'llvm/lib/Target/Hexagon/RDFGraph.h')
-rw-r--r-- | llvm/lib/Target/Hexagon/RDFGraph.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/Target/Hexagon/RDFGraph.h b/llvm/lib/Target/Hexagon/RDFGraph.h index 00b6f79f4ed..8fece7f99f2 100644 --- a/llvm/lib/Target/Hexagon/RDFGraph.h +++ b/llvm/lib/Target/Hexagon/RDFGraph.h @@ -406,9 +406,10 @@ namespace rdf { RegisterRef() : RegisterRef(0) {} explicit RegisterRef(RegisterId R, LaneBitmask M = ~LaneBitmask(0)) - : Reg(R), Mask(M) {} + : Reg(R), Mask(R != 0 ? M : 0) {} RegisterRef(const RegisterRef &RR) = default; RegisterRef &operator= (const RegisterRef &RR) = default; + operator bool() const { return Reg != 0 && Mask != LaneBitmask(0); } bool operator== (const RegisterRef &RR) const { return Reg == RR.Reg && Mask == RR.Mask; } @@ -511,6 +512,9 @@ namespace rdf { RegisterAggr &insert(RegisterRef RR); RegisterAggr &insert(const RegisterAggr &RG); RegisterAggr &clear(RegisterRef RR); + RegisterAggr &clear(const RegisterAggr &RG); + + RegisterRef clearIn(RegisterRef RR) const; void print(raw_ostream &OS) const; @@ -797,6 +801,8 @@ namespace rdf { PackedRegisterRef pack(RegisterRef RR) const { return LMI.pack(RR); } RegisterRef unpack(PackedRegisterRef PR) const { return LMI.unpack(PR); } RegisterRef makeRegRef(unsigned Reg, unsigned Sub) const; + RegisterRef normalizeRef(RegisterRef RR) const; + RegisterRef restrictRef(RegisterRef AR, RegisterRef BR) const; NodeAddr<RefNode*> getNextRelated(NodeAddr<InstrNode*> IA, NodeAddr<RefNode*> RA) const; @@ -967,6 +973,13 @@ namespace rdf { } + // Optionally print the lane mask, if it is not ~0. + struct PrintLaneMaskOpt { + PrintLaneMaskOpt(LaneBitmask M) : Mask(M) {} + LaneBitmask Mask; + }; + raw_ostream &operator<< (raw_ostream &OS, const PrintLaneMaskOpt &P); + template <typename T> struct Print; template <typename T> raw_ostream &operator<< (raw_ostream &OS, const Print<T> &P); |