[vm/kernel/bytecode] Remove extra pushes/drops for Set expressions with unused result

Also, bytecode generation of DirectPropertySet and SuperPropertySet is
corrected in case result is used.

Change-Id: I680645f961d9c471579dcbdc9a5b7544cbc9e188
Reviewed-on: https://dart-review.googlesource.com/63343
Reviewed-by: Zach Anderson <zra@google.com>
Reviewed-by: RĂ©gis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 3a07980..0e7872b 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -1033,6 +1033,16 @@
     continuation();
   }
 
+  // For certain expressions wrapped into ExpressionStatement we can
+  // omit pushing result on the stack.
+  bool isExpressionWithoutResult(Expression expr) =>
+      expr.parent is ExpressionStatement &&
+      (expr is VariableSet ||
+          expr is PropertySet ||
+          expr is StaticSet ||
+          expr is SuperPropertySet ||
+          expr is DirectPropertySet);
+
   @override
   defaultTreeNode(Node node) => throw new UnsupportedOperationError(
       'Unsupported node ${node.runtimeType}');
@@ -1154,15 +1164,28 @@
 
   @override
   visitDirectPropertySet(DirectPropertySet node) {
+    final int temp = locals.tempIndexInFrame(node);
+    final bool hasResult = !isExpressionWithoutResult(node);
+
     node.receiver.accept(this);
     node.value.accept(this);
+
+    if (hasResult) {
+      asm.emitStoreLocal(temp);
+    }
+
     final target = node.target;
     if (target is Field || (target is Procedure && target.isSetter)) {
       _genStaticCall(target, new ConstantArgDesc(2), 2, isSet: true);
+      asm.emitDrop1();
     } else {
       throw new UnsupportedOperationError(
           'Unsupported DirectPropertySet with target ${target.runtimeType} $target');
     }
+
+    if (hasResult) {
+      asm.emitPush(temp);
+    }
   }
 
   @override
@@ -1353,15 +1376,24 @@
   @override
   visitPropertySet(PropertySet node) {
     final int temp = locals.tempIndexInFrame(node);
+    final bool hasResult = !isExpressionWithoutResult(node);
+
     node.receiver.accept(this);
     node.value.accept(this);
-    asm.emitStoreLocal(temp);
+
+    if (hasResult) {
+      asm.emitStoreLocal(temp);
+    }
+
     final argDescIndex = cp.add(new ConstantArgDesc(2));
     final icdataIndex = cp.add(
         new ConstantICData(InvocationKind.setter, node.name, argDescIndex));
     asm.emitInstanceCall1(2, icdataIndex);
     asm.emitDrop1();
-    asm.emitPush(temp);
+
+    if (hasResult) {
+      asm.emitPush(temp);
+    }
   }
 
   @override
@@ -1401,8 +1433,16 @@
 
   @override
   visitSuperPropertySet(SuperPropertySet node) {
+    final int temp = locals.tempIndexInFrame(node);
+    final bool hasResult = !isExpressionWithoutResult(node);
+
     _genPushReceiver();
     node.value.accept(this);
+
+    if (hasResult) {
+      asm.emitStoreLocal(temp);
+    }
+
     final Member target = hierarchy
         .getDispatchTarget(enclosingClass.superclass, node.name, setter: true);
     if (target == null) {
@@ -1411,10 +1451,15 @@
     }
     if (target is Field || (target is Procedure && target.isSetter)) {
       _genStaticCall(target, new ConstantArgDesc(2), 2, isSet: true);
+      asm.emitDrop1();
     } else {
       throw new UnsupportedOperationError(
           'Unsupported SuperPropertySet with target ${target.runtimeType} $target');
     }
+
+    if (hasResult) {
+      asm.emitPush(temp);
+    }
   }
 
   @override
