/// <summary> /// Splits the block. /// </summary> /// <param name="ctx">The context.</param> /// <returns></returns> private Context Split(Context ctx, BasicBlocks basicBlocks, InstructionSet instructionSet) { Context current = ctx.Clone(); Context next = ctx.Clone(); next.AppendInstruction(IRInstruction.BlockStart); BasicBlock nextBlock = basicBlocks.CreateBlockWithAutoLabel(next.Index, current.BasicBlock.EndIndex); Context nextContext = new Context(instructionSet, nextBlock); foreach (BasicBlock block in current.BasicBlock.NextBlocks) { nextBlock.NextBlocks.Add(block); block.PreviousBlocks.Remove(current.BasicBlock); block.PreviousBlocks.Add(nextBlock); } current.BasicBlock.NextBlocks.Clear(); current.AppendInstruction(IRInstruction.BlockEnd); current.BasicBlock.EndIndex = current.Index; return nextContext; }
/// <summary> /// Nexts the specified CTX. /// </summary> /// <param name="ctx">The CTX.</param> public void Add(Context ctx) { for (int i = _length - 1; i > 0; i--) _history[i] = _history[i - 1]; _history[0] = ctx.Clone(); if (_size < _length) _size++; }
private IEnumerable<Context> ScanForOperatorNew() { foreach (BasicBlock block in this.basicBlocks) { Context context = new Context(instructionSet, block); while (!context.EndOfInstruction) { if (context.Instruction is NewobjInstruction || context.Instruction is NewarrInstruction) { Debug.WriteLine(@"StaticAllocationResolutionStage: Found a newobj or newarr instruction."); yield return context.Clone(); } context.GotoNext(); } } }