Пример #1
0
        private void SimplifyAccessInBlocks(InstrumentationRegion region, Graph <Block> blockGraph,
                                            Block netBlock, CallCmd netCall)
        {
            var predecessorBlocks = blockGraph.NestedPredecessors(netBlock);
            var successorBlocks   = blockGraph.NestedSuccessors(netBlock);

            successorBlocks.RemoveWhere(val =>
                                        predecessorBlocks.Contains(val) || val.Equals(netBlock));

            foreach (var block in successorBlocks)
            {
                foreach (var call in block.Cmds.OfType <CallCmd>())
                {
                    if (!(call.callee.StartsWith("_WRITE_LS_$M.") ||
                          call.callee.StartsWith("_READ_LS_$M.")))
                    {
                        continue;
                    }

                    ReadWriteSlicing.CleanReadWriteSets(base.EP, region, call);

                    call.callee = "_NO_OP_$" + base.EP.Name;
                    call.Ins.Clear();
                    call.Outs.Clear();
                }
            }

            if (!predecessorBlocks.Contains(netBlock))
            {
                bool foundCall = false;
                foreach (var call in netBlock.Cmds.OfType <CallCmd>())
                {
                    if (!foundCall && call.Equals(netCall))
                    {
                        foundCall = true;
                        continue;
                    }

                    if (!foundCall)
                    {
                        continue;
                    }

                    if (!(call.callee.StartsWith("_WRITE_LS_$M.") ||
                          call.callee.StartsWith("_READ_LS_$M.")))
                    {
                        continue;
                    }

                    ReadWriteSlicing.CleanReadWriteSets(base.EP, region, call);

                    call.callee = "_NO_OP_$" + base.EP.Name;
                    call.Ins.Clear();
                    call.Outs.Clear();
                }
            }
        }
Пример #2
0
        private void SimplifyBlocks(InstrumentationRegion region, Graph <Block> blockGraph,
                                    Block devBlock, CallCmd devCall)
        {
            var predecessorBlocks = blockGraph.NestedPredecessors(devBlock);
            var successorBlocks   = blockGraph.NestedSuccessors(devBlock);

            predecessorBlocks.RemoveWhere(val =>
                                          successorBlocks.Contains(val) || val.Equals(devBlock));

            foreach (var block in predecessorBlocks)
            {
                foreach (var call in block.Cmds.OfType <CallCmd>())
                {
                    if (call.callee.StartsWith("_WRITE_LS_$M.") ||
                        call.callee.StartsWith("_READ_LS_$M."))
                    {
                        ReadWriteSlicing.CleanReadWriteSets(base.EP, region, call);

                        call.callee = "_NO_OP_$" + base.EP.Name;
                        call.Ins.Clear();
                        call.Outs.Clear();
                    }
                    else
                    {
                        var calleeRegion = base.AC.InstrumentationRegions.Find(val =>
                                                                               val.Implementation().Name.Equals(call.callee));
                        if (calleeRegion == null)
                        {
                            continue;
                        }

                        call.callee = "_NO_OP_$" + base.EP.Name;
                        call.Ins.Clear();
                        call.Outs.Clear();
                    }
                }
            }

            if (!successorBlocks.Contains(devBlock))
            {
                foreach (var call in devBlock.Cmds.OfType <CallCmd>())
                {
                    if (call.Equals(devCall))
                    {
                        break;
                    }

                    if (call.callee.StartsWith("_WRITE_LS_$M.") ||
                        call.callee.StartsWith("_READ_LS_$M."))
                    {
                        ReadWriteSlicing.CleanReadWriteSets(base.EP, region, call);

                        call.callee = "_NO_OP_$" + base.EP.Name;
                        call.Ins.Clear();
                        call.Outs.Clear();
                    }
                    else
                    {
                        var calleeRegion = base.AC.InstrumentationRegions.Find(val =>
                                                                               val.Implementation().Name.Equals(call.callee));
                        if (calleeRegion == null)
                        {
                            continue;
                        }

                        call.callee = "_NO_OP_$" + base.EP.Name;
                        call.Ins.Clear();
                        call.Outs.Clear();
                    }
                }
            }
        }