summaryrefslogtreecommitdiff
path: root/src/spiglet/spiglet2kanga/SpgProc.java
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2014-11-27 15:59:40 +0800
committerIru Cai <mytbk920423@gmail.com>2014-11-27 16:03:46 +0800
commit06c4bed365ca396f2e69f9f5aff50aab71182909 (patch)
treefcd8c29a4542f1e8f66c1901d77011529362995b /src/spiglet/spiglet2kanga/SpgProc.java
parente2324d5aeeafa6a77dfb5d4588b06edd0c1f2d06 (diff)
downloadminijava-06c4bed365ca396f2e69f9f5aff50aab71182909.tar.xz
lifeness analysis
Diffstat (limited to 'src/spiglet/spiglet2kanga/SpgProc.java')
-rw-r--r--src/spiglet/spiglet2kanga/SpgProc.java34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/spiglet/spiglet2kanga/SpgProc.java b/src/spiglet/spiglet2kanga/SpgProc.java
index 77c7fe8..57cbb63 100644
--- a/src/spiglet/spiglet2kanga/SpgProc.java
+++ b/src/spiglet/spiglet2kanga/SpgProc.java
@@ -62,7 +62,10 @@ public class SpgProc extends SpgSym {
} else {
if (i==statements.size()-1) {
stmt.succ1 = null;
+ } else {
+ stmt.succ1 = statements.elementAt(i+1);
}
+ stmt.succ2 = null;
}
}
}
@@ -73,5 +76,36 @@ public class SpgProc extends SpgSym {
}
}
+ public void getActiveVars() {
+ boolean modified = true;
+
+ // first, initialize the out[] of the last statement
+ if (retexp!=null) {
+ statements.lastElement().out = retexp.getTmpUsed();
+ }
+
+ // then, loop in all statements for in[] and out[]
+ while (modified) {
+ modified = false;
+ for (int i=statements.size()-1; i>=0; i--) {
+ SpgStmt st = statements.elementAt(i);
+ // first, reset the out[] set
+ if (st.succ1!=null) {
+ modified |= st.out.addAll(st.succ1.in);
+ }
+ if (st.succ2!=null) {
+ modified |= st.out.addAll(st.succ2.in);
+ }
+ st.in.clear();
+ st.in.addAll(st.out);
+ if (st.def!=null) {
+ st.in.removeAll(st.def);
+ }
+ if (st.use!=null) {
+ st.in.addAll(st.use);
+ }
+ }
+ }
+ }
}