X-Git-Url: http://plrg.eecs.uci.edu/git/?p=IRC.git;a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FLoops%2FUseDef.java;h=b58c1a4ce81153c29e0c41a592a74389384dc55a;hp=b72a05a911c915c4cf6545c0e924c619b067c3c3;hb=b124b7bf09a5eed6e272119acba9cfc5a1374b60;hpb=9afc17cac32db8203e37c725e8ac720f33b8f780 diff --git a/Robust/src/Analysis/Loops/UseDef.java b/Robust/src/Analysis/Loops/UseDef.java index b72a05a9..b58c1a4c 100644 --- a/Robust/src/Analysis/Loops/UseDef.java +++ b/Robust/src/Analysis/Loops/UseDef.java @@ -3,18 +3,43 @@ package Analysis.Loops; import IR.Flat.*; import java.util.HashSet; import java.util.Hashtable; +import java.util.Set; +import java.util.Iterator; +import Analysis.Liveness; -public class UseDef{ +public class UseDef { Hashtable> defs; Hashtable> uses; + public UseDef() { + } + public UseDef(FlatMethod fm) { analyze(fm); } + /* Return FlatNodes that define Temp */ + public Set defMap(FlatNode fn, TempDescriptor t) { + Set s=defs.get(new TempFlatPair(t,fn)); + if (s==null) + return new HashSet(); + else + return s; + } + + /* Return FlatNodes that use Temp */ + public Set useMap(FlatNode fn, TempDescriptor t) { + Set s=uses.get(new TempFlatPair(t,fn)); + if (s==null) + return new HashSet(); + else + return s; + } + public void analyze(FlatMethod fm) { Hashtable> tmp=new Hashtable>(); HashSet toanalyze=new HashSet(); + Hashtable> livemap=Liveness.computeLiveTemps(fm,-1); toanalyze.addAll(fm.getNodeSet()); while(!toanalyze.isEmpty()) { FlatNode fn=toanalyze.iterator().next(); @@ -22,53 +47,58 @@ public class UseDef{ toanalyze.remove(fn); HashSet s=new HashSet(); - for(int i=0;i prevs=tmp.get(prev); - nexttfp: - for(Iterator tfit=prevs.iterator();tfit.hasNext();) { - TempFlatPair tfp=tfit.next(); - for(int j=0;j liveset=livemap.get(fn); + for(int i=0; i prevs=tmp.get(prev); + if (prevs!=null) { +nexttfp: + for(Iterator tfit=prevs.iterator(); tfit.hasNext(); ) { + TempFlatPair tfp=tfit.next(); + if (!liveset.contains(tfp.t)) + continue; + for(int j=0; j fset=fm.getNodeSet(); defs=new Hashtable>(); uses=new Hashtable>(); - for(Iterator fnit=fset.iterator();fnit.hasNext();) { + for(Iterator fnit=fset.iterator(); fnit.hasNext(); ) { FlatNode fn=fnit.next(); TempDescriptor[] fnreads=fn.readsTemps(); Set tfpset=tmp.get(fn); - - for(int i=0;i tfpit=tfpset.iterator();tfpit.hasNext();) { - TempFlatPair tfp=tfpit.next(); - if (tfp.t==readt) { - //have use - if (!uses.containsKey(tfp)) - uses.put(tfp,new HashSet()); - uses.get(tfp).add(fn); - TempFlatPair readtfp=new TempFlatPair(readt,fn); - if (!defs.containsKey(readtfp)) - defs.put(readtfp,new HashSet()); - defs.get(readtfp).add(tfp.f); - } - } + + for(int i=0; i tfpit=tfpset.iterator(); tfpit.hasNext(); ) { + TempFlatPair tfp=tfpit.next(); + if (tfp.t==readt) { + //have use + if (!uses.containsKey(tfp)) + uses.put(tfp,new HashSet()); + uses.get(tfp).add(fn); + TempFlatPair readtfp=new TempFlatPair(readt,fn); + if (!defs.containsKey(readtfp)) + defs.put(readtfp,new HashSet()); + defs.get(readtfp).add(tfp.f); + } + } } } }