[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
}