From 48b77d4742db771fd35c151bbb119e4c7cf6d9aa Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 24 Sep 2017 19:28:43 +0200 Subject: [PATCH] ExpressionTransform: comp(box T(..) [!=]= ldnull) -> comp(.. [!=]= ldnull) where T.Kind == TypeParameter --- .../IL/Transforms/ExpressionTransforms.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs b/ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs index 57ad20b20..31bd540dc 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs @@ -131,13 +131,23 @@ namespace ICSharpCode.Decompiler.IL.Transforms return; } } + + if (inst.Right.MatchLdNull() && inst.Left.MatchBox(out arg, out var type) && type.Kind == TypeKind.TypeParameter) { + if (inst.Kind == ComparisonKind.Equality) { + context.Step("comp(box T(..) == ldnull) -> comp(.. == ldnull)", inst); + inst.Left = arg; + } + if (inst.Kind == ComparisonKind.Inequality) { + context.Step("comp(box T(..) != ldnull) -> comp(.. != ldnull)", inst); + inst.Left = arg; + } + } } protected internal override void VisitConv(Conv inst) { inst.Argument.AcceptVisitor(this); - ILInstruction array; - if (inst.Argument.MatchLdLen(StackType.I, out array) && inst.TargetType.IsIntegerType() && !inst.CheckForOverflow) { + if (inst.Argument.MatchLdLen(StackType.I, out ILInstruction array) && inst.TargetType.IsIntegerType() && !inst.CheckForOverflow) { context.Step("conv.i4(ldlen array) => ldlen.i4(array)", inst); inst.AddILRange(inst.Argument.ILRange); inst.ReplaceWith(new LdLen(inst.TargetType.GetStackType(), array) { ILRange = inst.ILRange });