@@ -1503,8 +1548,14 @@
 
   @override
   visitStaticSet(StaticSet node) {
+    final bool hasResult = !isExpressionWithoutResult(node);
+
     node.value.accept(this);
-    _genDupTOS(locals.tempIndexInFrame(node));
+
+    if (hasResult) {
+      _genDupTOS(locals.tempIndexInFrame(node));
+    }
+
     final target = node.target;
     if (target is Field) {
       int cpIndex = cp.add(new ConstantField(target));
@@ -1587,21 +1638,32 @@
   @override
   visitVariableSet(VariableSet node) {
     final v = node.variable;
+    final bool hasResult = !isExpressionWithoutResult(node);
+
     if (locals.isCaptured(v)) {
       _genPushContextForVariable(v);
 
       node.value.accept(this);
 
-      // Preserve value.
       final int temp = locals.tempIndexInFrame(node);
-      asm.emitStoreLocal(temp);
+      if (hasResult) {
+        asm.emitStoreLocal(temp);
+      }
 
       _genStoreVar(v);
 
-      asm.emitPush(temp);
+      if (hasResult) {
+        asm.emitPush(temp);
+      }
     } else {
       node.value.accept(this);
-      asm.emitStoreLocal(locals.getVarIndexInFrame(v));
+
+      final int localIndex = locals.getVarIndexInFrame(v);
+      if (hasResult) {
+        asm.emitStoreLocal(localIndex);
+      } else {
+        asm.emitPopLocal(localIndex);
+      }
     }
   }
 
@@ -1706,8 +1768,11 @@
 
   @override
   visitExpressionStatement(ExpressionStatement node) {
-    node.expression.accept(this);
-    asm.emitDrop1();
+    final expr = node.expression;
+    expr.accept(this);
+    if (!isExpressionWithoutResult(expr)) {
+      asm.emitDrop1();
+    }
   }
 
   @override
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 5de794b..6a19caa 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -966,6 +966,16 @@
   }
 
   @override
+  visitDirectPropertySet(DirectPropertySet node) {
+    _visit(node, temps: 1);
+  }
+
+  @override
+  visitSuperPropertySet(SuperPropertySet node) {
+    _visit(node, temps: 1);
+  }
+
+  @override
   visitSwitchStatement(SwitchStatement node) {
     _visit(node, temps: 1);
   }
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index 29d4cb1..e233c8c 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -51,18 +51,15 @@
   Push                 r5
   PushConstant         CP#23
   IndirectStaticCall   1, CP#2
-  StoreLocal           r2
-  Drop1
+  PopLocal             r2
   Push                 r5
   PushConstant         CP#24
   IndirectStaticCall   1, CP#2
-  StoreLocal           r3
-  Drop1
+  PopLocal             r3
   Push                 r5
   PushConstant         CP#25
   IndirectStaticCall   1, CP#2
-  StoreLocal           r4
-  Drop1
+  PopLocal             r4
   PushConstant         CP#26
   Push                 r5
   PushConstant         CP#27
@@ -130,10 +127,7 @@
 Try #0 start:
   Push                 r4
   PushConstant         CP#12
-  StoreLocal           r8
   StoreFieldTOS        CP#6
-  Push                 r8
-  Drop1
   Jump                 L2
 L2:
   Push                 r4
@@ -262,26 +256,19 @@
   LoadFieldTOS         CP#17
   PushConstant         CP#33
   IndirectStaticCall   1, CP#4
-  StoreLocal           r2
-  Drop1
+  PopLocal             r2
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#17
   PushConstant         CP#34
   IndirectStaticCall   1, CP#4
-  StoreLocal           r3
   StoreFieldTOS        CP#9
-  Push                 r3
-  Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#17
   PushConstant         CP#35
   IndirectStaticCall   1, CP#4
-  StoreLocal           r3
   StoreFieldTOS        CP#10
-  Push                 r3
-  Drop1
   PushConstant         CP#36
   Push                 r0
   LoadFieldTOS         CP#17
@@ -388,10 +375,7 @@
 L2:
   Push                 r4
   Push                 r1
-  StoreLocal           r8
   StoreFieldTOS        CP#13
-  Push                 r8
-  Drop1
   Push                 r4
   PushConstant         CP#20
   StoreFieldTOS        CP#0
@@ -424,10 +408,7 @@
   LoadFieldTOS         CP#13
   Push                 r1
   InstanceCall1        2, CP#23
-  StoreLocal           r8
   StoreFieldTOS        CP#8
-  Push                 r8
-  Drop1
   Jump                 L4
 L4:
   Push                 r4
@@ -572,26 +553,19 @@
   LoadFieldTOS         CP#28
   PushConstant         CP#46
   IndirectStaticCall   1, CP#3
-  StoreLocal           r2
-  Drop1
+  PopLocal             r2
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#28
   PushConstant         CP#47
   IndirectStaticCall   1, CP#3
-  StoreLocal           r3
   StoreFieldTOS        CP#8
-  Push                 r3
-  Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#28
   PushConstant         CP#48
   IndirectStaticCall   1, CP#3
-  StoreLocal           r3
   StoreFieldTOS        CP#9
-  Push                 r3
-  Drop1
   PushConstant         CP#49
   Push                 r0
   LoadFieldTOS         CP#28
@@ -756,10 +730,7 @@
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#0
-  StoreLocal           r9
   StoreFieldTOS        CP#14
-  Push                 r9
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#1
@@ -772,10 +743,7 @@
   Push                 r4
   LoadFieldTOS         CP#0
   InstanceCall1        2, CP#24
-  StoreLocal           r9
   StoreFieldTOS        CP#13
-  Push                 r9
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#1
@@ -841,10 +809,7 @@
   Push                 r1
   InstanceCall1        2, CP#31
   InstanceCall1        2, CP#32
-  StoreLocal           r9
   StoreFieldTOS        CP#0
-  Push                 r9
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#1
   PopLocal             r4
@@ -886,10 +851,7 @@
   LoadFieldTOS         CP#0
   Push                 r8
   InstanceCall1        2, CP#35
-  StoreLocal           r9
   StoreFieldTOS        CP#0
-  Push                 r9
-  Drop1
   Push                 r8
   PushConstant         CP#25
   InstanceCall1        2, CP#36
@@ -901,10 +863,7 @@
   LoadFieldTOS         CP#1
   Push                 r4
   LoadFieldTOS         CP#0
-  StoreLocal           r8
   StoreFieldTOS        CP#7
-  Push                 r8
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#1
   PopLocal             r4
@@ -1076,26 +1035,19 @@
   LoadFieldTOS         CP#21
   PushConstant         CP#55
   IndirectStaticCall   1, CP#5
-  StoreLocal           r2
-  Drop1
+  PopLocal             r2
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#21
   PushConstant         CP#56
   IndirectStaticCall   1, CP#5
-  StoreLocal           r3
   StoreFieldTOS        CP#10
-  Push                 r3
-  Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#21
   PushConstant         CP#57
   IndirectStaticCall   1, CP#5
-  StoreLocal           r3
   StoreFieldTOS        CP#11
-  Push                 r3
-  Drop1
   PushConstant         CP#58
   Push                 r0
   LoadFieldTOS         CP#21
@@ -1218,10 +1170,7 @@
   LoadFieldTOS         CP#3
   Push                 r4
   LoadFieldTOS         CP#0
-  StoreLocal           r12
   StoreFieldTOS        CP#2
-  Push                 r12
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   PushConstant         CP#20
@@ -1261,10 +1210,7 @@
   LoadFieldTOS         CP#2
   Push                 r1
   InstanceCall1        2, CP#25
-  StoreLocal           r12
   StoreFieldTOS        CP#0
-  Push                 r12
-  Drop1
   Jump                 L3
 Try #2 end:
 Try #2 handler:
@@ -1307,10 +1253,7 @@
   LoadFieldTOS         CP#3
   LoadFieldTOS         CP#3
   PushConstant         CP#30
-  StoreLocal           r12
   StoreFieldTOS        CP#9
-  Push                 r12
-  Drop1
   Jump                 L5
 L4:
   Push                 r4
@@ -1319,10 +1262,7 @@
   Push                 r4
   LoadFieldTOS         CP#3
   LoadFieldTOS         CP#0
-  StoreLocal           r12
   StoreFieldTOS        CP#2
-  Push                 r12
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   LoadFieldTOS         CP#3
@@ -1370,10 +1310,7 @@
   LoadFieldTOS         CP#2
   Push                 r1
   InstanceCall1        2, CP#33
-  StoreLocal           r12
   StoreFieldTOS        CP#0
-  Push                 r12
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   LoadFieldTOS         CP#3
@@ -1416,10 +1353,7 @@
   LoadFieldTOS         CP#3
   Push                 r4
   LoadFieldTOS         CP#0
-  StoreLocal           r10
   StoreFieldTOS        CP#2
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   PushConstant         CP#36
@@ -1459,18 +1393,12 @@
   LoadFieldTOS         CP#2
   Push                 r1
   InstanceCall1        2, CP#38
-  StoreLocal           r10
   StoreFieldTOS        CP#0
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   Push                 r4
   LoadFieldTOS         CP#0
-  StoreLocal           r10
   StoreFieldTOS        CP#9
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   PopLocal             r4
@@ -1497,10 +1425,7 @@
   LoadFieldTOS         CP#3
   Push                 r4
   LoadFieldTOS         CP#0
-  StoreLocal           r10
   StoreFieldTOS        CP#2
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   PushConstant         CP#40
@@ -1540,18 +1465,12 @@
   LoadFieldTOS         CP#2
   Push                 r1
   InstanceCall1        2, CP#42
-  StoreLocal           r10
   StoreFieldTOS        CP#0
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   Push                 r4
   LoadFieldTOS         CP#0
-  StoreLocal           r10
   StoreFieldTOS        CP#9
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   PopLocal             r4
@@ -1575,10 +1494,7 @@
   LoadFieldTOS         CP#3
   Push                 r4
   LoadFieldTOS         CP#0
-  StoreLocal           r10
   StoreFieldTOS        CP#2
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   PushConstant         CP#44
@@ -1618,18 +1534,12 @@
   LoadFieldTOS         CP#2
   Push                 r1
   InstanceCall1        2, CP#46
-  StoreLocal           r10
   StoreFieldTOS        CP#0
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   Push                 r4
   LoadFieldTOS         CP#0
-  StoreLocal           r10
   StoreFieldTOS        CP#9
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#3
   PopLocal             r4
@@ -1877,10 +1787,7 @@
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#1
   PushConstant         CP#19
-  StoreLocal           r10
   StoreFieldTOS        CP#0
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#1
   PushConstant         CP#20
@@ -1911,10 +1818,7 @@
 L6:
   Push                 r4
   Push                 r1
-  StoreLocal           r10
   StoreFieldTOS        CP#0
-  Push                 r10
-  Drop1
   Push                 r4
   LoadFieldTOS         CP#1
   Push                 r4
@@ -1924,10 +1828,7 @@
   Push                 r4
   LoadFieldTOS         CP#0
   InstanceCall1        2, CP#25
-  StoreLocal           r10
   StoreFieldTOS        CP#10
-  Push                 r10
-  Drop1
   Jump                 L2
   Jump                 L3
 Try #1 end:
@@ -2078,26 +1979,19 @@
   LoadFieldTOS         CP#21
   PushConstant         CP#39
   IndirectStaticCall   1, CP#6
-  StoreLocal           r2
-  Drop1
+  PopLocal             r2
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#21
   PushConstant         CP#40
   IndirectStaticCall   1, CP#6
-  StoreLocal           r3
   StoreFieldTOS        CP#11
-  Push                 r3
-  Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#21
   PushConstant         CP#41
   IndirectStaticCall   1, CP#6
-  StoreLocal           r3
   StoreFieldTOS        CP#12
-  Push                 r3
-  Drop1
   PushConstant         CP#42
   Push                 r0
   LoadFieldTOS         CP#21
@@ -2217,26 +2111,19 @@
   LoadFieldTOS         CP#16
   PushConstant         CP#34
   IndirectStaticCall   1, CP#3
-  StoreLocal           r2
-  Drop1
+  PopLocal             r2
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#16
   PushConstant         CP#35
   IndirectStaticCall   1, CP#3
-  StoreLocal           r3
   StoreFieldTOS        CP#8
-  Push                 r3
-  Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#16
   PushConstant         CP#36
   IndirectStaticCall   1, CP#3
-  StoreLocal           r3
   StoreFieldTOS        CP#9
-  Push                 r3
-  Drop1
   PushConstant         CP#37
   Push                 r0
   LoadFieldTOS         CP#16
@@ -2359,10 +2246,7 @@
 L2:
   Push                 r4
   PushConstant         CP#25
-  StoreLocal           r8
   StoreFieldTOS        CP#7
-  Push                 r8
-  Drop1
   Jump                 L4
 L4:
   Push                 r4
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index d135ff4..44fbe90 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -119,10 +119,7 @@
   Push                 FP[-5]
   PushConstant         CP#4
   IndirectStaticCall   2, CP#3
-  StoreLocal           r0
-  Push                 r0
   StoreStaticTOS       CP#5
-  Drop1
   PushConstant         CP#6
   ReturnTOS
 }
