summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhigang Gong <zhigang.gong@intel.com>2015-09-24 08:47:27 +0800
committerYang Rong <rong.r.yang@intel.com>2015-10-08 16:35:49 +0800
commit02750c042a325507bdeb23777d61ee8d4e048c10 (patch)
treeea509c6028ad6084e1473fa4f3a90aff085278be
parentba47dc45e1847fadf3d0955f9044b5ca680fd8bb (diff)
downloadbeignet-02750c042a325507bdeb23777d61ee8d4e048c10.tar.gz
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>
-rw-r--r--backend/src/ir/liveness.cpp37
-rw-r--r--backend/src/ir/liveness.hpp7
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;