From af40871225fc40161284765d1735fe2796f4338b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 2 Oct 2017 23:33:36 +0200 Subject: [PATCH] Avoid unnecessary casts in comparison operators. --- .../CSharp/ExpressionBuilder.cs | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 1b63faf4f..677ed3db5 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -533,8 +533,27 @@ namespace ICSharpCode.Decompiler.CSharp /// TranslatedExpression TranslateComp(Comp inst) { + var op = inst.Kind.ToBinaryOperatorType(); var left = Translate(inst.Left); var right = Translate(inst.Right); + left = PrepareArithmeticArgument(left, inst.InputType, inst.Sign, inst.IsLifted); + right = PrepareArithmeticArgument(right, inst.InputType, inst.Sign, inst.IsLifted); + + // Special case comparisons with enum and char literals + left = AdjustConstantExpressionToType(left, right.Type); + right = AdjustConstantExpressionToType(right, left.Type); + + // attempt comparison without any additional casts + var rr = resolver.ResolveBinaryOperator(inst.Kind.ToBinaryOperatorType(), left.ResolveResult, right.ResolveResult) + as OperatorResolveResult; + if (rr != null && !rr.IsError + && NullableType.GetUnderlyingType(rr.Operands[0].Type).GetSign() == inst.Sign + && NullableType.GetUnderlyingType(rr.Operands[1].Type).GetSign() == inst.Sign) + { + return new BinaryOperatorExpression(left.Expression, op, right.Expression) + .WithILInstruction(inst) + .WithRR(rr); + } // Ensure the inputs have the correct sign: KnownTypeCode inputType = KnownTypeCode.None; switch (inst.InputType) { @@ -554,7 +573,6 @@ namespace ICSharpCode.Decompiler.CSharp left = left.ConvertTo(targetType, this); right = right.ConvertTo(targetType, this); } - var op = inst.Kind.ToBinaryOperatorType(); return new BinaryOperatorExpression(left.Expression, op, right.Expression) .WithILInstruction(inst) .WithRR(new OperatorResolveResult(compilation.FindType(TypeCode.Boolean),