@@ -160,10 +157,7 @@
   IndirectStaticCall   0, CP#8
   PushConstant         CP#10
   IndirectStaticCall   2, CP#2
-  StoreLocal           r0
-  Push                 r0
   StoreStaticTOS       CP#0
-  Drop1
 L1:
   PushConstant         CP#0
   PushStatic           CP#0
@@ -432,15 +426,9 @@
   Entry                2
   CheckStack
   Push                 FP[-5]
-  StoreLocal           r0
-  Push                 r0
   StoreStaticTOS       CP#0
-  Drop1
   PushConstant         CP#1
-  StoreLocal           r1
-  Push                 r1
   StoreStaticTOS       CP#2
-  Drop1
   PushConstant         CP#1
   ReturnTOS
 }
@@ -485,10 +473,7 @@
   PushConstant         CP#5
   PushStatic           CP#5
   InstanceCall1        1, CP#9
-  StoreLocal           r0
-  Push                 r0
   StoreStaticTOS       CP#0
-  Drop1
 L3:
   PushConstant         CP#0
   PushStatic           CP#0
@@ -603,10 +588,7 @@
   Entry                1
   CheckStack
   Push                 FP[-5]
-  StoreLocal           r0
-  Push                 r0
   StoreStaticTOS       CP#0
-  Drop1
   PushConstant         CP#1
   ReturnTOS
 }
