diff options
author | Zhigang Gong <zhigang.gong@intel.com> | 2015-09-24 08:47:27 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2015-10-08 16:35:49 +0800 |
commit | 02750c042a325507bdeb23777d61ee8d4e048c10 (patch) | |
tree | ea509c6028ad6084e1473fa4f3a90aff085278be /backend | |
parent | ba47dc45e1847fadf3d0955f9044b5ca680fd8bb (diff) |
GBE: add two helper routines for liveness partially update.
We don't need to recompute the entire liveness information for
all cases. This is a preparation patch for further phi copy
optimization.
v2:
also need to update varKill set.
Signed-off-by: Zhigang Gong <zhigang.gong@intel.com>
Reviewed-by: Ruiling Song <ruiling.song@intel.com>
Diffstat (limited to 'backend')
-rw-r--r-- | backend/src/ir/liveness.cpp | 37 | ||||
-rw-r--r-- | backend/src/ir/liveness.hpp | 7 |
2 files changed, 44 insertions, 0 deletions
diff --git a/backend/src/ir/liveness.cpp b/backend/src/ir/liveness.cpp index 468a884c..414bf424 100644 --- a/backend/src/ir/liveness.cpp +++ b/backend/src/ir/liveness.cpp @@ -59,6 +59,43 @@ namespace ir { } } + void Liveness::removeRegs(const set<Register> &removes) { + for (auto &pair : liveness) { + BlockInfo &info = *(pair.second); + for (auto reg : removes) { + if (info.liveOut.contains(reg)) + info.liveOut.erase(reg); + if (info.upwardUsed.contains(reg)) + info.upwardUsed.erase(reg); + } + } + } + + void Liveness::replaceRegs(const map<Register, Register> &replaceMap) { + + for (auto &pair : liveness) { + BlockInfo &info = *pair.second; + BasicBlock *bb = const_cast<BasicBlock *>(&info.bb); + for (auto &pair : replaceMap) { + Register from = pair.first; + Register to = pair.second; + if (info.liveOut.contains(from)) { + info.liveOut.erase(from); + info.liveOut.insert(to); + bb->definedPhiRegs.insert(to); + } + if (info.upwardUsed.contains(from)) { + info.upwardUsed.erase(from); + info.upwardUsed.insert(to); + } + if (info.varKill.contains(from)) { + info.varKill.erase(from); + info.varKill.insert(to); + } + } + } + } + Liveness::~Liveness(void) { for (auto &pair : liveness) GBE_SAFE_DELETE(pair.second); } diff --git a/backend/src/ir/liveness.hpp b/backend/src/ir/liveness.hpp index d9fa2ed6..df889e62 100644 --- a/backend/src/ir/liveness.hpp +++ b/backend/src/ir/liveness.hpp @@ -116,6 +116,13 @@ namespace ir { } } } + + // remove some registers from the liveness information. + void removeRegs(const set<Register> &removes); + + // replace some registers according to (from, to) register map. + void replaceRegs(const map<Register, Register> &replaceMap); + private: /*! Store the liveness of all blocks */ Info liveness; |