Merge revision r14430 to trunk.  Do not evaluate arguments of an instance send if that instance send is being inlined. The inliner will take care of evaluating them.
Review URL: https://codereview.chromium.org//11275122

git-svn-id: http://dart.googlecode.com/svn/trunk@14458 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart
index 2dbd9a3..50b8006 100644
--- a/lib/compiler/implementation/ssa/builder.dart
+++ b/lib/compiler/implementation/ssa/builder.dart
@@ -2558,6 +2558,13 @@
       return;
     }
 
+    Element element = elements[node];
+    if (element != null && compiler.world.hasNoOverridingMember(element)) {
+      if (tryInlineMethod(element, selector, node.arguments)) {
+        return;
+      }
+    }
+
     if (node.receiver == null) {
       inputs.add(localsHandler.readThis());
     } else {
@@ -2566,13 +2573,6 @@
     }
 
     addDynamicSendArgumentsToList(node, inputs);
-
-    Element element = elements[node];
-    if (element != null && compiler.world.hasNoOverridingMember(element)) {
-      if (tryInlineMethod(element, selector, node.arguments)) {
-        return;
-      }
-    }
     // The first entry in the inputs list is the receiver.
     pushWithPosition(new HInvokeDynamicMethod(selector, inputs), node);
 
diff --git a/tests/language/inline_argument_test.dart b/tests/language/inline_argument_test.dart
new file mode 100644
index 0000000..a04786f
--- /dev/null
+++ b/tests/language/inline_argument_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that when inlining A.foo, we're not evaluating the argument
+// twice.
+
+class A {
+  var field = 0;
+
+  foo(b) {
+    Expect.equals(0, b);
+    Expect.equals(0, b);
+  }
+
+  bar() {
+    foo(field++);
+  }
+}
+
+main() {
+  var a = new A();
+  a.bar();
+  Expect.equals(1, a.field);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 34007a7..91a307d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 2
 BUILD 2
-PATCH 0
+PATCH 1