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: 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 +- 3 files changed, 16 insertions(+), 4 deletions(-) (limited to 'ARMeilleure/CodeGen') diff --git a/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs b/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs index 73828140..412f6ea4 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 7704f798..db32e993 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 2484e251..bab4c453 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; -- cgit v1.2.3