From 047f119e9996c86a1360b4be61040eb295eec750 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 18 Aug 2019 00:25:26 +0200 Subject: [PATCH] Add RemoveDeadStores option --- ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs | 8 ++++---- ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs | 6 +++--- ICSharpCode.Decompiler/DecompilerSettings.cs | 14 ++++++++++++++ .../IL/ControlFlow/ControlFlowSimplification.cs | 2 +- .../IL/Transforms/RemoveDeadVariableInit.cs | 2 +- ILSpy/Properties/Resources.Designer.cs | 9 +++++++++ ILSpy/Properties/Resources.resx | 3 +++ 7 files changed, 35 insertions(+), 9 deletions(-) diff --git a/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs b/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs index 5d3d575e8..72e16db69 100644 --- a/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs +++ b/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs @@ -97,13 +97,13 @@ namespace ICSharpCode.Decompiler.Tests [Test] public void FSharpUsing_Debug() { - Run(settings: new DecompilerSettings { RemoveDeadCode = true }); + Run(settings: new DecompilerSettings { RemoveDeadStores = true }); } [Test] public void FSharpUsing_Release() { - Run(settings: new DecompilerSettings { RemoveDeadCode = true }); + Run(settings: new DecompilerSettings { RemoveDeadStores = true }); } [Test] @@ -182,14 +182,14 @@ namespace ICSharpCode.Decompiler.Tests public void FSharpLoops_Debug() { CopyFSharpCoreDll(); - Run(settings: new DecompilerSettings { RemoveDeadCode = true }); + Run(settings: new DecompilerSettings { RemoveDeadStores = true }); } [Test] public void FSharpLoops_Release() { CopyFSharpCoreDll(); - Run(settings: new DecompilerSettings { RemoveDeadCode = true }); + Run(settings: new DecompilerSettings { RemoveDeadStores = true }); } void Run([CallerMemberName] string testName = null, DecompilerSettings settings = null) diff --git a/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs b/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs index cfee6cb8b..401c23221 100644 --- a/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs +++ b/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs @@ -114,7 +114,7 @@ namespace ICSharpCode.Decompiler.Tests RunForLibrary(cscOptions: cscOptions, decompilerSettings: new DecompilerSettings { NullPropagation = false, // legacy csc generates a dead store in debug builds - RemoveDeadCode = (cscOptions == CompilerOptions.None) + RemoveDeadStores = (cscOptions == CompilerOptions.None) }); } @@ -123,7 +123,7 @@ namespace ICSharpCode.Decompiler.Tests { RunForLibrary(cscOptions: cscOptions, decompilerSettings: new DecompilerSettings { // legacy csc generates a dead store in debug builds - RemoveDeadCode = (cscOptions == CompilerOptions.None) + RemoveDeadStores = (cscOptions == CompilerOptions.None) }); } @@ -180,7 +180,7 @@ namespace ICSharpCode.Decompiler.Tests { RunForLibrary(cscOptions: cscOptions, decompilerSettings: new DecompilerSettings { // legacy csc generates a dead store in debug builds - RemoveDeadCode = (cscOptions == CompilerOptions.None) + RemoveDeadStores = (cscOptions == CompilerOptions.None) }); } diff --git a/ICSharpCode.Decompiler/DecompilerSettings.cs b/ICSharpCode.Decompiler/DecompilerSettings.cs index da888d71d..f62d22969 100644 --- a/ICSharpCode.Decompiler/DecompilerSettings.cs +++ b/ICSharpCode.Decompiler/DecompilerSettings.cs @@ -1095,6 +1095,20 @@ namespace ICSharpCode.Decompiler } } } + + bool removeDeadStores = false; + + [Category("DecompilerSettings.FSpecificOptions")] + [Description("DecompilerSettings.RemoveDeadStores")] + public bool RemoveDeadStores { + get { return removeDeadStores; } + set { + if (removeDeadStores != value) { + removeDeadStores = value; + OnPropertyChanged(); + } + } + } #endregion #region Assembly Load and Resolve options diff --git a/ICSharpCode.Decompiler/IL/ControlFlow/ControlFlowSimplification.cs b/ICSharpCode.Decompiler/IL/ControlFlow/ControlFlowSimplification.cs index 8bde22e66..9fd519461 100644 --- a/ICSharpCode.Decompiler/IL/ControlFlow/ControlFlowSimplification.cs +++ b/ICSharpCode.Decompiler/IL/ControlFlow/ControlFlowSimplification.cs @@ -46,7 +46,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow context.CancellationToken.ThrowIfCancellationRequested(); RemoveNopInstructions(block); - RemoveDeadStackStores(block, aggressive: context.Settings.RemoveDeadCode); + RemoveDeadStackStores(block, aggressive: context.Settings.RemoveDeadStores); InlineVariableInReturnBlock(block, context); // 1st pass SimplifySwitchInstruction before SimplifyBranchChains() diff --git a/ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs b/ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs index 9bdb3af18..43cb2e577 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs @@ -41,7 +41,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms // This is necessary to remove useless stores generated by some compilers, e.g., the F# compiler. // In yield return + async, the C# compiler tends to store null/default(T) to variables // when the variable goes out of scope. - if (function.IsAsync || function.IsIterator || context.Settings.RemoveDeadCode) { + if (function.IsAsync || function.IsIterator || context.Settings.RemoveDeadStores) { var variableQueue = new Queue(function.Variables); while (variableQueue.Count > 0) { var v = variableQueue.Dequeue(); diff --git a/ILSpy/Properties/Resources.Designer.cs b/ILSpy/Properties/Resources.Designer.cs index 845687b34..b555a63a4 100644 --- a/ILSpy/Properties/Resources.Designer.cs +++ b/ILSpy/Properties/Resources.Designer.cs @@ -801,6 +801,15 @@ namespace ICSharpCode.ILSpy.Properties { } } + /// + /// Looks up a localized string similar to Remove dead stores (use with caution!). + /// + public static string DecompilerSettings_RemoveDeadStores { + get { + return ResourceManager.GetString("DecompilerSettings.RemoveDeadStores", resourceCulture); + } + } + /// /// Looks up a localized string similar to Remove optional arguments, if possible. /// diff --git a/ILSpy/Properties/Resources.resx b/ILSpy/Properties/Resources.resx index e38101b12..d98c8cdcc 100644 --- a/ILSpy/Properties/Resources.resx +++ b/ILSpy/Properties/Resources.resx @@ -751,4 +751,7 @@ Are you sure you want to continue? Select version of language to output + + Remove dead stores (use with caution!) + \ No newline at end of file