public override Expression Reduce() {
Contract.Ensures(Contract.Result<Expression>() != null);
if (Components.All(x => x.IsMemoryLocationOrConstant()))
return CreateExpression(Components);
return new BlockExpressionBuilder().AddUsingMemoryLocationsOrConstants(
x => new[] { CreateExpression(x) },
Components.ToArray()
).GetExpression();
}