From 5d624eb52a8afc5f47a241bc0106f9c04b1771a1 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Fri, 16 Mar 2012 14:08:18 +0000 Subject: [PATCH] Emit better code for binary await expression with constants --- mcs/mcs/async.cs | 8 +- mcs/mcs/ecore.cs | 11 + mcs/mcs/expression.cs | 21 ++ mcs/tests/test-async-13.cs | 13 + mcs/tests/ver-il-net_4_5.xml | 638 +++++++++++++++++++------------------------ 5 files changed, 333 insertions(+), 358 deletions(-) diff --git a/mcs/mcs/async.cs b/mcs/mcs/async.cs index c539ce8da11..5fcc12827c8 100644 --- a/mcs/mcs/async.cs +++ b/mcs/mcs/async.cs @@ -40,6 +40,12 @@ namespace Mono.CSharp } } + public AwaitStatement Statement { + get { + return stmt; + } + } + protected override void CloneTo (CloneContext clonectx, Expression target) { var t = (Await) target; @@ -113,7 +119,7 @@ namespace Mono.CSharp } } - class AwaitStatement : YieldStatement + public class AwaitStatement : YieldStatement { sealed class AwaitableMemberAccess : MemberAccess { diff --git a/mcs/mcs/ecore.cs b/mcs/mcs/ecore.cs index db3c4b7d456..0e3ebbe0fbd 100644 --- a/mcs/mcs/ecore.cs +++ b/mcs/mcs/ecore.cs @@ -1933,6 +1933,12 @@ namespace Mono.CSharp { #region Properties + public override bool IsSideEffectFree { + get { + return expr.IsSideEffectFree; + } + } + public Expression OriginalExpression { get { return orig_expr; @@ -2005,6 +2011,11 @@ namespace Mono.CSharp { expr.Emit (ec); } + public override Expression EmitToField (EmitContext ec) + { + return expr.EmitToField(ec); + } + public override void EmitBranchable (EmitContext ec, Label target, bool on_true) { expr.EmitBranchable (ec, target, on_true); diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 6637e5f2b4a..c6d13c9a990 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -3929,6 +3929,27 @@ namespace Mono.CSharp } } + public override Expression EmitToField (EmitContext ec) + { + if ((oper & Operator.LogicalMask) == 0) { + var await_expr = left as Await; + if (await_expr != null && right.IsSideEffectFree) { + await_expr.Statement.EmitPrologue (ec); + left = await_expr.Statement.GetResultExpression (ec); + return this; + } + + await_expr = right as Await; + if (await_expr != null && left.IsSideEffectFree) { + await_expr.Statement.EmitPrologue (ec); + right = await_expr.Statement.GetResultExpression (ec); + return this; + } + } + + return base.EmitToField (ec); + } + protected override void CloneTo (CloneContext clonectx, Expression t) { Binary target = (Binary) t; diff --git a/mcs/tests/test-async-13.cs b/mcs/tests/test-async-13.cs index ec48eb753b2..54aabc3f37b 100644 --- a/mcs/tests/test-async-13.cs +++ b/mcs/tests/test-async-13.cs @@ -340,6 +340,19 @@ class Tester : Base return 0; } + async Task BinaryTest_5 () + { + var r1 = await Task.FromResult (1) == 9; + if (r1) + return 1; + + var r2 = 1 == await Task.FromResult (1); + if (!r2) + return 2; + + return 0; + } + async Task CallTest_1 () { return Call ( diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index 1bd6d7c6de6..2a20ef84381 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -54129,10 +54129,109 @@ 7 - + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 13 + + + + + 37 + + + + + 304 + + + 13 + + + 7 + + + 439 + + 13 + 17 @@ -54146,10 +54245,13 @@ 7 - + 272 + + 13 + 17 @@ -54157,10 +54259,13 @@ 7 - + 242 + + 13 + 10 @@ -54168,10 +54273,13 @@ 7 - + 232 + + 13 + 9 @@ -54179,10 +54287,13 @@ 7 - + 210 + + 13 + 25 @@ -54190,10 +54301,13 @@ 7 - + 251 + + 13 + 15 @@ -54201,10 +54315,13 @@ 7 - + 233 + + 13 + 14 @@ -54212,10 +54329,13 @@ 7 - + 359 + + 13 + 9 @@ -54226,10 +54346,13 @@ 7 - + 372 + + 13 + 17 @@ -54240,10 +54363,13 @@ 7 - + 200 + + 13 + 9 @@ -54251,10 +54377,13 @@ 7 - + 335 + + 13 + 9 @@ -54265,10 +54394,13 @@ 7 - + 355 + + 13 + 9 @@ -54279,10 +54411,13 @@ 7 - + 248 + + 13 + 9 @@ -54290,10 +54425,13 @@ 7 - + 276 + + 13 + 11 @@ -54304,10 +54442,13 @@ 7 - + 220 + + 13 + 23 @@ -54318,10 +54459,13 @@ 7 - + 543 + + 13 + 9 @@ -54332,10 +54476,13 @@ 7 - + 228 + + 13 + 9 @@ -54343,10 +54490,13 @@ 7 - + 341 + + 13 + 9 @@ -54357,10 +54507,13 @@ 7 - + 372 + + 13 + 25 @@ -54371,10 +54524,13 @@ 7 - + 400 + + 13 + 25 @@ -54385,10 +54541,13 @@ 7 - + 506 + + 13 + 25 @@ -54399,10 +54558,13 @@ 7 - + 555 + + 13 + 10 @@ -54416,10 +54578,13 @@ 7 - + 262 + + 13 + 25 @@ -54427,9 +54592,12 @@ 7 - + - 245 + 229 + + + 13 13 @@ -54438,10 +54606,13 @@ 7 - + 238 + + 13 + 14 @@ -54449,10 +54620,13 @@ 7 - + 392 + + 13 + 13 @@ -54463,10 +54637,13 @@ 7 - + 297 + + 13 + 13 @@ -54474,10 +54651,13 @@ 7 - + 391 + + 13 + 13 @@ -54488,10 +54668,13 @@ 7 - + 258 + + 13 + 10 @@ -54499,10 +54682,13 @@ 7 - + 356 + + 13 + 10 @@ -54513,10 +54699,13 @@ 7 - + 1025 + + 13 + 10 @@ -54539,10 +54728,13 @@ 7 - + 753 + + 13 + 13 @@ -54559,10 +54751,13 @@ 7 - + 238 + + 13 + 9 @@ -54570,10 +54765,13 @@ 7 - + 356 + + 13 + 9 @@ -54584,10 +54782,13 @@ 7 - + 242 + + 13 + 9 @@ -54595,10 +54796,13 @@ 7 - + 426 + + 13 + 9 @@ -54609,10 +54813,13 @@ 7 - + 260 + + 13 + 25 @@ -54620,10 +54827,13 @@ 7 - + 262 + + 13 + 9 @@ -54631,10 +54841,13 @@ 7 - + 225 + + 13 + 9 @@ -54642,10 +54855,13 @@ 7 - + 293 + + 13 + 9 @@ -54653,10 +54869,13 @@ 7 - + 649 + + 13 + 10 @@ -54670,10 +54889,13 @@ 7 - + 459 + + 13 + 13 @@ -54687,10 +54909,13 @@ 7 - + 238 + + 13 + 9 @@ -54698,10 +54923,13 @@ 7 - + 338 + + 13 + 14 @@ -54709,10 +54937,13 @@ 7 - + 378 + + 13 + 9 @@ -54720,10 +54951,13 @@ 7 - + 354 + + 13 + 9 @@ -54734,316 +54968,6 @@ 7 - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - - - - 13 - - -- 2.11.4.GIT