From a0e32726a718610d370851da1148734a34c671cd Mon Sep 17 00:00:00 2001 From: bdemsky Date: Thu, 25 Jun 2009 09:24:21 +0000 Subject: [PATCH] nasty bugs...finally fixed --- .../src/Analysis/Loops/CopyPropagation.java | 2 +- Robust/src/Analysis/Loops/LoopInvariant.java | 8 +- Robust/src/Analysis/Loops/LoopOptimize.java | 141 +++++++++++++----- Robust/src/Main/Main.java | 4 + 4 files changed, 112 insertions(+), 43 deletions(-) diff --git a/Robust/src/Analysis/Loops/CopyPropagation.java b/Robust/src/Analysis/Loops/CopyPropagation.java index 71c9e7ca..26b13f64 100644 --- a/Robust/src/Analysis/Loops/CopyPropagation.java +++ b/Robust/src/Analysis/Loops/CopyPropagation.java @@ -12,6 +12,7 @@ public class CopyPropagation { } public void optimize(FlatMethod fm) { + Hashtable> table =new Hashtable>(); boolean changed=false; @@ -91,7 +92,6 @@ public class CopyPropagation { for(int i=0;i tp=table.get(fn.getPrev(i)); - for(Iterator tmpit=tp.entrySet().iterator();tmpit.hasNext();) { Map.Entry t=(Map.Entry)tmpit.next(); TempDescriptor tmp=(TempDescriptor)t.getKey(); diff --git a/Robust/src/Analysis/Loops/LoopInvariant.java b/Robust/src/Analysis/Loops/LoopInvariant.java index 60bdc5a9..1d42f542 100644 --- a/Robust/src/Analysis/Loops/LoopInvariant.java +++ b/Robust/src/Analysis/Loops/LoopInvariant.java @@ -88,7 +88,7 @@ public class LoopInvariant { FlatSetElementNode fsen=(FlatSetElementNode)fn; types.add(fsen.getDst().getType()); } - } + } } HashSet dominatorset=unsafe?null:computeAlways(l); @@ -104,13 +104,15 @@ public class LoopInvariant { case FKind.FlatOpNode: int op=((FlatOpNode)fn).getOp().getOp(); if (op==Operation.DIV||op==Operation.MOD|| - checkNode(fn,elements)) { + checkNode(fn,elements)|| + !unsafe&&!dominatorset.contains(fn)) { continue nextfn; } break; case FKind.FlatInstanceOfNode: - if (checkNode(fn,elements)) { + if (checkNode(fn,elements)|| + !unsafe&&!dominatorset.contains(fn)) { continue nextfn; } break; diff --git a/Robust/src/Analysis/Loops/LoopOptimize.java b/Robust/src/Analysis/Loops/LoopOptimize.java index 2d6f2e32..945cbb3a 100644 --- a/Robust/src/Analysis/Loops/LoopOptimize.java +++ b/Robust/src/Analysis/Loops/LoopOptimize.java @@ -4,6 +4,7 @@ import IR.Flat.*; import IR.TypeUtil; import IR.MethodDescriptor; import IR.Operation; +import java.util.HashSet; import java.util.Set; import java.util.Vector; import java.util.Iterator; @@ -14,27 +15,49 @@ public class LoopOptimize { public LoopOptimize(GlobalFieldType gft, TypeUtil typeutil) { loopinv=new LoopInvariant(typeutil,gft); } + Hashtable ntoomap; + Hashtable clonemap; + Hashtable map; + public void optimize(FlatMethod fm) { loopinv.analyze(fm); + ntoomap=new Hashtable(); + map=new Hashtable(); + clonemap=new Hashtable(); dooptimize(fm); } + + private FlatNode ntooremap(FlatNode fn) { + while(ntoomap.containsKey(fn)) { + fn=ntoomap.get(fn); + } + return fn; + } + + private FlatNode otonremap(FlatNode fn) { + while(map.containsKey(fn)) { + fn=map.get(fn); + } + return fn; + } + private void dooptimize(FlatMethod fm) { Loops root=loopinv.root; - recurse(root); + recurse(fm, root); } - private void recurse(Loops parent) { + private void recurse(FlatMethod fm, Loops parent) { for(Iterator lpit=parent.nestedLoops().iterator();lpit.hasNext();) { Loops child=(Loops)lpit.next(); - processLoop(child); - recurse(child); + processLoop(fm, child); + recurse(fm, child); } } - public void processLoop(Loops l) { + public void processLoop(FlatMethod fm, Loops l) { Set entrances=l.loopEntrances(); assert entrances.size()==1; FlatNode entrance=(FlatNode)entrances.iterator().next(); if (loopinv.tounroll.contains(entrance)) { - unrollLoop(l); + unrollLoop(l, fm); } else { hoistOps(l); } @@ -55,35 +78,56 @@ public class LoopOptimize { for(int i=0;i1) { throw new Error(); } } + /* If the chain is empty, we can exit now */ + if (first==null) + return; + /* The chain is built at this point. */ - FlatNode[] prevarray=new FlatNode[entrance.numPrev()]; for(int i=0;i tohoist=loopinv.hoisted; Hashtable temptable=new Hashtable(); Hashtable copytable=new Hashtable(); Hashtable copyendtable=new Hashtable(); - + TempMap t=new TempMap(); /* Copy the nodes */ for(Iterator it=lelements.iterator();it.hasNext();) { FlatNode fn=(FlatNode)it.next(); - FlatNode copy=fn.clone(t); + FlatNode nfn=otonremap(fn); + + FlatNode copy=nfn.clone(t); FlatNode copyend=copy; if (tohoist.contains(fn)) { - TempDescriptor[] writes=fn.writesTemps(); - TempDescriptor tmp=writes[0]; - TempDescriptor ntmp=tmp.createNew(); - temptable.put(fn, ntmp); - copyend=new FlatOpNode(ntmp, tmp, null, new Operation(Operation.ASSIGN)); - copy.addNext(copyend); + //deal with the possiblity we already hoisted this node + if (clonemap.containsKey(fn)) { + FlatNode fnnew=clonemap.get(fn); + TempDescriptor writenew[]=fnnew.writesTemps(); + temptable.put(nfn, writenew[0]); + } else { + TempDescriptor[] writes=nfn.writesTemps(); + TempDescriptor tmp=writes[0]; + TempDescriptor ntmp=tmp.createNew("b"); + temptable.put(nfn, ntmp); + copyend=new FlatOpNode(ntmp, tmp, null, new Operation(Operation.ASSIGN)); + copy.addNext(copyend); + } } - copytable.put(fn, copy); - copyendtable.put(fn, copyend); + copytable.put(nfn, copy); + copyendtable.put(nfn, copyend); } - /* Splice header in */ + /* Store initial in set for loop header */ FlatNode[] prevarray=new FlatNode[entrance.numPrev()]; - FlatNode first=copytable.get(entrance); for(int i=0;i