Relax block ordering constraints (#1535)

* Relax block ordering constraints

Before `block.Next` had to follow `block.ListNext`, now it does not.
Instead `CodeGenerator` will now emit the necessary jump instructions
to ensure control flow.

This makes control flow and block order modifications easier. It also
eliminates some simple cases of redundant branches.

* Set PPTC version
This commit is contained in:
FICTURE7 2020-09-12 19:32:53 +04:00 committed by GitHub
parent 3d055da5fc
commit 36ec1bc6c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 164 additions and 174 deletions

View file

@ -32,7 +32,6 @@ namespace ARMeilleure.CodeGen.X86
Add(Instruction.BitwiseExclusiveOr, GenerateBitwiseExclusiveOr);
Add(Instruction.BitwiseNot, GenerateBitwiseNot);
Add(Instruction.BitwiseOr, GenerateBitwiseOr);
Add(Instruction.Branch, GenerateBranch);
Add(Instruction.BranchIf, GenerateBranchIf);
Add(Instruction.ByteSwap, GenerateByteSwap);
Add(Instruction.Call, GenerateCall);
@ -168,6 +167,23 @@ namespace ARMeilleure.CodeGen.X86
GenerateOperation(context, operation);
}
}
if (block.SuccessorCount == 0)
{
// The only blocks which can have 0 successors are exit blocks.
Debug.Assert(block.Operations.Last is Operation operation &&
(operation.Instruction == Instruction.Tailcall ||
operation.Instruction == Instruction.Return));
}
else
{
BasicBlock succ = block.GetSuccessor(0);
if (succ != block.ListNext)
{
context.JumpTo(succ);
}
}
}
Logger.EndPass(PassName.CodeGeneration);
@ -512,11 +528,6 @@ namespace ARMeilleure.CodeGen.X86
context.Assembler.Or(dest, src2, dest.Type);
}
private static void GenerateBranch(CodeGenContext context, Operation operation)
{
context.JumpTo(context.CurrBlock.Branch);
}
private static void GenerateBranchIf(CodeGenContext context, Operation operation)
{
Operand comp = operation.GetSource(2);
@ -527,7 +538,7 @@ namespace ARMeilleure.CodeGen.X86
GenerateCompareCommon(context, operation);
context.JumpTo(cond, context.CurrBlock.Branch);
context.JumpTo(cond, context.CurrBlock.GetSuccessor(1));
}
private static void GenerateByteSwap(CodeGenContext context, Operation operation)