From bb03a23497210edf037559b8874307c3a6c2d256 Mon Sep 17 00:00:00 2001 From: Alexander Zaytsev Date: Fri, 9 Aug 2019 14:44:30 +1200 Subject: [PATCH] Optimize boolean OrElse --- src/DelegateDecompiler.Tests/BooleanTests.cs | 2 +- src/DelegateDecompiler/OptimizeExpressionVisitor.cs | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/DelegateDecompiler.Tests/BooleanTests.cs b/src/DelegateDecompiler.Tests/BooleanTests.cs index 70fe2db2..3452cf78 100644 --- a/src/DelegateDecompiler.Tests/BooleanTests.cs +++ b/src/DelegateDecompiler.Tests/BooleanTests.cs @@ -350,7 +350,7 @@ public void TestParameterOrElseParameter() Test(expected, expected2, compiled); } - [Test, Ignore("Needs optimization")] + [Test] public void TestFuncOrElseFunc() { Expression, Func, bool>> expected = (x, y) => x.Invoke() || y.Invoke(); diff --git a/src/DelegateDecompiler/OptimizeExpressionVisitor.cs b/src/DelegateDecompiler/OptimizeExpressionVisitor.cs index 560e22e9..f02a1c9a 100644 --- a/src/DelegateDecompiler/OptimizeExpressionVisitor.cs +++ b/src/DelegateDecompiler/OptimizeExpressionVisitor.cs @@ -41,9 +41,9 @@ public override Expression Visit(Expression node) protected override Expression VisitConditional(ConditionalExpression node) { Debug.WriteLine(node); + var test = Visit(node.Test); var ifTrue = Visit(node.IfTrue); var ifFalse = Visit(node.IfFalse); - var test = Visit(node.Test); Expression expression; if (IsCoalesce(test, ifTrue, out expression)) @@ -94,6 +94,11 @@ protected override Expression VisitConditional(ConditionalExpression node) } } + if (ifTrueConstant?.Value is true) + { + return Expression.OrElse(test, ifFalse); + } + if (test.NodeType == ExpressionType.Not) { if (ifTrueConstant?.Value as bool? == false)