Esempio n. 1
0
        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);
        }
Esempio n. 2
0
            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
     };
 }
Esempio n. 4
0
        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));
            }
        }
Esempio n. 5
0
        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;
        }
Esempio n. 6
0
            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;
                            }
                        }
                    }
                }
            }
Esempio n. 7
0
        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);
        }