Sfoglia il codice sorgente

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

* JIT: Optimize %x ^ %x = 0

* Address feedback

* Fix typo
Ficture Seven 6 anni fa
parent
commit
496db602ff
1 ha cambiato i file con 22 aggiunte e 1 eliminazioni
  1. 22 1
      ARMeilleure/CodeGen/Optimizations/Simplification.cs

+ 22 - 1
ARMeilleure/CodeGen/Optimizations/Simplification.cs

@@ -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);