@@ -622,20 +604,11 @@
   Entry                3
   CheckStack
   Push                 FP[-7]
-  StoreLocal           r0
-  Push                 r0
   StoreStaticTOS       CP#0
-  Drop1
   Push                 FP[-6]
-  StoreLocal           r1
-  Push                 r1
   StoreStaticTOS       CP#1
-  Drop1
   Push                 FP[-5]
-  StoreLocal           r2
-  Push                 r2
   StoreStaticTOS       CP#2
-  Drop1
   PushConstant         CP#3
   ReturnTOS
 }
@@ -745,12 +718,9 @@
   Entry                1
   CheckStack
   PushConstant         CP#0
-  StoreLocal           r0
-  Push                 r0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
   Drop1
-  Drop1
   PushConstant         CP#3
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 773b4f1..ee760ea 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -654,10 +654,7 @@
   LoadFieldTOS         CP#0
   PushConstant         CP#3
   InstanceCall1        2, CP#18
-  StoreLocal           r2
   StoreFieldTOS        CP#0
-  Push                 r2
-  Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#1
@@ -670,10 +667,7 @@
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#0
   InstanceCall1        2, CP#21
-  StoreLocal           r2
   StoreFieldTOS        CP#0
-  Push                 r2
-  Drop1
   PushConstant         CP#7
   ReturnTOS
 
