0
0
Fork 0

Optimize %x ^ %x = 0 (#1094)

* JIT: Optimize %x ^ %x = 0

* Address feedback

* Fix typo
This commit is contained in:
Ficture Seven 2020-04-09 03:36:19 +04:00 committed by GitHub
parent dc144d2e19
commit 496db602ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -12,7 +12,6 @@ namespace ARMeilleure.CodeGen.Optimizations
switch (operation.Instruction) switch (operation.Instruction)
{ {
case Instruction.Add: case Instruction.Add:
case Instruction.BitwiseExclusiveOr:
TryEliminateBinaryOpComutative(operation, 0); TryEliminateBinaryOpComutative(operation, 0);
break; break;
@ -24,6 +23,10 @@ namespace ARMeilleure.CodeGen.Optimizations
TryEliminateBitwiseOr(operation); TryEliminateBitwiseOr(operation);
break; break;
case Instruction.BitwiseExclusiveOr:
TryEliminateBitwiseExclusiveOr(operation);
break;
case Instruction.ConditionalSelect: case Instruction.ConditionalSelect:
TryEliminateConditionalSelect(operation); TryEliminateConditionalSelect(operation);
break; break;
@ -89,6 +92,24 @@ namespace ARMeilleure.CodeGen.Optimizations
} }
} }
private static void TryEliminateBitwiseExclusiveOr(Operation operation)
{
// Try to recognize and optimize those 2 patterns (in order):
// x ^ y == 0x00000000 when x == y
// 0x00000000 ^ y == y, x ^ 0x00000000 == x
Operand x = operation.GetSource(0);
Operand y = operation.GetSource(1);
if (x == y && x.Type.IsInteger())
{
operation.TurnIntoCopy(Const(x.Type, 0));
}
else
{
TryEliminateBinaryOpComutative(operation, 0);
}
}
private static void TryEliminateBinaryOpY(Operation operation, ulong comparand) private static void TryEliminateBinaryOpY(Operation operation, ulong comparand)
{ {
Operand x = operation.GetSource(0); Operand x = operation.GetSource(0);