private static void ForwardDFS(CFG cdfg, ControlGraphQueries <EnhancedBasicBlock <Instruction>, Instruction> cfgQueries, HashSet <EnhancedBasicBlock <Instruction> > currentPath, HashSet <EnhancedBasicBlock <Instruction> > visitedBlocks, Dictionary <EnhancedBasicBlock <Instruction>, List <EnhancedBasicBlock <Instruction> > > surroundingLoops, EnhancedBasicBlock <Instruction> block) { if (visitedBlocks.Contains(block)) { return; } visitedBlocks.Add(block); currentPath.Add(block); var successors = cdfg.SuccessorsFor(block); //Console.WriteLine("{0:X}, Successors: {1}", block.Offset, Offsets(successors)); foreach (var s in successors) { if (currentPath.Contains(s)) { // backedge from block to s //WriteBlockOffset(s, 1); if (!cfgQueries.Dominates(s, block)) { throw new NotReducibleFlowGraph(); } BackwardDFS(cdfg, cfgQueries, surroundingLoops, new HashSet <EnhancedBasicBlock <Instruction> >(), block, s); } else { ForwardDFS(cdfg, cfgQueries, currentPath, visitedBlocks, surroundingLoops, s); } } currentPath.Remove(block); }
private static void BackwardDFS(CFG cdfg, ControlGraphQueries <EnhancedBasicBlock <Instruction>, Instruction> cfgQueries, Dictionary <EnhancedBasicBlock <Instruction>, List <EnhancedBasicBlock <Instruction> > > surroundingLoops, HashSet <EnhancedBasicBlock <Instruction> > visitedBlocks, EnhancedBasicBlock <Instruction> block, EnhancedBasicBlock <Instruction> loopHead) { if (visitedBlocks.Contains(block)) { return; } visitedBlocks.Add(block); List <EnhancedBasicBlock <Instruction> > loops; if (!surroundingLoops.TryGetValue(block, out loops)) { loops = new List <EnhancedBasicBlock <Instruction> >(); surroundingLoops.Add(block, loops); } surroundingLoops[block].Add(loopHead); if (block == loopHead) { return; } var predecessors = cfgQueries.PredeccessorsFor(block); //Console.WriteLine("{0:X}, Predecessors: {1}", block.Offset, Offsets(predecessors)); foreach (var p in predecessors) { BackwardDFS(cdfg, cfgQueries, surroundingLoops, visitedBlocks, p, loopHead); } }
private void InitializeOperandStack(EnhancedBasicBlock<Instruction> block) { Contract.Requires(block != null); this.operandStack.Clear(); foreach (var pseudoInstruction in block.OperandStack) { Contract.Assume(pseudoInstruction != null); this.PushTempForSlotAndAssociateWithInstruction(pseudoInstruction); } }