@@ -714,10 +708,7 @@
   LoadFieldTOS         CP#0
   PushConstant         CP#2
   InstanceCall1        2, CP#12
-  StoreLocal           r2
   StoreFieldTOS        CP#0
-  Push                 r2
-  Drop1
   Push                 r0
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#1
@@ -780,11 +771,8 @@
   LoadFieldTOS         CP#0
   Push                 r0
   LoadFieldTOS         CP#0
-  StoreLocal           r2
   InstanceCall1        2, CP#39
   Drop1
-  Push                 r2
-  Drop1
   PushConstant         CP#7
   ReturnTOS
 
@@ -1019,10 +1007,7 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#2
   InstanceCall1        2, CP#25
-  StoreLocal           r2
   StoreFieldTOS        CP#2
-  Push                 r2
-  Drop1
   PushConstant         CP#14
   ReturnTOS
 
@@ -1136,10 +1121,7 @@
   LoadFieldTOS         CP#10
   PushConstant         CP#13
   InstanceCall1        2, CP#15
-  StoreLocal           r2
   StoreFieldTOS        CP#10
-  Push                 r2
-  Drop1
   PushConstant         CP#0
   ReturnTOS
 
@@ -1321,10 +1303,7 @@
   LoadFieldTOS         CP#2
   Push                 FP[-5]
   InstanceCall1        2, CP#10
-  StoreLocal           r2
   StoreFieldTOS        CP#2
