From bcbf240d2eab2a2794224487d87519ac31016c96 Mon Sep 17 00:00:00 2001
From: LDj3SNuD <35856442+LDj3SNuD@users.noreply.github.com>
Date: Tue, 23 Feb 2021 13:15:45 +0100
Subject: [PATCH] PPTC: Fix unwanted propagation of a relocatable constant in a
 specific case. (#1990)

* Fix unwanted propagation of a relocatable constant in a specific case.

* Ptc.InternalVersion = 1990

* Nit to retrigger the Checks.
---
 ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs | 12 +++++++++---
 ARMeilleure/CodeGen/Optimizations/Simplification.cs  |  6 ++++++
 ARMeilleure/CodeGen/X86/Assembler.cs                 |  2 +-
 ARMeilleure/Translation/PTC/Ptc.cs                   |  2 +-
 Ryujinx/_schema.json                                 |  2 +-
 5 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs b/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs
index 73828140eb..412f6ea4c9 100644
--- a/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs
+++ b/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs
@@ -14,7 +14,7 @@ namespace ARMeilleure.CodeGen.Optimizations
                 return;
             }
 
-            if (!AreAllSourcesConstantAndCFEnabled(operation))
+            if (!AreAllSourcesConstant(operation))
             {
                 return;
             }
@@ -24,6 +24,12 @@ namespace ARMeilleure.CodeGen.Optimizations
             switch (operation.Instruction)
             {
                 case Instruction.Add:
+                    if (operation.GetSource(0).Relocatable ||
+                        operation.GetSource(1).Relocatable)
+                    {
+                        break;
+                    }
+
                     if (type == OperandType.I32)
                     {
                         EvaluateBinaryI32(operation, (x, y) => x + y);
@@ -252,13 +258,13 @@ namespace ARMeilleure.CodeGen.Optimizations
             }
         }
 
-        private static bool AreAllSourcesConstantAndCFEnabled(Operation operation)
+        private static bool AreAllSourcesConstant(Operation operation)
         {
             for (int index = 0; index < operation.SourcesCount; index++)
             {
                 Operand srcOp = operation.GetSource(index);
 
-                if (srcOp.Kind != OperandKind.Constant || srcOp.Relocatable)
+                if (srcOp.Kind != OperandKind.Constant)
                 {
                     return false;
                 }
diff --git a/ARMeilleure/CodeGen/Optimizations/Simplification.cs b/ARMeilleure/CodeGen/Optimizations/Simplification.cs
index 7704f7989c..db32e99321 100644
--- a/ARMeilleure/CodeGen/Optimizations/Simplification.cs
+++ b/ARMeilleure/CodeGen/Optimizations/Simplification.cs
@@ -12,6 +12,12 @@ namespace ARMeilleure.CodeGen.Optimizations
             switch (operation.Instruction)
             {
                 case Instruction.Add:
+                    if (operation.GetSource(0).Relocatable ||
+                        operation.GetSource(1).Relocatable)
+                    {
+                        break;
+                    }
+
                     TryEliminateBinaryOpComutative(operation, 0);
                     break;
 
diff --git a/ARMeilleure/CodeGen/X86/Assembler.cs b/ARMeilleure/CodeGen/X86/Assembler.cs
index 2484e25191..bab4c4530b 100644
--- a/ARMeilleure/CodeGen/X86/Assembler.cs
+++ b/ARMeilleure/CodeGen/X86/Assembler.cs
@@ -961,7 +961,7 @@ namespace ARMeilleure.CodeGen.X86
 
                         WriteInt32((int)imm);
                     }
-                    else if (dest != null && dest.Kind == OperandKind.Register && info.OpRImm64 != BadOp)
+                    else if (dest?.Kind == OperandKind.Register && info.OpRImm64 != BadOp)
                     {
                         int? index = source.PtcIndex;
 
diff --git a/ARMeilleure/Translation/PTC/Ptc.cs b/ARMeilleure/Translation/PTC/Ptc.cs
index 01d0b236c1..266bdba6f1 100644
--- a/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/ARMeilleure/Translation/PTC/Ptc.cs
@@ -26,7 +26,7 @@ namespace ARMeilleure.Translation.PTC
     {
         private const string HeaderMagicString = "PTChd\0\0\0";
 
-        private const int InternalVersion = 1963; //! To be incremented manually for each change to the ARMeilleure project.
+        private const uint InternalVersion = 1990; //! To be incremented manually for each change to the ARMeilleure project.
 
         private const string ActualDir = "0";
         private const string BackupDir = "1";
diff --git a/Ryujinx/_schema.json b/Ryujinx/_schema.json
index b61e9ed259..e03e4afcc5 100644
--- a/Ryujinx/_schema.json
+++ b/Ryujinx/_schema.json
@@ -1235,7 +1235,7 @@
     "enable_ptc": {
       "$id": "#/properties/enable_ptc",
       "type": "boolean",
-      "title": "Enable Profiled Persistent Translation Cache",
+      "title": "Enable PPTC (Profiled Persistent Translation Cache)",
       "description": "Enables or disables profiled translation cache persistency",
       "default": true,
       "examples": [