Browse Source

Add RemoveDeadStores option

pull/1649/head
Siegfried Pammer 6 years ago
parent
commit
047f119e99
  1. 8
      ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs
  2. 6
      ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs
  3. 14
      ICSharpCode.Decompiler/DecompilerSettings.cs
  4. 2
      ICSharpCode.Decompiler/IL/ControlFlow/ControlFlowSimplification.cs
  5. 2
      ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs
  6. 9
      ILSpy/Properties/Resources.Designer.cs
  7. 3
      ILSpy/Properties/Resources.resx

8
ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs

@ -97,13 +97,13 @@ namespace ICSharpCode.Decompiler.Tests @@ -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 @@ -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)

6
ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs

@ -114,7 +114,7 @@ namespace ICSharpCode.Decompiler.Tests @@ -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 @@ -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 @@ -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)
});
}

14
ICSharpCode.Decompiler/DecompilerSettings.cs

@ -1095,6 +1095,20 @@ namespace ICSharpCode.Decompiler @@ -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

2
ICSharpCode.Decompiler/IL/ControlFlow/ControlFlowSimplification.cs

@ -46,7 +46,7 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow @@ -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()

2
ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs

@ -41,7 +41,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -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<ILVariable>(function.Variables);
while (variableQueue.Count > 0) {
var v = variableQueue.Dequeue();

9
ILSpy/Properties/Resources.Designer.cs generated

@ -801,6 +801,15 @@ namespace ICSharpCode.ILSpy.Properties { @@ -801,6 +801,15 @@ namespace ICSharpCode.ILSpy.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Remove dead stores (use with caution!).
/// </summary>
public static string DecompilerSettings_RemoveDeadStores {
get {
return ResourceManager.GetString("DecompilerSettings.RemoveDeadStores", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Remove optional arguments, if possible.
/// </summary>

3
ILSpy/Properties/Resources.resx

@ -751,4 +751,7 @@ Are you sure you want to continue?</value> @@ -751,4 +751,7 @@ Are you sure you want to continue?</value>
<data name="SelectVersionDropdownTooltip" xml:space="preserve">
<value>Select version of language to output</value>
</data>
<data name="DecompilerSettings.RemoveDeadStores" xml:space="preserve">
<value>Remove dead stores (use with caution!)</value>
</data>
</root>
Loading…
Cancel
Save