本文整理汇总了C#中BasicBlock.Coalesce方法的典型用法代码示例。如果您正苦于以下问题:C# BasicBlock.Coalesce方法的具体用法?C# BasicBlock.Coalesce怎么用?C# BasicBlock.Coalesce使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BasicBlock
的用法示例。
在下文中一共展示了BasicBlock.Coalesce方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: TryReduceJump
private string TryReduceJump(BasicBlock root, JumpBasicBlock jumpbb)
{
// Try to find a linear chain of branches of length > 1
var group = new Set<BasicBlock> { jumpbb };
var chain = new Seq<BasicBlock> { jumpbb };
var start = jumpbb;
while (start.Sources.Count == 1 && start.Sources[0] is JumpBasicBlock &&
!group.Contains(start.Sources[0]))
{
// Extend chain upwards
start = (JumpBasicBlock)start.Sources[0];
group.Add(start);
chain.Insert(0, start);
}
var endjump = jumpbb;
while (endjump.Target.Sources.Count == 1 && endjump.Target is JumpBasicBlock && !group.Contains(endjump.Target))
{
// Extend chain downwards
endjump = (JumpBasicBlock)endjump.Target;
group.Add(endjump);
chain.Add(endjump);
}
var end = (BasicBlock)endjump;
if (endjump.Target.Sources.Count == 1 && endjump.Target.AcceptsInstructions && !group.Contains(endjump.Target))
{
// Extend chain downwards to include a final non jump basic block, provided we can put all
// the accumulated instructions there
end = endjump.Target;
group.Add(end);
chain.Add(end);
}
if (chain.Count > 1)
{
// Coalesce and peephole
var instructions = new Seq<Instruction>();
foreach (var bb in chain)
bb.Block.AccumInstructions(instructions);
var newbb = end.CloneWithInstructions(nextBlockId++, Peephole(chain[0].Block.BeforeState, instructions));
root.Coalesce(start, group, newbb);
return String.Format("collapsed chain of {0} jump blocks from B{1}", chain.Count, start.Id);
}
else if (start.Block.Count == 0 && !start.Target.Equals(start))
{
// Short-circuit a trivial jump
root.Delete(start);
return String.Format("short-circuited trivial jump at B{0}", start.Id);
}
else if (start.Target.Equals(start))
{
// loop
var li = new LoopInstruction(NextInstructionId--, start.Block)
{ BeforeState = jumpbb.Block.BeforeState, AfterState = jumpbb.Block.AfterState };
var newbb = new NonReturningBasicBlock(nextBlockId++, new Instructions(li));
root.Coalesce(start, new Set<BasicBlock> { start }, newbb);
return String.Format("trival loop at B{0}", start.Id);
}
else
return null;
}
示例2: TryReduceBranch
private string TryReduceBranch(BasicBlock root, BranchBasicBlock branchbb)
{
var beforeState = branchbb.Block.BeforeState;
var afterState = branchbb.Block.AfterState;
{
// While-do
var thenbb = branchbb.Target as JumpBasicBlock;
var group = new Set<BasicBlock> { branchbb };
if (thenbb != null && thenbb.Target.Equals(branchbb) && thenbb.Sources.Count == 1 && group.Add(thenbb) &&
!group.Contains(branchbb.Fallthrough))
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Eval(instructions, afterState, thenbb.Block.BeforeState, BottomPT);
var wdi = new WhileDoInstruction
(NextInstructionId--, new Instructions(beforeState, instructions), thenbb.Block)
{
BeforeState = beforeState,
AfterState = branchbb.Fallthrough.Block.BeforeState
};
var newbb = new JumpBasicBlock(nextBlockId++, new Instructions(wdi), branchbb.Fallthrough);
root.Coalesce(branchbb, group, newbb);
return String.Format("while-do from B{0}", branchbb.Id);
}
}
{
// Flipped while-do
var elsebb = branchbb.Fallthrough as JumpBasicBlock;
var group = new Set<BasicBlock> { branchbb };
if (elsebb != null && elsebb.Target.Equals(branchbb) && elsebb.Sources.Count == 1 && group.Add(elsebb) &&
!group.Contains(branchbb.Target))
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Negate().Eval
(instructions, afterState, elsebb.Block.BeforeState, BottomPT);
var wdi = new WhileDoInstruction
(NextInstructionId--, new Instructions(beforeState, instructions), elsebb.Block)
{
BeforeState = beforeState,
AfterState = branchbb.Target.Block.BeforeState
};
var newbb = new JumpBasicBlock(nextBlockId++, new Instructions(wdi), branchbb.Target);
root.Coalesce(branchbb, group, newbb);
return String.Format("while-do (flipped) from B{0}", branchbb.Id);
}
}
{
// Do-while
var thenbb = branchbb.Target;
if (thenbb.Equals(branchbb) && !branchbb.Fallthrough.Equals(branchbb))
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Eval(instructions, afterState, beforeState, BottomPT);
var cond = SeparateCondition(beforeState, ref instructions);
var dwi = new DoWhileInstruction(NextInstructionId--, new Instructions(beforeState, instructions), cond)
{
BeforeState = beforeState,
AfterState = branchbb.Fallthrough.Block.BeforeState
};
var newbb = new JumpBasicBlock(nextBlockId++, new Instructions(dwi), branchbb.Fallthrough);
root.Coalesce(branchbb, new Set<BasicBlock> { branchbb }, newbb);
return String.Format("do-while from B{0}", branchbb.Id);
}
}
{
// Flipped Do-while
var elsebb = branchbb.Fallthrough;
if (elsebb.Equals(branchbb) && !branchbb.Target.Equals(branchbb))
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Negate().Eval
(instructions, afterState, beforeState, BottomPT);
var cond = SeparateCondition(beforeState, ref instructions);
var dwi = new DoWhileInstruction(NextInstructionId--, new Instructions(beforeState, instructions), cond)
{
BeforeState = beforeState,
AfterState = branchbb.Target.Block.BeforeState
};
var newbb = new JumpBasicBlock(nextBlockId++, new Instructions(dwi), branchbb.Target);
root.Coalesce(branchbb, new Set<BasicBlock> { branchbb }, newbb);
return String.Format("do-while (flipped) from B{0}", branchbb.Id);
}
}
{
// If-then, converging control
var thenbb = branchbb.Target as JumpBasicBlock;
if (thenbb != null && thenbb.Target.Equals(branchbb.Fallthrough) && thenbb.Sources.Count == 1)
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Eval(instructions, afterState, thenbb.Block.BeforeState, BottomPT);
var cond = SeparateCondition(beforeState, ref instructions);
var itei = new IfThenElseInstruction(NextInstructionId--, cond, thenbb.Block, null)
{ BeforeState = beforeState, AfterState = thenbb.Block.AfterState };
instructions.Add(itei);
var newbb = thenbb.CloneWithInstructions
(nextBlockId++, new Instructions(beforeState, instructions));
root.Coalesce(branchbb, new Set<BasicBlock> { branchbb, thenbb }, newbb);
//.........这里部分代码省略.........
示例3: BreakReduceLeaveCatch
private void BreakReduceLeaveCatch(BasicBlock root, BBLoop loop, BasicBlock breakTarget, LeaveCatchBasicBlock leavebb, Seq<BasicBlock> removed, Seq<BasicBlock> added)
{
if (leavebb.Target.Equals(breakTarget))
{
var instructions = leavebb.Block.CopyContents();
var lci = new BreakContinueInstruction(NextInstructionId--, BreakContinueOp.Break, loop.Label)
{ BeforeState = leavebb.Block.AfterState, AfterState = leavebb.Block.AfterState };
instructions.Add(lci);
var newbb = new NonReturningBasicBlock(nextBlockId++, new Instructions(leavebb.Block.BeforeState, instructions));
root.Coalesce(leavebb, new Set<BasicBlock> { leavebb }, newbb);
removed.Add(leavebb);
added.Add(newbb);
}
}
示例4: TryDuplicate
private string TryDuplicate(BasicBlock root, JumpBasicBlock jumpbb)
{
if (jumpbb.Target.Sources.Count > 1 && !jumpbb.Target.Equals(jumpbb) &&
IsDuplicatableBasicBlock(jumpbb.Target))
{
// Inline and peephole
var instructions = new Seq<Instruction>();
// var block = new InstructionBlock(jumpbb.Block.BeforeState);
jumpbb.Block.AccumClonedInstructions(instructions, ref NextInstructionId);
jumpbb.Target.Block.AccumClonedInstructions(instructions, ref NextInstructionId);
var newbb = jumpbb.Target.CloneWithInstructions
(nextBlockId++, Peephole(jumpbb.Block.BeforeState, instructions));
jumpbb.Target.Sources.Remove(jumpbb);
root.Coalesce(jumpbb, new Set<BasicBlock> { jumpbb }, newbb);
return String.Format("inlined block B{0} into B{1}", jumpbb.Target.Id, jumpbb.Id);
}
return null;
}
示例5: ContinueReduceBranch
private string ContinueReduceBranch(BasicBlock root, BBLoop loop, BranchBasicBlock branchbb)
{
var beforeState = branchbb.Block.BeforeState;
var afterState = branchbb.Block.AfterState;
if (branchbb.Target.Equals(loop.ContinueTarget) && !branchbb.Fallthrough.Equals(loop.ContinueTarget) &&
loop.ContinueTarget.Sources.Count > 1)
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Eval
(instructions, afterState, branchbb.Target.Block.BeforeState, BottomPT);
var cond = SeparateCondition(beforeState, ref instructions);
var lci = new BreakContinueInstruction(NextInstructionId--, BreakContinueOp.Continue, loop.Label)
{ BeforeState = afterState, AfterState = afterState };
var ifei = new IfThenElseInstruction(-1, cond, new Instructions(lci), null)
{ BeforeState = beforeState, AfterState = afterState };
instructions.Add(ifei);
var newbb = new JumpBasicBlock
(nextBlockId++, new Instructions(beforeState, instructions), branchbb.Fallthrough);
root.Coalesce(branchbb, new Set<BasicBlock> { branchbb }, newbb);
return String.Format("continue from branch at B{0} within loop from B{1}", branchbb.Id, loop.Head.Id);
}
if (branchbb.Fallthrough.Equals(loop.ContinueTarget) && !branchbb.Target.Equals(loop.ContinueTarget) &&
loop.ContinueTarget.Sources.Count > 1)
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Negate().Eval
(instructions, afterState, branchbb.Fallthrough.Block.BeforeState, BottomPT);
var cond = SeparateCondition(beforeState, ref instructions);
var lci = new BreakContinueInstruction(NextInstructionId--, BreakContinueOp.Continue, loop.Label)
{ BeforeState = afterState, AfterState = afterState };
var ifei = new IfThenElseInstruction(NextInstructionId--, cond, new Instructions(lci), null)
{ BeforeState = beforeState, AfterState = afterState };
instructions.Add(ifei);
var newbb = new JumpBasicBlock(nextBlockId++, new Instructions(beforeState, instructions), branchbb.Target);
root.Coalesce(branchbb, new Set<BasicBlock> { branchbb }, newbb);
return String.Format
("continue from branch (flipped) at B{0} within loop from B{1}", branchbb.Id, loop.Head.Id);
}
return null;
}
示例6: BreakReduceBranch
private void BreakReduceBranch(BasicBlock root, BBLoop loop, BasicBlock breakTarget, BranchBasicBlock branchbb, Seq<BasicBlock> removed, Seq<BasicBlock> added)
{
var beforeState = branchbb.Block.BeforeState;
var afterState = branchbb.Block.AfterState;
if (branchbb.Target.Equals(breakTarget) && !branchbb.Fallthrough.Equals(breakTarget))
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Eval(instructions, afterState, branchbb.Target.Block.BeforeState, BottomPT);
var cond = SeparateCondition(beforeState, ref instructions);
var lci = new BreakContinueInstruction(NextInstructionId--, BreakContinueOp.Break, loop.Label)
{ BeforeState = afterState, AfterState = afterState };
var itei = new IfThenElseInstruction(NextInstructionId--, cond, new Instructions(lci), null)
{ BeforeState = beforeState, AfterState = afterState };
instructions.Add(itei);
var newbb = new JumpBasicBlock(nextBlockId++, new Instructions(beforeState, instructions), branchbb.Fallthrough);
root.Coalesce(branchbb, new Set<BasicBlock> { branchbb }, newbb);
removed.Add(branchbb);
added.Add(newbb);
}
else if (branchbb.Fallthrough.Equals(breakTarget) && !branchbb.Target.Equals(breakTarget))
{
var instructions = branchbb.Block.CopyContents();
branchbb.Test.Negate().Eval
(instructions, afterState, branchbb.Fallthrough.Block.BeforeState, BottomPT);
var cond = SeparateCondition(beforeState, ref instructions);
var lci = new BreakContinueInstruction(NextInstructionId--, BreakContinueOp.Break, loop.Label)
{ BeforeState = afterState, AfterState = afterState };
var itei = new IfThenElseInstruction(NextInstructionId--, cond, new Instructions(lci), null)
{ BeforeState = beforeState, AfterState = afterState };
instructions.Add(itei);
var newbb = new JumpBasicBlock(nextBlockId++, new Instructions(beforeState, instructions), branchbb.Target);
root.Coalesce(branchbb, new Set<BasicBlock> { branchbb }, newbb);
removed.Add(branchbb);
added.Add(newbb);
}
}
示例7: ContinueReduceLeaveTry
private string ContinueReduceLeaveTry(BasicBlock root, BBLoop loop, LeaveTryBasicBlock leavebb)
{
if (leavebb.Target.Equals(loop.ContinueTarget) && leavebb.HandlerPopCount == 1)
{
var instructions = leavebb.Block.CopyContents();
var lci = new BreakContinueInstruction(NextInstructionId--, BreakContinueOp.Continue, loop.Label)
{ BeforeState = leavebb.Block.AfterState, AfterState = leavebb.Block.AfterState };
instructions.Add(lci);
var newbb = new NonReturningBasicBlock(nextBlockId++, new Instructions(leavebb.Block.BeforeState, instructions));
root.Coalesce(leavebb, new Set<BasicBlock> { leavebb }, newbb);
return String.Format
("continue from leave try at B{0} within loop from B{1}", leavebb.Id, loop.Head.Id);
}
return null;
}
示例8: ContinueReduceJump
private string ContinueReduceJump(BasicBlock root, BBLoop loop, JumpBasicBlock jumpbb)
{
if (jumpbb.Target.Equals(loop.ContinueTarget) && jumpbb.Block.AfterState.Depth == 0 &&
loop.ContinueTarget.Sources.Count > 1)
{
var instructions = jumpbb.Block.CopyContents();
var lci = new BreakContinueInstruction(NextInstructionId--, BreakContinueOp.Continue, loop.Label)
{ BeforeState = jumpbb.Block.AfterState, AfterState = jumpbb.Block.AfterState };
instructions.Add(lci);
var newbb = new NonReturningBasicBlock
(nextBlockId++, new Instructions(jumpbb.Block.BeforeState, instructions));
root.Coalesce(jumpbb, new Set<BasicBlock> { jumpbb }, newbb);
return String.Format("continue from jump at B{0} within loop from B{1}", jumpbb.Id, loop.Head.Id);
}
return null;
}
示例9: TryReduceLoopCandidate
private string TryReduceLoopCandidate(BasicBlock root, LoopCandidateBasicBlock loopbb)
{
var headbb = loopbb.Head;
var jumpheadbb = headbb as JumpBasicBlock;
var nonretheadbb = headbb as NonReturningBasicBlock;
var group = new Set<BasicBlock> { loopbb };
if ((jumpheadbb != null && jumpheadbb.Target.Equals(loopbb.Break) || nonretheadbb != null) &&
group.Add(headbb) && !group.Contains(loopbb.Break))
{
var newbb = new JumpBasicBlock(nextBlockId++, headbb.Block, loopbb.Break);
root.Coalesce(loopbb, group, newbb);
return String.Format("loop with break from B{0}", loopbb.Id);
}
return null;
}
示例10: TryReduceTry
private string TryReduceTry(BasicBlock root, TryBasicBlock trybb)
{
var group = new Set<BasicBlock> { trybb };
var leavetrybb = trybb.Body as LeaveTryBasicBlock;
if (leavetrybb == null || leavetrybb.HandlerPopCount != 1)
return null;
group.Add(leavetrybb);
var handlers = new Seq<TryInstructionHandler>();
foreach (var tbbHandler in trybb.Handlers)
{
var catchh = tbbHandler as TBBCatchHandler;
if (catchh != null)
{
if (!(catchh.Body is NonReturningBasicBlock))
{
// If body is not already free of control flow, check if it can be made to fall
// through to after try
var leavecatchbb = catchh.Body as LeaveCatchBasicBlock;
if (leavecatchbb == null || leavecatchbb.HandlerPopCount != 1 ||
!leavecatchbb.Target.Equals(leavetrybb.Target))
return null;
if (!group.Add(leavecatchbb))
// Should never happen
return null;
}
// else: catch ends with a return, throw, rethrow, break or continue
// Catch body WILL NOT end with leave
handlers.Add(new CatchTryInstructionHandler(catchh.Type, catchh.Body.Block));
}
else
{
var faulth = tbbHandler as TBBFaultHandler;
if (faulth != null)
{
// Body must be an end fault
var endfaultbb = faulth.Body as EndFaultBasicBlock;
if (endfaultbb == null)
return null;
if (!group.Add(endfaultbb))
// Should never happen
return null;
// Fault handler body WILL NOT end with endfinally/endfault
handlers.Add(new FaultTryInstructionHandler(endfaultbb.Block));
}
else
{
var finallyh = tbbHandler as TBBFinallyHandler;
if (finallyh != null)
{
// Body must be an end finally
var endfinallybb = finallyh.Body as EndFinallyBasicBlock;
if (endfinallybb == null)
return null;
if (!group.Add(endfinallybb))
// Should never happen
return null;
// Finally handler body WILL NOT end with endfinally/endfault
handlers.Add(new FinallyTryInstructionHandler(endfinallybb.Block));
}
else
throw new InvalidOperationException("unrecognized handler");
}
}
}
// Try body WILL NOT end with leave
var tryi = new TryInstruction(NextInstructionId--, leavetrybb.Block, handlers)
{ BeforeState = trybb.Block.BeforeState, AfterState = leavetrybb.Block.AfterState };
var newbb = new JumpBasicBlock(nextBlockId++, new Instructions(tryi), leavetrybb.Target);
root.Coalesce(trybb, group, newbb);
return String.Format("structural try/catch/finally/fault from B{0}", trybb.Id);
}
示例11: TryReduceSwitch
private string TryReduceSwitch(BasicBlock root, SwitchBasicBlock switchbb)
{
// Build a map from basic blocks to the cases which enter it.
// Also collect some simple stats.
var caseMap = new Map<BasicBlock, Set<int>> { { switchbb.Fallthrough, new Set<int> { -1 } } };
var allNonReturning = switchbb.Fallthrough is NonReturningBasicBlock;
var allHaveOneSource = switchbb.Fallthrough.Sources.Count == 1;
var jumpTargets = new Set<BasicBlock>();
var jumpbb = switchbb.Fallthrough as JumpBasicBlock;
if (jumpbb != null)
jumpTargets.Add(jumpbb.Target);
for (var i = 0; i < switchbb.CaseTargets.Count; i++)
{
var t = switchbb.CaseTargets[i];
if (!(t is NonReturningBasicBlock))
allNonReturning = false;
if (t.Sources.Count != 1)
allHaveOneSource = false;
jumpbb = t as JumpBasicBlock;
if (jumpbb != null)
jumpTargets.Add(jumpbb.Target);
var values = default(Set<int>);
if (caseMap.TryGetValue(t, out values))
// Block is shared amongst switch cases
values.Add(i);
else
caseMap.Add(t, new Set<int> { i });
}
if (caseMap.Count == 1)
{
// CASE 1: all switch cases go to the same block, so replace the switch with a pop and jump
var instructions = switchbb.Block.CopyContents();
instructions.Add
(new MiscInstruction(NextInstructionId--, MiscOp.Pop)
{ BeforeState = switchbb.Block.BeforeState, AfterState = switchbb.Fallthrough.Block.BeforeState });
var newbb = new JumpBasicBlock
(nextBlockId++, Peephole(switchbb.Block.BeforeState, instructions), switchbb.Fallthrough);
root.Coalesce(switchbb, new Set<BasicBlock> { switchbb }, newbb);
return string.Format("removed switch at B{0}", switchbb.Id);
}
if (allNonReturning && allHaveOneSource)
{
// CASE 2: all switch cases are non-returning and have one source, so move them all into
// a non-returing block with switch
var group = new Set<BasicBlock> { switchbb };
var cases = new Seq<StructuralCase>();
foreach (var kv in caseMap)
{
cases.Add(new StructuralCase(kv.Value, kv.Key.Block));
group.Add(kv.Key);
}
var ssi = new StructuralSwitchInstruction(NextInstructionId--, switchbb.Block, cases)
{
BeforeState = switchbb.Block.BeforeState,
AfterState = switchbb.Fallthrough.Block.AfterState
};
var newbb = new NonReturningBasicBlock(nextBlockId++, new Instructions(ssi));
root.Coalesce(switchbb, group, newbb);
return String.Format("non-returning structural switch from B{0}", switchbb.Id);
}
if (jumpTargets.Count == 1)
{
var theJumpTarget = jumpTargets[0];
var allIntermediateAreNonReturningOrJumpToTarget = true;
foreach (var kv in caseMap)
{
if (!kv.Key.Equals(theJumpTarget))
{
if (kv.Key.Sources.Count > 1 ||
!(kv.Key is NonReturningBasicBlock || kv.Key is JumpBasicBlock))
allIntermediateAreNonReturningOrJumpToTarget = false;
}
}
if (allIntermediateAreNonReturningOrJumpToTarget)
{
// CASE 3: all switch cases either jump directly to the switch successor or go via jump block,
// or don't return. Inline all the cases and place the switch in a jump to target block
var group = new Set<BasicBlock> { switchbb };
var cases = new Seq<StructuralCase>();
var afterState = default(MachineState);
foreach (var kv in caseMap)
{
var block = default(Instructions);
if (kv.Key.Equals(theJumpTarget))
{
var bci = new BreakContinueInstruction(NextInstructionId--, BreakContinueOp.Break, null)
{
BeforeState = theJumpTarget.Block.BeforeState,
AfterState = theJumpTarget.Block.BeforeState
};
// Fallthrough to final jump target
block = new Instructions(bci);
}
else
{
// Inline case block, and if not non-returning then fallthrough to final jump target
var instructions = kv.Key.Block.CopyContents();
//.........这里部分代码省略.........