[vm/kernel/bytecode] Fix number of checked arguments in bytecode calls

Number of checked arguments is corrected in ICData objects created when
reading bytecode, both for instance and static calls.

InstanceCall1 and InstanceCall2 bytecode instructions are replaced with
InstanceCall which works for any number of checked arguments. This makes
decision on number of checked arguments internal to VM and it is no longer
exposed to bytecode.

Change-Id: I0bba01eca6347336f3832de863b2ce4715fda04a
Reviewed-on: https://dart-review.googlesource.com/69421
Reviewed-by: RĂ©gis Crelier <regis@google.com>
Reviewed-by: Zach Anderson <zra@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index aec44bf..bc3f8ac 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -232,12 +232,8 @@
     emitWord(_encodeAD(Opcode.kStaticCall, ra, rd));
   }
 
-  void emitInstanceCall1(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kInstanceCall1, ra, rd));
-  }
-
-  void emitInstanceCall2(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kInstanceCall2, ra, rd));
+  void emitInstanceCall(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kInstanceCall, ra, rd));
   }
 
   void emitInstanceCall1Opt(int ra, int rd) {
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index 809c47c..5ca0253 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -34,6 +34,9 @@
 //    D = index of TypeArgumentsField constant pool entry corresponding
 //    to an instance's class.
 //
+// 10. InstanceCall1 and InstanceCall2 instructions are superseded by
+//     InstanceCall which works for any number of checked arguments.
+//
 
 enum Opcode {
   kTrap,
@@ -59,8 +62,7 @@
   kPopLocal,
   kIndirectStaticCall,
   kStaticCall,
-  kInstanceCall1,
-  kInstanceCall2,
+  kInstanceCall,
   kInstanceCall1Opt,
   kInstanceCall2Opt,
   kPushPolymorphicInstanceCall,
@@ -316,9 +318,7 @@
       Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
   Opcode.kStaticCall: const Format(
       Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kInstanceCall1: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kInstanceCall2: const Format(
+  Opcode.kInstanceCall: const Format(
       Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
   Opcode.kInstanceCall1Opt: const Format(
       Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index f30fca6..0892e67 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -577,7 +577,7 @@
     final argDescIndex = cp.add(new ConstantArgDesc(4));
     final icdataIndex = cp.add(new ConstantICData(
         InvocationKind.method, objectInstanceOf.name, argDescIndex));
-    asm.emitInstanceCall1(4, icdataIndex);
+    asm.emitInstanceCall(4, icdataIndex);
   }
 
   void start(Member node) {
@@ -1161,7 +1161,7 @@
       final argDescIndex = cp.add(new ConstantArgDesc(4));
       final icdataIndex = cp.add(new ConstantICData(
           InvocationKind.method, objectAs.name, argDescIndex));
-      asm.emitInstanceCall1(4, icdataIndex);
+      asm.emitInstanceCall(4, icdataIndex);
     }
   }
 
@@ -1458,8 +1458,7 @@
         args.named.length +
         1 /* receiver */ +
         (args.types.isNotEmpty ? 1 : 0) /* type arguments */;
-    // TODO(alexmarkov): figure out when generate InstanceCall2 (2 checked arguments).
-    asm.emitInstanceCall1(totalArgCount, icdataIndex);
+    asm.emitInstanceCall(totalArgCount, icdataIndex);
   }
 
   @override
@@ -1468,7 +1467,7 @@
     final argDescIndex = cp.add(new ConstantArgDesc(1));
     final icdataIndex = cp.add(
         new ConstantICData(InvocationKind.getter, node.name, argDescIndex));
-    asm.emitInstanceCall1(1, icdataIndex);
+    asm.emitInstanceCall(1, icdataIndex);
   }
 
   @override
@@ -1486,7 +1485,7 @@
     final argDescIndex = cp.add(new ConstantArgDesc(2));
     final icdataIndex = cp.add(
         new ConstantICData(InvocationKind.setter, node.name, argDescIndex));
-    asm.emitInstanceCall1(2, icdataIndex);
+    asm.emitInstanceCall(2, icdataIndex);
     asm.emitDrop1();
 
     if (hasResult) {
@@ -1882,7 +1881,7 @@
     const kMoveNext = 'moveNext'; // Iterator.moveNext
     const kCurrent = 'current'; // Iterator.current
 
-    asm.emitInstanceCall1(
+    asm.emitInstanceCall(
         1,
         cp.add(new ConstantICData(InvocationKind.getter, new Name(kIterator),
             cp.add(new ConstantArgDesc(1)))));
@@ -1910,7 +1909,7 @@
       asm.emitPush(iteratorTemp);
     }
 
-    asm.emitInstanceCall1(
+    asm.emitInstanceCall(
         1,
         cp.add(new ConstantICData(InvocationKind.method, new Name(kMoveNext),
             cp.add(new ConstantArgDesc(1)))));
@@ -1921,7 +1920,7 @@
     _genPushContextIfCaptured(node.variable);
 
     asm.emitPush(iteratorTemp);
-    asm.emitInstanceCall1(
+    asm.emitInstanceCall(
         1,
         cp.add(new ConstantICData(InvocationKind.getter, new Name(kCurrent),
             cp.add(new ConstantArgDesc(1)))));
@@ -2051,9 +2050,7 @@
         for (var expr in switchCase.expressions) {
           asm.emitPush(temp);
           _genPushConstExpr(expr);
-          // TODO(alexmarkov): generate InstanceCall2 once we have a way to
-          // mark ICData as having 2 checked arguments.
-          asm.emitInstanceCall1(
+          asm.emitInstanceCall(
               2,
               cp.add(new ConstantICData(
                   InvocationKind.method, new Name('=='), equalsArgDesc)));
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
index 3b0bcbc..3f5cf69 100644
--- a/pkg/vm/testcases/bytecode/asserts.dart.expect
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -38,7 +38,7 @@
   CheckStack
   JumpIfNoAsserts      L1
   Push                 FP[-6]
-  InstanceCall1        1, CP#1
+  InstanceCall         1, CP#1
   AssertBoolean        0
   PushConstant         CP#2
   IfEqStrictTOS
@@ -46,7 +46,7 @@
   PushConstant         CP#3
   PushConstant         CP#3
   Push                 FP[-5]
-  InstanceCall1        1, CP#4
+  InstanceCall         1, CP#4
   PushConstant         CP#6
   IndirectStaticCall   3, CP#5
   Drop1
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index 25ce727..26fbf21 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -137,7 +137,7 @@
   LoadContextVar       6
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#19
+  InstanceCall         3, CP#19
   Drop1
   Jump                 L3
 L3:
@@ -245,7 +245,7 @@
   Drop1
   Push                 r0
   LoadContextVar       6
-  InstanceCall1        1, CP#33
+  InstanceCall         1, CP#33
   ReturnTOS
   Push                 r0
   LoadContextParent
@@ -346,7 +346,7 @@
   Drop1
   Push                 r0
   LoadContextVar       3
-  InstanceCall1        1, CP#27
+  InstanceCall         1, CP#27
   ReturnTOS
   Push                 r0
   LoadContextParent
@@ -432,7 +432,7 @@
   LoadContextVar       3
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#13
+  InstanceCall         3, CP#13
   Drop1
   Jump                 L3
 L3:
@@ -556,7 +556,7 @@
   Drop1
   Push                 r0
   LoadContextVar       8
-  InstanceCall1        1, CP#32
+  InstanceCall         1, CP#32
   ReturnTOS
   Push                 r0
   LoadContextParent
@@ -680,7 +680,7 @@
   Push                 r4
   LoadContextVar       6
   Push                 r1
-  InstanceCall1        2, CP#14
+  InstanceCall         2, CP#14
   StoreContextVar      7
   Jump                 L4
 L4:
@@ -712,7 +712,7 @@
   LoadContextVar       8
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#18
+  InstanceCall         3, CP#18
   Drop1
   Jump                 L5
 L5:
@@ -848,7 +848,7 @@
   Drop1
   Push                 r0
   LoadContextVar       9
-  InstanceCall1        1, CP#44
+  InstanceCall         1, CP#44
   ReturnTOS
   Push                 r0
   LoadContextParent
@@ -946,7 +946,7 @@
   Push                 r4
   LoadContextVar       0
   PushConstant         CP#8
-  InstanceCall1        2, CP#10
+  InstanceCall         2, CP#10
   AssertBoolean        0
   PushConstant         CP#11
   IfNeStrictTOS
@@ -963,7 +963,7 @@
   LoadContextParent
   LoadContextParent
   LoadContextVar       0
-  InstanceCall1        1, CP#12
+  InstanceCall         1, CP#12
   PopLocal             r8
   Push                 r4
   Push                 r8
@@ -973,7 +973,7 @@
   Push                 r4
   LoadContextVar       0
   StoreLocal           r8
-  InstanceCall1        1, CP#13
+  InstanceCall         1, CP#13
   PushConstant         CP#11
   IfNeStrictTOS
   Jump                 L3
@@ -985,7 +985,7 @@
   PopLocal             r4
   Push                 r4
   Push                 r8
-  InstanceCall1        1, CP#14
+  InstanceCall         1, CP#14
   StoreContextVar      0
   Push                 r4
   LoadContextParent
@@ -1009,7 +1009,7 @@
   LoadContextVar       0
   Push                 r4
   LoadContextVar       0
-  InstanceCall1        2, CP#15
+  InstanceCall         2, CP#15
   StoreContextVar      3
   Push                 r4
   LoadContextParent
@@ -1074,8 +1074,8 @@
   LoadContextParent
   LoadContextVar       3
   Push                 r1
-  InstanceCall1        2, CP#21
-  InstanceCall1        2, CP#22
+  InstanceCall         2, CP#21
+  InstanceCall         2, CP#22
   StoreContextVar      0
   Push                 r4
   LoadContextParent
@@ -1092,7 +1092,7 @@
   Push                 r4
   LoadContextVar       0
   PushConstant         CP#16
-  InstanceCall1        2, CP#23
+  InstanceCall         2, CP#23
   StoreLocal           r8
   StoreContextVar      0
   Push                 r8
@@ -1108,7 +1108,7 @@
   CheckStack
   Push                 r8
   PushConstant         CP#8
-  InstanceCall1        2, CP#24
+  InstanceCall         2, CP#24
   AssertBoolean        0
   PushConstant         CP#11
   IfNeStrictTOS
@@ -1117,11 +1117,11 @@
   Push                 r4
   LoadContextVar       0
   Push                 r8
-  InstanceCall1        2, CP#25
+  InstanceCall         2, CP#25
   StoreContextVar      0
   Push                 r8
   PushConstant         CP#16
-  InstanceCall1        2, CP#26
+  InstanceCall         2, CP#26
   StoreLocal           r8
   Drop1
   Jump                 L8
@@ -1167,7 +1167,7 @@
   LoadContextVar       9
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#30
+  InstanceCall         3, CP#30
   Drop1
   Jump                 L10
 L10:
@@ -1324,7 +1324,7 @@
   Drop1
   Push                 r0
   LoadContextVar       12
-  InstanceCall1        1, CP#50
+  InstanceCall         1, CP#50
   ReturnTOS
   Push                 r0
   LoadContextParent
@@ -1467,7 +1467,7 @@
   LoadContextParent
   LoadContextVar       2
   Push                 r1
-  InstanceCall1        2, CP#12
+  InstanceCall         2, CP#12
   StoreContextVar      0
   Jump                 L3
 Try #2 end:
@@ -1502,7 +1502,7 @@
   PushConstant         CP#3
   PushConstant         CP#3
   PushConstant         CP#14
-  InstanceCall1        4, CP#15
+  InstanceCall         4, CP#15
   AssertBoolean        0
   PushConstant         CP#16
   IfNeStrictTOS
@@ -1567,7 +1567,7 @@
   LoadContextParent
   LoadContextVar       2
   Push                 r1
-  InstanceCall1        2, CP#20
+  InstanceCall         2, CP#20
   StoreContextVar      0
   Push                 r4
   LoadContextParent
@@ -1650,7 +1650,7 @@
   LoadContextParent
   LoadContextVar       2
   Push                 r1
-  InstanceCall1        2, CP#25
+  InstanceCall         2, CP#25
   StoreContextVar      0
   Push                 r4
   LoadContextParent
@@ -1722,7 +1722,7 @@
   LoadContextParent
   LoadContextVar       2
   Push                 r1
-  InstanceCall1        2, CP#29
+  InstanceCall         2, CP#29
   StoreContextVar      0
   Push                 r4
   LoadContextParent
@@ -1791,7 +1791,7 @@
   LoadContextParent
   LoadContextVar       2
   Push                 r1
-  InstanceCall1        2, CP#33
+  InstanceCall         2, CP#33
   StoreContextVar      0
   Push                 r4
   LoadContextParent
@@ -1834,7 +1834,7 @@
   LoadContextVar       12
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#36
+  InstanceCall         3, CP#36
   Drop1
   Jump                 L12
 L12:
@@ -2086,7 +2086,7 @@
   LoadContextVar       0
   Push                 r4
   LoadContextVar       0
-  InstanceCall1        2, CP#16
+  InstanceCall         2, CP#16
   StoreContextVar      7
   Jump                 L3
   Jump                 L4
@@ -2165,7 +2165,7 @@
   LoadContextVar       8
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#24
+  InstanceCall         3, CP#24
   Drop1
   Jump                 L6
 L6:
@@ -2260,7 +2260,7 @@
   Drop1
   Push                 r0
   LoadContextVar       8
-  InstanceCall1        1, CP#38
+  InstanceCall         1, CP#38
   ReturnTOS
   Push                 r0
   LoadContextParent
@@ -2392,7 +2392,7 @@
   Drop1
   Push                 r0
   LoadContextVar       7
-  InstanceCall1        1, CP#34
+  InstanceCall         1, CP#34
   ReturnTOS
   Push                 r0
   LoadContextParent
@@ -2488,7 +2488,7 @@
   JumpIfNoAsserts      L2
   Push                 r1
   PushConstant         CP#11
-  InstanceCall1        2, CP#13
+  InstanceCall         2, CP#13
   AssertBoolean        0
   PushConstant         CP#14
   IfEqStrictTOS
@@ -2533,7 +2533,7 @@
   LoadContextVar       7
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#20
+  InstanceCall         3, CP#20
   Drop1
   Jump                 L5
 L5:
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index 49ae297..16c0efe 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -122,7 +122,7 @@
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#1
-  InstanceCall1        2, CP#3
+  InstanceCall         2, CP#3
   AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
@@ -318,7 +318,7 @@
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#1
-  InstanceCall1        2, CP#3
+  InstanceCall         2, CP#3
   AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
@@ -326,7 +326,7 @@
   PushConstant         CP#5
   PushStatic           CP#5
   PushConstant         CP#1
-  InstanceCall1        2, CP#6
+  InstanceCall         2, CP#6
   AssertBoolean        0
   BooleanNegateTOS
   PopLocal             r0
@@ -342,7 +342,7 @@
   Jump                 L3
   PushConstant         CP#5
   PushStatic           CP#5
-  InstanceCall1        1, CP#9
+  InstanceCall         1, CP#9
   StoreStaticTOS       CP#0
 L3:
   PushConstant         CP#0
@@ -392,7 +392,7 @@
   Entry                0
   CheckStack
   Push                 FP[-5]
-  InstanceCall1        1, CP#1
+  InstanceCall         1, CP#1
   PushConstant         CP#2
   IndirectStaticCall   1, CP#0
   Drop1
@@ -470,7 +470,7 @@
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#1
-  InstanceCall1        2, CP#3
+  InstanceCall         2, CP#3
   AssertBoolean        0
   PushConstant         CP#4
   IfEqStrictTOS
@@ -478,7 +478,7 @@
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#5
-  InstanceCall1        2, CP#6
+  InstanceCall         2, CP#6
   AssertBoolean        0
   PopLocal             r1
   Jump                 L2
@@ -494,7 +494,7 @@
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#7
-  InstanceCall1        2, CP#8
+  InstanceCall         2, CP#8
   AssertBoolean        0
   PopLocal             r0
   Jump                 L4
@@ -521,7 +521,7 @@
   PushStatic           CP#0
   PushConstant         CP#14
   IndirectStaticCall   2, CP#2
-  InstanceCall1        2, CP#15
+  InstanceCall         2, CP#15
   ReturnTOS
 L6:
   PushConstant         CP#13
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index cf90561..c3eba73 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -220,11 +220,11 @@
   PopLocal             r3
   PushConstant         CP#51
   Push                 r3
-  InstanceCall1        2, CP#52
+  InstanceCall         2, CP#52
   Drop1
   PushConstant         CP#53
   Push                 r3
-  InstanceCall1        2, CP#54
+  InstanceCall         2, CP#54
   Drop1
   PushConstant         CP#18
   ReturnTOS
@@ -404,7 +404,7 @@
   StoreFieldTOS        CP#1
   PopLocal             r3
   Push                 r3
-  InstanceCall1        1, CP#43
+  InstanceCall         1, CP#43
   Drop1
   PushConstant         CP#18
   ReturnTOS
@@ -445,11 +445,11 @@
   PopLocal             r3
   PushConstant         CP#45
   Push                 r3
-  InstanceCall1        2, CP#47
+  InstanceCall         2, CP#47
   Drop1
   PushConstant         CP#48
   Push                 r3
-  InstanceCall1        2, CP#49
+  InstanceCall         2, CP#49
   Drop1
   PushConstant         CP#18
   ReturnTOS
@@ -538,11 +538,11 @@
   PopLocal             r3
   Push                 r3
   PushConstant         CP#32
-  InstanceCall1        2, CP#33
+  InstanceCall         2, CP#33
   Drop1
   Push                 r3
   PushConstant         CP#34
-  InstanceCall1        2, CP#35
+  InstanceCall         2, CP#35
   Drop1
   Push                 r2
   PushConstant         CP#36
@@ -589,7 +589,7 @@
   StoreFieldTOS        CP#4
   PopLocal             r2
   Push                 r2
-  InstanceCall1        1, CP#43
+  InstanceCall         1, CP#43
   Drop1
   Push                 r0
   LoadContextParent
@@ -658,7 +658,7 @@
   LoadContextParent
   LoadContextVar       0
   PushConstant         CP#1
-  InstanceCall1        2, CP#17
+  InstanceCall         2, CP#17
   StoreContextVar      0
   Push                 r0
   Push                 r0
@@ -667,11 +667,11 @@
   LoadContextParent
   LoadContextParent
   LoadContextVar       0
-  InstanceCall1        1, CP#19
+  InstanceCall         1, CP#19
   Push                 r0
   LoadContextParent
   LoadContextVar       0
-  InstanceCall1        2, CP#20
+  InstanceCall         2, CP#20
   StoreContextVar      0
   PushConstant         CP#6
   ReturnTOS
@@ -712,14 +712,14 @@
   Push                 r0
   LoadContextVar       0
   PushConstant         CP#0
-  InstanceCall1        2, CP#11
+  InstanceCall         2, CP#11
   StoreContextVar      0
   Push                 r0
   LoadContextParent
   LoadContextParent
   LoadContextVar       0
   PushConstant         CP#12
-  InstanceCall1        2, CP#13
+  InstanceCall         2, CP#13
   AssertBoolean        0
   PushConstant         CP#14
   IfNeStrictTOS
@@ -749,7 +749,7 @@
   StoreFieldTOS        CP#4
   PopLocal             r3
   Push                 r3
-  InstanceCall1        1, CP#29
+  InstanceCall         1, CP#29
   Drop1
   Push                 r0
   LoadContextVar       0
@@ -776,7 +776,7 @@
   LoadContextVar       0
   Push                 r0
   LoadContextVar       0
-  InstanceCall1        2, CP#41
+  InstanceCall         2, CP#41
   Drop1
   PushConstant         CP#6
   ReturnTOS
@@ -881,7 +881,7 @@
   Push                 r0
   LoadContextVar       0
   PushConstant         CP#5
-  InstanceCall1        2, CP#6
+  InstanceCall         2, CP#6
   AssertBoolean        0
   PushConstant         CP#7
   IfNeStrictTOS
@@ -901,7 +901,7 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#9
-  InstanceCall1        2, CP#21
+  InstanceCall         2, CP#21
   Drop1
   Push                 r4
   Allocate             CP#14
@@ -918,7 +918,7 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#9
-  InstanceCall1        2, CP#28
+  InstanceCall         2, CP#28
   Drop1
   Push                 r0
   CloneContext
@@ -927,7 +927,7 @@
   Push                 r0
   LoadContextVar       0
   PushConstant         CP#29
-  InstanceCall1        2, CP#30
+  InstanceCall         2, CP#30
   StoreLocal           r3
   StoreContextVar      0
   Push                 r3
@@ -987,7 +987,7 @@
   Push                 r0
   LoadContextParent
   LoadContextVar       0
-  InstanceCall1        2, CP#11
+  InstanceCall         2, CP#11
   ReturnTOS
   PushConstant         CP#12
   ReturnTOS
@@ -1012,7 +1012,7 @@
   Push                 r0
   LoadContextParent
   LoadContextVar       0
-  InstanceCall1        2, CP#26
+  InstanceCall         2, CP#26
   StoreContextVar      0
   PushConstant         CP#12
   ReturnTOS
@@ -1041,12 +1041,12 @@
   AssertAssignable     0, CP#3
   Drop1
   Push                 FP[-5]
-  InstanceCall1        1, CP#5
+  InstanceCall         1, CP#5
   PopLocal             r2
 L2:
   CheckStack
   Push                 r2
-  InstanceCall1        1, CP#6
+  InstanceCall         1, CP#6
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L1
@@ -1058,7 +1058,7 @@
   PopLocal             r0
   Push                 r0
   Push                 r2
-  InstanceCall1        1, CP#8
+  InstanceCall         1, CP#8
   StoreContextVar      0
   Allocate             CP#16
   StoreLocal           r4
@@ -1076,7 +1076,7 @@
   StoreFieldTOS        CP#10
   PopLocal             r3
   Push                 r3
-  InstanceCall1        1, CP#23
+  InstanceCall         1, CP#23
   Drop1
   Push                 r0
   LoadContextVar       0
@@ -1128,7 +1128,7 @@
   Push                 r0
   LoadContextVar       0
   PushConstant         CP#12
-  InstanceCall1        2, CP#14
+  InstanceCall         2, CP#14
   StoreContextVar      0
   PushConstant         CP#0
   ReturnTOS
@@ -1265,7 +1265,7 @@
   PopLocal             r2
   Push                 r2
   PushConstant         CP#18
-  InstanceCall1        2, CP#19
+  InstanceCall         2, CP#19
   Drop1
   Push                 r0
   LoadContextVar       0
@@ -1315,7 +1315,7 @@
   Push                 r0
   LoadContextVar       0
   Push                 FP[-5]
-  InstanceCall1        2, CP#9
+  InstanceCall         2, CP#9
   StoreContextVar      0
   PushConstant         CP#4
   ReturnTOS
@@ -1437,7 +1437,7 @@
   PushConstant         CP#4
   IndirectStaticCall   1, CP#3
   Drop1
-  InstanceCall1        2, CP#6
+  InstanceCall         2, CP#6
   Drop1
   PushConstant         CP#7
   PushConstant         CP#2
@@ -1448,7 +1448,7 @@
   PushConstant         CP#8
   IndirectStaticCall   1, CP#3
   Drop1
-  InstanceCall1        2, CP#9
+  InstanceCall         2, CP#9
   Drop1
   PushConstant         CP#7
   PushConstant         CP#10
@@ -1459,7 +1459,7 @@
   PushConstant         CP#11
   IndirectStaticCall   1, CP#3
   Drop1
-  InstanceCall1        2, CP#12
+  InstanceCall         2, CP#12
   Drop1
   PushConstant         CP#13
   ReturnTOS
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
index cb6efea..1522863 100644
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -57,7 +57,7 @@
   Push                 FP[-7]
   Push                 FP[-5]
   PushConstant         CP#5
-  InstanceCall1        2, CP#7
+  InstanceCall         2, CP#7
   StoreFieldTOS        CP#8
   Push                 FP[-7]
   PushConstant         CP#11
@@ -113,7 +113,7 @@
   Push                 FP[-7]
   Push                 FP[-6]
   Push                 FP[-5]
-  InstanceCall1        2, CP#1
+  InstanceCall         2, CP#1
   PushConstant         CP#3
   IndirectStaticCall   3, CP#2
   Drop1
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index d533ada..b997fdf 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -170,12 +170,12 @@
   Push                 FP[-8]
   Push                 FP[-7]
   Push                 FP[-6]
-  InstanceCall1        2, CP#1
+  InstanceCall         2, CP#1
   StoreFieldTOS        CP#2
   Push                 FP[-8]
   Push                 FP[-5]
   PushConstant         CP#4
-  InstanceCall1        2, CP#5
+  InstanceCall         2, CP#5
   PushConstant         CP#6
   IndirectStaticCall   2, CP#0
   Drop1
@@ -496,7 +496,7 @@
   Push                 r0
   PushConstant         CP#3
   Push                 FP[-5]
-  InstanceCall1        1, CP#11
+  InstanceCall         1, CP#11
   StoreIndexedTOS
   Push                 r0
   PushConstant         CP#4
@@ -579,7 +579,7 @@
   Push                 r1
   PushConstant         CP#5
   Push                 FP[-6]
-  InstanceCall1        1, CP#13
+  InstanceCall         1, CP#13
   StoreIndexedTOS
   Push                 r1
   PushConstant         CP#6
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
index 17a68e1..4112fe8 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -14,8 +14,8 @@
   CheckStack
   Push                 r1
   Push                 FP[-5]
-  InstanceCall1        1, CP#2
-  InstanceCall1        2, CP#4
+  InstanceCall         1, CP#2
+  InstanceCall         2, CP#4
   AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
@@ -23,12 +23,12 @@
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall1        2, CP#6
-  InstanceCall1        2, CP#7
+  InstanceCall         2, CP#6
+  InstanceCall         2, CP#7
   PopLocal             r0
   Push                 r1
   PushConstant         CP#8
-  InstanceCall1        2, CP#9
+  InstanceCall         2, CP#9
   StoreLocal           r1
   Drop1
   Jump                 L2
@@ -70,15 +70,15 @@
   CheckStack
   Push                 r1
   PushConstant         CP#0
-  InstanceCall1        2, CP#2
+  InstanceCall         2, CP#2
   AssertBoolean        0
   PushConstant         CP#3
   IfNeStrictTOS
   Jump                 L1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall1        1, CP#5
-  InstanceCall1        2, CP#6
+  InstanceCall         1, CP#5
+  InstanceCall         2, CP#6
   AssertBoolean        0
   PushConstant         CP#3
   IfNeStrictTOS
@@ -88,12 +88,12 @@
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall1        2, CP#7
-  InstanceCall1        2, CP#8
+  InstanceCall         2, CP#7
+  InstanceCall         2, CP#8
   PopLocal             r0
   Push                 r1
   PushConstant         CP#9
-  InstanceCall1        2, CP#10
+  InstanceCall         2, CP#10
   StoreLocal           r1
   Drop1
   Jump                 L3
@@ -135,21 +135,21 @@
   PushConstant         CP#0
   PopLocal             r0
   PushConstant         CP#1
-  InstanceCall1        1, CP#3
+  InstanceCall         1, CP#3
   PopLocal             r1
 L4:
   CheckStack
   Push                 r1
   Push                 FP[-5]
-  InstanceCall1        1, CP#4
-  InstanceCall1        2, CP#6
+  InstanceCall         1, CP#4
+  InstanceCall         2, CP#6
   AssertBoolean        0
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#0
-  InstanceCall1        2, CP#8
+  InstanceCall         2, CP#8
   AssertBoolean        0
   PushConstant         CP#7
   IfNeStrictTOS
@@ -159,13 +159,13 @@
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall1        2, CP#9
-  InstanceCall1        2, CP#10
+  InstanceCall         2, CP#9
+  InstanceCall         2, CP#10
   PopLocal             r0
 L3:
   Push                 r1
   PushConstant         CP#11
-  InstanceCall1        2, CP#12
+  InstanceCall         2, CP#12
   StoreLocal           r1
   Drop1
   Jump                 L4
@@ -215,8 +215,8 @@
   CheckStack
   Push                 r1
   Push                 FP[-5]
-  InstanceCall1        1, CP#2
-  InstanceCall1        2, CP#4
+  InstanceCall         1, CP#2
+  InstanceCall         2, CP#4
   AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
@@ -227,12 +227,12 @@
   PopLocal             r2
   Push                 r2
   PushConstant         CP#6
-  InstanceCall1        2, CP#7
+  InstanceCall         2, CP#7
   StoreLocal           r1
   PopLocal             r3
   Push                 r2
-  InstanceCall1        2, CP#8
-  InstanceCall1        2, CP#9
+  InstanceCall         2, CP#8
+  InstanceCall         2, CP#9
   PopLocal             r0
   Jump                 L2
 L1:
@@ -275,17 +275,17 @@
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall1        2, CP#2
-  InstanceCall1        2, CP#3
+  InstanceCall         2, CP#2
+  InstanceCall         2, CP#3
   PopLocal             r0
   Push                 r1
   PushConstant         CP#4
-  InstanceCall1        2, CP#5
+  InstanceCall         2, CP#5
   PopLocal             r1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall1        1, CP#7
-  InstanceCall1        2, CP#8
+  InstanceCall         1, CP#7
+  InstanceCall         2, CP#8
   AssertBoolean        0
   PushConstant         CP#9
   IfEqStrictTOS
@@ -325,21 +325,21 @@
   PushConstant         CP#0
   PopLocal             r0
   Push                 FP[-5]
-  InstanceCall1        1, CP#2
+  InstanceCall         1, CP#2
   PopLocal             r1
 L2:
   CheckStack
   Push                 r1
-  InstanceCall1        1, CP#3
+  InstanceCall         1, CP#3
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
   Push                 r1
-  InstanceCall1        1, CP#5
+  InstanceCall         1, CP#5
   PopLocal             r2
   Push                 r0
   Push                 r2
-  InstanceCall1        2, CP#7
+  InstanceCall         2, CP#7
   PopLocal             r0
   Jump                 L2
 L1:
@@ -375,23 +375,23 @@
   PushConstant         CP#1
   PopLocal             r1
   Push                 FP[-5]
-  InstanceCall1        1, CP#3
+  InstanceCall         1, CP#3
   PopLocal             r2
 L2:
   CheckStack
   Push                 r2
-  InstanceCall1        1, CP#4
+  InstanceCall         1, CP#4
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L1
   Push                 r2
-  InstanceCall1        1, CP#6
+  InstanceCall         1, CP#6
   PopLocal             r3
   Push                 r3
   PopLocal             r1
   Push                 r0
   Push                 r1
-  InstanceCall1        2, CP#8
+  InstanceCall         2, CP#8
   PopLocal             r0
   Jump                 L2
 L1:
diff --git a/pkg/vm/testcases/bytecode/super_calls.dart.expect b/pkg/vm/testcases/bytecode/super_calls.dart.expect
index 90ddf06..d0e8cf4 100644
--- a/pkg/vm/testcases/bytecode/super_calls.dart.expect
+++ b/pkg/vm/testcases/bytecode/super_calls.dart.expect
@@ -190,7 +190,7 @@
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
   PushConstant         CP#3
-  InstanceCall1        3, CP#5
+  InstanceCall         3, CP#5
   ReturnTOS
   PushConstant         CP#6
   ReturnTOS
@@ -444,7 +444,7 @@
   PushConstant         CP#10
   IndirectStaticCall   2, CP#9
   PushConstant         CP#11
-  InstanceCall1        3, CP#13
+  InstanceCall         3, CP#13
   ReturnTOS
   PushConstant         CP#14
   ReturnTOS
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
index a7d303b..ed998c2 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -12,19 +12,19 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall1        2, CP#3
+  InstanceCall         2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall1        2, CP#6
+  InstanceCall         2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#7
-  InstanceCall1        2, CP#8
+  InstanceCall         2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L3
@@ -96,37 +96,37 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall1        2, CP#3
+  InstanceCall         2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall1        2, CP#6
+  InstanceCall         2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#7
-  InstanceCall1        2, CP#8
+  InstanceCall         2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#9
-  InstanceCall1        2, CP#10
+  InstanceCall         2, CP#10
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#11
-  InstanceCall1        2, CP#12
+  InstanceCall         2, CP#12
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#13
-  InstanceCall1        2, CP#14
+  InstanceCall         2, CP#14
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
@@ -206,37 +206,37 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall1        2, CP#3
+  InstanceCall         2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall1        2, CP#6
+  InstanceCall         2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#7
-  InstanceCall1        2, CP#8
+  InstanceCall         2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#9
-  InstanceCall1        2, CP#10
+  InstanceCall         2, CP#10
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#11
-  InstanceCall1        2, CP#12
+  InstanceCall         2, CP#12
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#13
-  InstanceCall1        2, CP#14
+  InstanceCall         2, CP#14
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index c0fd1bb..8690f11 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -82,7 +82,7 @@
   PushConstant         CP#4
   PushConstant         CP#4
   PushConstant         CP#3
-  InstanceCall1        4, CP#6
+  InstanceCall         4, CP#6
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L2
@@ -96,7 +96,7 @@
   PushConstant         CP#4
   PushConstant         CP#4
   PushConstant         CP#10
-  InstanceCall1        4, CP#11
+  InstanceCall         4, CP#11
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L3
@@ -125,7 +125,7 @@
   PushConstant         CP#4
   PushConstant         CP#4
   PushConstant         CP#18
-  InstanceCall1        4, CP#19
+  InstanceCall         4, CP#19
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L4
@@ -287,7 +287,7 @@
   StoreFieldTOS        CP#3
   PopLocal             r4
   Push                 r4
-  InstanceCall1        1, CP#20
+  InstanceCall         1, CP#20
   Drop1
   Push                 r0
   LoadContextVar       0
@@ -476,7 +476,7 @@
   PushConstant         CP#11
   PushConstant         CP#11
   PushConstant         CP#31
-  InstanceCall1        4, CP#33
+  InstanceCall         4, CP#33
   PushConstant         CP#34
   IfNeStrictTOS
   Jump                 L2
@@ -668,7 +668,7 @@
   CheckStack
   Push                 r0
   PushConstant         CP#1
-  InstanceCall1        2, CP#3
+  InstanceCall         2, CP#3
   AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
@@ -676,7 +676,7 @@
 Try #0 start:
   Push                 r0
   PushConstant         CP#5
-  InstanceCall1        2, CP#6
+  InstanceCall         2, CP#6
   AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
@@ -708,7 +708,7 @@
   Drop1
   Push                 r0
   PushConstant         CP#12
-  InstanceCall1        2, CP#13
+  InstanceCall         2, CP#13
   StoreLocal           r0
   Drop1
   Jump                 L5
@@ -763,13 +763,13 @@
   PopLocal             r2
   Push                 r2
   PushConstant         CP#1
-  InstanceCall1        2, CP#2
+  InstanceCall         2, CP#2
   PushConstant         CP#3
   IfEqStrictTOS
   Jump                 L1
   Push                 r2
   PushConstant         CP#4
-  InstanceCall1        2, CP#5
+  InstanceCall         2, CP#5
   PushConstant         CP#3
   IfEqStrictTOS
   Jump                 L2
@@ -814,7 +814,7 @@
   StoreFieldTOS        CP#13
   PopLocal             r7
   Push                 r7
-  InstanceCall1        1, CP#26
+  InstanceCall         1, CP#26
   Drop1
   Jump                 L4
   Jump                 L5
@@ -1042,7 +1042,7 @@
   IndirectStaticCall   1, CP#5
   Drop1
   Push                 r2
-  InstanceCall1        1, CP#34
+  InstanceCall         1, CP#34
   Drop1
   Push                 r3
   Push                 r4
@@ -1056,7 +1056,7 @@
   IndirectStaticCall   1, CP#5
   Drop1
   Push                 r2
-  InstanceCall1        1, CP#36
+  InstanceCall         1, CP#36
   Drop1
   Push                 r0
   LoadContextParent
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index bf04a31..c0628ce 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -110,7 +110,7 @@
   LoadTypeArgumentsField CP#0
   PushConstant         CP#1
   PushConstant         CP#2
-  InstanceCall1        4, CP#4
+  InstanceCall         4, CP#4
   AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
@@ -125,7 +125,7 @@
   LoadTypeArgumentsField CP#0
   PushConstant         CP#1
   PushConstant         CP#9
-  InstanceCall1        4, CP#10
+  InstanceCall         4, CP#10
   AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
@@ -143,7 +143,7 @@
   PushConstant         CP#13
   PushConstant         CP#14
   AssertAssignable     0, CP#15
-  InstanceCall1        2, CP#17
+  InstanceCall         2, CP#17
   Drop1
   PushConstant         CP#1
   ReturnTOS
@@ -186,7 +186,7 @@
   PushConstant         CP#0
   Push                 r0
   PushConstant         CP#1
-  InstanceCall1        4, CP#3
+  InstanceCall         4, CP#3
   AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
@@ -201,7 +201,7 @@
   LoadTypeArgumentsField CP#8
   Push                 r0
   PushConstant         CP#9
-  InstanceCall1        4, CP#10
+  InstanceCall         4, CP#10
   AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
@@ -216,8 +216,8 @@
   LoadTypeArgumentsField CP#8
   Push                 r0
   PushConstant         CP#13
-  InstanceCall1        4, CP#14
-  InstanceCall1        1, CP#15
+  InstanceCall         4, CP#14
+  InstanceCall         1, CP#15
   ReturnTOS
   PushConstant         CP#0
   ReturnTOS
@@ -371,7 +371,7 @@
   PushConstant         CP#0
   PushConstant         CP#0
   PushConstant         CP#1
-  InstanceCall1        4, CP#3
+  InstanceCall         4, CP#3
   AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
@@ -385,7 +385,7 @@
   PushConstant         CP#0
   PushConstant         CP#0
   PushConstant         CP#8
-  InstanceCall1        4, CP#9
+  InstanceCall         4, CP#9
   AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
@@ -399,7 +399,7 @@
   PushConstant         CP#0
   PushConstant         CP#0
   PushConstant         CP#12
-  InstanceCall1        4, CP#13
+  InstanceCall         4, CP#13
   ReturnTOS
   PushConstant         CP#0
   ReturnTOS
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index b5629ec..952d27c 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -2717,18 +2717,8 @@
           const Array& arguments_descriptor =
               Array::Handle(zone, call->GetArgumentsDescriptor());
           const Function& target = call->function();
-          MethodRecognizer::Kind recognized_kind =
-              MethodRecognizer::RecognizeKind(target);
-          int num_args_checked = 0;
-          switch (recognized_kind) {
-            case MethodRecognizer::kDoubleFromInteger:
-            case MethodRecognizer::kMathMin:
-            case MethodRecognizer::kMathMax:
-              num_args_checked = 2;
-              break;
-            default:
-              break;
-          }
+          int num_args_checked =
+              MethodRecognizer::NumArgsCheckedForStaticCall(target);
           const ICData& ic_data = ICData::ZoneHandle(
               zone, ICData::New(function, String::Handle(zone, target.name()),
                                 arguments_descriptor, call->deopt_id(),
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
index 9b05506..69d4736 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -212,8 +212,7 @@
     case KernelBytecode::kPushConstant:
     case KernelBytecode::kStaticCall:
     case KernelBytecode::kIndirectStaticCall:
-    case KernelBytecode::kInstanceCall1:
-    case KernelBytecode::kInstanceCall2:
+    case KernelBytecode::kInstanceCall:
     case KernelBytecode::kInstanceCall1Opt:
     case KernelBytecode::kInstanceCall2Opt:
     case KernelBytecode::kStoreStaticTOS:
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 52f3f18..3c6a665 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -4119,18 +4119,8 @@
       (ic_data() == NULL)) {
     const Array& arguments_descriptor =
         Array::Handle(zone, GetArgumentsDescriptor());
-    MethodRecognizer::Kind recognized_kind =
-        MethodRecognizer::RecognizeKind(function());
-    int num_args_checked = 0;
-    switch (recognized_kind) {
-      case MethodRecognizer::kDoubleFromInteger:
-      case MethodRecognizer::kMathMin:
-      case MethodRecognizer::kMathMax:
-        num_args_checked = 2;
-        break;
-      default:
-        break;
-    }
+    const int num_args_checked =
+        MethodRecognizer::NumArgsCheckedForStaticCall(function());
     call_ic_data = compiler->GetOrAddStaticCallICData(
         deopt_id(), function(), arguments_descriptor, num_args_checked,
         rebind_rule_);
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 3dd64c7..5c978e9 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -200,10 +200,17 @@
         intptr_t arg_desc_index = helper_->ReadUInt();
         ASSERT(arg_desc_index < i);
         array ^= pool.ObjectAt(arg_desc_index);
-        // TODO(regis): Should num_args_tested be explicitly provided?
+        intptr_t checked_argument_count = 1;
+        if ((kind == InvocationKind::method) &&
+            (MethodTokenRecognizer::RecognizeTokenKind(name) !=
+             Token::kILLEGAL)) {
+          intptr_t argument_count = ArgumentsDescriptor(array).Count();
+          ASSERT(argument_count <= 2);
+          checked_argument_count = argument_count;
+        }
         obj = ICData::New(function, name,
                           array,  // Arguments descriptor.
-                          Thread::kNoDeoptId, 1 /* num_args_tested */,
+                          Thread::kNoDeoptId, checked_argument_count,
                           ICData::RebindRule::kInstance);
 #if defined(TAG_IC_DATA)
         ICData::Cast(obj).set_tag(ICData::Tag::kInstanceCall);
@@ -239,13 +246,15 @@
             elem = Function::Cast(elem).GetMethodExtractor(name);
           }
         }
+        const int num_args_checked =
+            MethodRecognizer::NumArgsCheckedForStaticCall(Function::Cast(elem));
         ASSERT(elem.IsFunction());
         intptr_t arg_desc_index = helper_->ReadUInt();
         ASSERT(arg_desc_index < i);
         array ^= pool.ObjectAt(arg_desc_index);
         obj = ICData::New(function, name,
                           array,  // Arguments descriptor.
-                          Thread::kNoDeoptId, 0 /* num_args_tested */,
+                          Thread::kNoDeoptId, num_args_checked,
                           ICData::RebindRule::kStatic);
         ICData::Cast(obj).AddTarget(Function::Cast(elem));
 #if defined(TAG_IC_DATA)
diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc
index ecc20f6..70def2a 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -22,6 +22,18 @@
   return function.is_polymorphic_target();
 }
 
+intptr_t MethodRecognizer::NumArgsCheckedForStaticCall(
+    const Function& function) {
+  switch (RecognizeKind(function)) {
+    case MethodRecognizer::kDoubleFromInteger:
+    case MethodRecognizer::kMathMin:
+    case MethodRecognizer::kMathMax:
+      return 2;
+    default:
+      return 0;
+  }
+}
+
 intptr_t MethodRecognizer::ResultCid(const Function& function) {
   switch (function.recognized_kind()) {
 #define DEFINE_CASE(cname, fname, ename, result_type, fingerprint)             \
diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h
index e877f49..592c7c2 100644
--- a/runtime/vm/compiler/method_recognizer.h
+++ b/runtime/vm/compiler/method_recognizer.h
@@ -560,6 +560,7 @@
   static Kind RecognizeKind(const Function& function);
   static bool AlwaysInline(const Function& function);
   static bool PolymorphicTarget(const Function& function);
+  static intptr_t NumArgsCheckedForStaticCall(const Function& function);
   static intptr_t ResultCid(const Function& function);
   static intptr_t MethodKindToReceiverCid(Kind kind);
   static const char* KindToCString(Kind kind);
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index e6bdae6..45f1aff 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -164,7 +164,13 @@
 //    SP[-(1+ArgC)], ..., SP[-1] and argument descriptor PP[D], which
 //    indicates whether the first argument is a type argument vector.
 //
-//  - InstanceCall<N> ArgC, D; InstanceCall<N>Opt ArgC, D
+//  - InstanceCall ArgC, D
+//
+//    Lookup and invoke method using ICData in PP[D]
+//    with arguments SP[-(1+ArgC)], ..., SP[-1].
+//    The ICData indicates whether the first argument is a type argument vector.
+//
+//  - InstanceCall<N>Opt ArgC, D
 //
 //    Lookup and invoke method with N checked arguments using ICData in PP[D]
 //    with arguments SP[-(1+ArgC)], ..., SP[-1].
@@ -815,8 +821,7 @@
   V(PopLocal,                              X, xeg, ___, ___)                   \
   V(IndirectStaticCall,                  A_D, num, num, ___)                   \
   V(StaticCall,                          A_D, num, num, ___)                   \
-  V(InstanceCall1,                       A_D, num, num, ___)                   \
-  V(InstanceCall2,                       A_D, num, num, ___)                   \
+  V(InstanceCall,                        A_D, num, num, ___)                   \
   V(InstanceCall1Opt,                    A_D, num, num, ___)                   \
   V(InstanceCall2Opt,                    A_D, num, num, ___)                   \
   V(PushPolymorphicInstanceCall,         A_D, num, num, ___)                   \
@@ -1079,8 +1084,7 @@
     switch (DecodeOpcode(instr)) {
       case KernelBytecode::kStaticCall:
       case KernelBytecode::kIndirectStaticCall:
-      case KernelBytecode::kInstanceCall1:
-      case KernelBytecode::kInstanceCall2:
+      case KernelBytecode::kInstanceCall:
       case KernelBytecode::kInstanceCall1Opt:
       case KernelBytecode::kInstanceCall2Opt:
       case KernelBytecode::kDebugBreak:
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index eca3dd9..a1ba31b 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -2340,7 +2340,7 @@
   }
 
   {
-    BYTECODE(InstanceCall1, A_D);
+    BYTECODE(InstanceCall, A_D);
 
     // Check if single stepping.
     if (thread->isolate()->single_step()) {
@@ -2359,36 +2359,18 @@
       RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
       InterpreterHelpers::IncrementUsageCounter(
           RAW_CAST(Function, icdata->ptr()->owner_));
-      if (!InstanceCall1(thread, icdata, call_base, call_top, &pc, &FP, &SP,
-                         false /* optimized */)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InstanceCall2, A_D);
-    if (thread->isolate()->single_step()) {
-      Exit(thread, FP, SP + 1, pc);
-      NativeArguments args(thread, 0, NULL, NULL);
-      INVOKE_RUNTIME(DRT_SingleStepHandler, args);
-    }
-
-    {
-      const uint16_t argc = rA;
-      const uint16_t kidx = rD;
-
-      RawObject** call_base = SP - argc + 1;
-      RawObject** call_top = SP + 1;
-
-      RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
-      InterpreterHelpers::IncrementUsageCounter(
-          RAW_CAST(Function, icdata->ptr()->owner_));
-      if (!InstanceCall2(thread, icdata, call_base, call_top, &pc, &FP, &SP,
-                         false /* optimized */)) {
-        HANDLE_EXCEPTION;
+      if (ICData::NumArgsTestedBits::decode(icdata->ptr()->state_bits_) == 1) {
+        if (!InstanceCall1(thread, icdata, call_base, call_top, &pc, &FP, &SP,
+                           false /* optimized */)) {
+          HANDLE_EXCEPTION;
+        }
+      } else {
+        ASSERT(ICData::NumArgsTestedBits::decode(icdata->ptr()->state_bits_) ==
+               2);
+        if (!InstanceCall2(thread, icdata, call_base, call_top, &pc, &FP, &SP,
+                           false /* optimized */)) {
+          HANDLE_EXCEPTION;
+        }
       }
     }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ccf54fe..f05ca7f 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2118,6 +2118,7 @@
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object);
   friend class Class;
+  friend class Interpreter;
   friend class SnapshotWriter;
   friend class Serializer;
   friend class Deserializer;