private VarUsage analyseVariable(Variable var) { BasicBlockStub[] stubArray = new BasicBlockStub[BlockList.Count]; Hashtable hash = new Hashtable(); for (int i = 0; i < BlockList.Count; i++) { stubArray[i] = new BasicBlockStub(var, BlockList[i]); hash.Add(BlockList[i], stubArray[i]); } for (int i = 0; i < BlockList.Count; i++) { foreach (BasicBlock block in BlockList[i].Next) { stubArray[i].AddNext(hash[block] as BasicBlockStub); } } foreach (BasicBlockStub stub in stubArray) { stub.Reduce(); } VarUsage result = new VarUsage(); foreach (BasicBlockStub stub in stubArray) { stub.AddToUsage(result); } return(result); }
public void AddToUsage(VarUsage usage) { if (!isEmpty) { for (int i = 0; i < UsageArray.Count - 1; i++) { if (UsageArray[i] is StoreVar) { StoreVar storer = UsageArray[i] as StoreVar; if (UsageArray[i + 1] is LoadVar) { usage.addUsage(storer, UsageArray[i + 1] as LoadVar); } } } if (UsageArray.Count > 0 && UsageArray[UsageArray.Count - 1] is StoreVar) { StoreVar storer = UsageArray[UsageArray.Count - 1] as StoreVar; bool flag = true; for (int i = 0; i < next.Count && flag; i++) { BasicBlockStub nextStub = next[i] as BasicBlockStub; if (nextStub.UsageArray[0] is LoadVar) { usage.addUsage(storer, nextStub.UsageArray[0] as LoadVar); flag = false; } } } } }
public ProcessVar(string name, VarUsage usage, string context = null) { this.Name = name; this.Usage = usage; this.Context = new List <string> { context }; }
public void AddToUsedVar(string matchValue, VarUsage usage, string context = null) { var varName = Regex.Replace(matchValue, varPattern, "$1"); if (UsedVariables.Any(v => v.Name.Equals(varName))) { var variable = UsedVariables.Single(v => v.Name.Equals(varName)); variable.Usage = variable.Usage & usage; variable.Context.Add(context); } else { UsedVariables.Add(new ProcessVar(varName, usage, context)); } }
private VarUsage analyseVariable(Variable var) { BasicBlockStub[] stubArray = new BasicBlockStub[BlockList.Count]; Hashtable hash = new Hashtable(); for (int i = 0; i < BlockList.Count; i++) { stubArray[i] = new BasicBlockStub(var,BlockList[i]); hash.Add(BlockList[i],stubArray[i]); } for (int i = 0; i < BlockList.Count; i++) foreach (BasicBlock block in BlockList[i].Next) stubArray[i].AddNext(hash[block] as BasicBlockStub); foreach (BasicBlockStub stub in stubArray) stub.Reduce(); VarUsage result = new VarUsage(); foreach (BasicBlockStub stub in stubArray) stub.AddToUsage(result); return result; }
public void AddToUsage(VarUsage usage) { if (! isEmpty) { for (int i = 0; i < UsageArray.Count-1; i++) if (UsageArray[i] is StoreVar) { StoreVar storer = UsageArray[i] as StoreVar; if (UsageArray[i+1] is LoadVar) usage.addUsage(storer,UsageArray[i+1] as LoadVar); } if (UsageArray.Count > 0 && UsageArray[UsageArray.Count-1] is StoreVar) { StoreVar storer = UsageArray[UsageArray.Count-1] as StoreVar; bool flag = true; for (int i = 0; i < next.Count && flag; i++) { BasicBlockStub nextStub = next[i] as BasicBlockStub; if (nextStub.UsageArray[0] is LoadVar) { usage.addUsage(storer,nextStub.UsageArray[0] as LoadVar); flag = false; } } } } }
private bool performUnnecessaryStoringRemoval() { bool result = false; bool containsProtectedBlock = false; MethodBodyBlock mbb = Entry.Body[0] as MethodBodyBlock; foreach (Node node in mbb.ChildArray) { containsProtectedBlock |= node is ProtectedBlock; } if (containsProtectedBlock) { Hashtable varFlags = new Hashtable(); foreach (BasicBlock block in blockList) { int i; NodeArray body = block.Body; if (body.Count > 0) { Node lastNode = body[body.Count - 1]; bool initialFlag = lastNode is Leave && lastNode.Parent is MethodBodyBlock; foreach (Variable var in mbb.Variables) { varFlags[var] = initialFlag; } for (i = body.Count - 1; i >= 0; i--) { Node node = body[i]; if (node is LoadVar || node is StoreVar) { Variable var = (node as ManageVar).Var; if (varIsNotReferenced(var)) { bool flag = (bool)(varFlags[var]); if (node is LoadVar && flag) { varFlags[var] = false; } else if (node is StoreVar && !flag) { varFlags[var] = true; } else if (node is StoreVar && flag) { result = true; replaceNodeByPop(node); node.RemoveFromGraph(); } } } } } } } else { foreach (Variable var in mbb.Variables) { if (varIsNotReferenced(var)) { VarUsage usage = analyseVariable(var); NodeArray nodesToRemove = new NodeArray(); foreach (ManageVar node in var.UsersArray) { if (node is StoreVar) { StoreVar storer = node as StoreVar; if (!usage.IsUsed(storer)) { nodesToRemove.Add(storer); } } } foreach (StoreVar storer in nodesToRemove) { result = true; replaceNodeByPop(storer); storer.RemoveFromGraph(); } } } } return(result); }