-  Push                 r2
-  Drop1
   PushConstant         CP#5
   ReturnTOS
 
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
index fe91f5f..17a68e1 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -25,8 +25,7 @@
   Push                 r1
   InstanceCall1        2, CP#6
   InstanceCall1        2, CP#7
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Push                 r1
   PushConstant         CP#8
   InstanceCall1        2, CP#9
@@ -91,8 +90,7 @@
   Push                 r1
   InstanceCall1        2, CP#7
   InstanceCall1        2, CP#8
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Push                 r1
   PushConstant         CP#9
   InstanceCall1        2, CP#10
@@ -163,8 +161,7 @@
   Push                 r1
   InstanceCall1        2, CP#9
   InstanceCall1        2, CP#10
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
 L3:
   Push                 r1
   PushConstant         CP#11
@@ -236,8 +233,7 @@
   Push                 r2
   InstanceCall1        2, CP#8
   InstanceCall1        2, CP#9
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L2
 L1:
   Push                 r0
@@ -281,13 +277,11 @@
   Push                 r1
   InstanceCall1        2, CP#2
   InstanceCall1        2, CP#3
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Push                 r1
   PushConstant         CP#4
   InstanceCall1        2, CP#5
-  StoreLocal           r1
-  Drop1
+  PopLocal             r1
   Push                 r1
   Push                 FP[-5]
   InstanceCall1        1, CP#7
@@ -346,8 +340,7 @@
   Push                 r0
   Push                 r2
   InstanceCall1        2, CP#7
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L2
 L1:
   Push                 r0
@@ -395,13 +388,11 @@
   InstanceCall1        1, CP#6
   PopLocal             r3
   Push                 r3
-  StoreLocal           r1
-  Drop1
+  PopLocal             r1
   Push                 r0
   Push                 r1
   InstanceCall1        2, CP#8
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L2
 L1:
   Push                 r0
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
index c82563b..a7d303b 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -31,18 +31,15 @@
   Jump                 L4
 L1:
   PushConstant         CP#9
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L4
 L2:
   PushConstant         CP#10
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L4
 L3:
   PushConstant         CP#11
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L4
 L4:
   Push                 r0
@@ -136,18 +133,15 @@
   Jump                 L3
 L1:
   PushConstant         CP#15
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L4
 L2:
   PushConstant         CP#16
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L4
 L3:
   PushConstant         CP#17
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
 L4:
   Push                 r0
   ReturnTOS
@@ -249,19 +243,16 @@
   Jump                 L3
 L1:
   PushConstant         CP#15
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Jump                 L2
 L2:
   PushConstant         CP#16
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   PushConstant         CP#17
   ReturnTOS
 L3:
   PushConstant         CP#18
-  StoreLocal           r0
-  Drop1
+  PopLocal             r0
   Push                 r0
   ReturnTOS
   PushConstant         CP#0
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index 2d9425d..baa0ac2 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -442,10 +442,7 @@
   Drop1
   Push                 r0
   PushConstant         CP#11
-  StoreLocal           r5
   StoreFieldTOS        CP#2
-  Push                 r5
-  Drop1
   Jump                 L1
 L1:
   PushConstant         CP#12
@@ -1027,8 +1024,7 @@
   Push                 r5
   Push                 r0
   StoreFieldTOS        CP#5
-  StoreLocal           r2
-  Drop1
+  PopLocal             r2
   Jump                 L1
 Try #0 end:
 Try #0 handler:
@@ -1065,7 +1061,7 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 15, end 32, handler 32, needs-stack-trace, types [CP#11]
+  try-index 0, outer -1, start 15, end 31, handler 31, needs-stack-trace, types [CP#11]
 }
 ConstantPool {
   [0] = ContextOffset parent
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index 54a5a69..618b5b4 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -142,11 +142,8 @@
   PushConstant         CP#13
   PushConstant         CP#14
   AssertAssignable     0, CP#15
-  StoreLocal           r0
   InstanceCall1        2, CP#17
   Drop1
-  Push                 r0
-  Drop1
   PushConstant         CP#1
   ReturnTOS
 }
@@ -441,10 +438,7 @@
   PushConstant         CP#1
   PushConstant         CP#2
   AssertAssignable     0, CP#3
-  StoreLocal           r0
-  Push                 r0
   StoreStaticTOS       CP#4
-  Drop1
   PushConstant         CP#0
   ReturnTOS
 }