-package org.simantics.scl.compiler.internal.codegen.analysis;\r
-\r
-public abstract class Dominance {\r
-\r
- int[] idom;\r
- \r
- public Dominance(int size) {\r
- idom = new int[size];\r
- idom[0] = 0;\r
- for(int i=1;i<size;++i)\r
- idom[i] = -1;\r
- }\r
- \r
- public void compute() {\r
- boolean changed;\r
- do {\r
- changed = true;\r
- for(int i=1;i<idom.length;++i) {\r
- int curDom = -1;\r
- for(int pred : predecessors(i)) {\r
- int dom = idom[pred];\r
- if(dom >= 0) {\r
- if(curDom < 0)\r
- curDom = dom;\r
- else\r
- curDom = intersect(dom, curDom);\r
- }\r
- }\r
- if(idom[i] != curDom) {\r
- idom[i] = curDom;\r
- changed = true;\r
- }\r
- }\r
- } while(changed);\r
- }\r
- \r
- private int intersect(int a, int b) {\r
- while(a != b) {\r
- if(a < b)\r
- b = idom[b];\r
- else\r
- a = idom[a];\r
- }\r
- return a;\r
- }\r
-\r
- protected abstract int[] predecessors(int i);\r
- \r
-}\r
+package org.simantics.scl.compiler.internal.codegen.analysis;
+
+public abstract class Dominance {
+
+ int[] idom;
+
+ public Dominance(int size) {
+ idom = new int[size];
+ idom[0] = 0;
+ for(int i=1;i<size;++i)
+ idom[i] = -1;
+ }
+
+ public void compute() {
+ boolean changed;
+ do {
+ changed = true;
+ for(int i=1;i<idom.length;++i) {
+ int curDom = -1;
+ for(int pred : predecessors(i)) {
+ int dom = idom[pred];
+ if(dom >= 0) {
+ if(curDom < 0)
+ curDom = dom;
+ else
+ curDom = intersect(dom, curDom);
+ }
+ }
+ if(idom[i] != curDom) {
+ idom[i] = curDom;
+ changed = true;
+ }
+ }
+ } while(changed);
+ }
+
+ private int intersect(int a, int b) {
+ while(a != b) {
+ if(a < b)
+ b = idom[b];
+ else
+ a = idom[a];
+ }
+ return a;
+ }
+
+ protected abstract int[] predecessors(int i);
+
+}