Add test for invoke-interface performance with IMT

This test examines performance of invoke-interfaces when the
InterfaceMethodTable has collisions.

Bug: 27556801

Change-Id: I988ce5f2cdfb581d8e6be5e17b2f94c5b6cdd01a
diff --git a/benchmarks/src/benchmarks/InvokeInterface.java b/benchmarks/src/benchmarks/InvokeInterface.java
new file mode 100644
index 0000000..a9c3c28
--- /dev/null
+++ b/benchmarks/src/benchmarks/InvokeInterface.java
@@ -0,0 +1,641 @@
+/*
+ * Copyright 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package benchmarks;
+
+public class InvokeInterface {
+  static MultiClass multi;
+
+  static {
+    multi = new MultiClass();
+  }
+
+  public void timeCall0Concrete(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall0Concrete(m);
+    }
+  }
+
+  public void timeCall0Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall0Interface(m);
+    }
+  }
+
+  public void timeCall1Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall1Interface(m);
+    }
+  }
+
+  public void timeCall2Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall2Interface(m);
+    }
+  }
+
+  public void timeCall3Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall3Interface(m);
+    }
+  }
+
+  public void timeCall4Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall4Interface(m);
+    }
+  }
+
+  public void timeCall5Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall5Interface(m);
+    }
+  }
+
+  public void timeCall6Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall6Interface(m);
+    }
+  }
+
+  public void timeCall7Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall7Interface(m);
+    }
+  }
+
+  public void timeCall8Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall8Interface(m);
+    }
+  }
+
+  public void timeCall9Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall9Interface(m);
+    }
+  }
+
+  public void timeCall10Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall10Interface(m);
+    }
+  }
+
+  public void timeCall11Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall11Interface(m);
+    }
+  }
+
+  public void timeCall12Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall12Interface(m);
+    }
+  }
+
+  public void timeCall13Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall13Interface(m);
+    }
+  }
+
+  public void timeCall14Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall14Interface(m);
+    }
+  }
+
+  public void timeCall15Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall15Interface(m);
+    }
+  }
+
+  public void timeCall16Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall16Interface(m);
+    }
+  }
+
+  public void timeCall17Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall17Interface(m);
+    }
+  }
+
+  public void timeCall18Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall18Interface(m);
+    }
+  }
+
+  public void timeCall19Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall19Interface(m);
+    }
+  }
+
+  public void timeCall20Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall20Interface(m);
+    }
+  }
+
+  public void timeCall21Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall21Interface(m);
+    }
+  }
+
+  public void timeCall22Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall22Interface(m);
+    }
+  }
+
+  public void timeCall23Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall23Interface(m);
+    }
+  }
+
+  public void timeCall24Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall24Interface(m);
+    }
+  }
+
+  public void timeCall25Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall25Interface(m);
+    }
+  }
+
+  public void timeCall26Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall26Interface(m);
+    }
+  }
+
+  public void timeCall27Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall27Interface(m);
+    }
+  }
+
+  public void timeCall28Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall28Interface(m);
+    }
+  }
+
+  public void timeCall29Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall29Interface(m);
+    }
+  }
+
+  public void timeCall30Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall30Interface(m);
+    }
+  }
+
+  public void timeCall31Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall31Interface(m);
+    }
+  }
+
+  public void timeCall32Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall32Interface(m);
+    }
+  }
+
+  public void timeCall33Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall33Interface(m);
+    }
+  }
+
+  public void timeCall34Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall34Interface(m);
+    }
+  }
+
+  public void timeCall35Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall35Interface(m);
+    }
+  }
+
+  public void timeCall36Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall36Interface(m);
+    }
+  }
+
+  public void timeCall37Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall37Interface(m);
+    }
+  }
+
+  public void timeCall38Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall38Interface(m);
+    }
+  }
+
+  public void timeCall39Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall39Interface(m);
+    }
+  }
+
+  public void timeCall40Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall40Interface(m);
+    }
+  }
+
+  public void timeCall41Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall41Interface(m);
+    }
+  }
+
+  public void timeCall42Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall42Interface(m);
+    }
+  }
+
+  public void timeCall43Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall43Interface(m);
+    }
+  }
+
+  public void timeCall44Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall44Interface(m);
+    }
+  }
+
+  public void timeCall45Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall45Interface(m);
+    }
+  }
+
+  public void timeCall46Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall46Interface(m);
+    }
+  }
+
+  public void timeCall47Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall47Interface(m);
+    }
+  }
+
+  public void timeCall48Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall48Interface(m);
+    }
+  }
+
+  public void timeCall49Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall49Interface(m);
+    }
+  }
+
+  public void timeCall50Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall50Interface(m);
+    }
+  }
+
+  public void timeCall51Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall51Interface(m);
+    }
+  }
+
+  public void timeCall52Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall52Interface(m);
+    }
+  }
+
+  public void timeCall53Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall53Interface(m);
+    }
+  }
+
+  public void timeCall54Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall54Interface(m);
+    }
+  }
+
+  public void timeCall55Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall55Interface(m);
+    }
+  }
+
+  public void timeCall56Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall56Interface(m);
+    }
+  }
+
+  public void timeCall57Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall57Interface(m);
+    }
+  }
+
+  public void timeCall58Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall58Interface(m);
+    }
+  }
+
+  public void timeCall59Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall59Interface(m);
+    }
+  }
+
+  public void timeCall60Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall60Interface(m);
+    }
+  }
+
+  public void timeCall61Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall61Interface(m);
+    }
+  }
+
+  public void timeCall62Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall62Interface(m);
+    }
+  }
+
+  public void timeCall63Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall63Interface(m);
+    }
+  }
+
+  public void timeCall64Interface(int nreps) {
+    MultiClass m = multi;
+    for (int i = 0; i < nreps; i++) {
+      doCall64Interface(m);
+    }
+  }
+
+  // Try calling these through the IMT/IfTable
+  public void doCall0Interface(Iface0 i) { i.callIface0(); }
+  public void doCall1Interface(Iface1 i) { i.callIface1(); }
+  public void doCall2Interface(Iface2 i) { i.callIface2(); }
+  public void doCall3Interface(Iface3 i) { i.callIface3(); }
+  public void doCall4Interface(Iface4 i) { i.callIface4(); }
+  public void doCall5Interface(Iface5 i) { i.callIface5(); }
+  public void doCall6Interface(Iface6 i) { i.callIface6(); }
+  public void doCall7Interface(Iface7 i) { i.callIface7(); }
+  public void doCall8Interface(Iface8 i) { i.callIface8(); }
+  public void doCall9Interface(Iface9 i) { i.callIface9(); }
+  public void doCall10Interface(Iface10 i) { i.callIface10(); }
+  public void doCall11Interface(Iface11 i) { i.callIface11(); }
+  public void doCall12Interface(Iface12 i) { i.callIface12(); }
+  public void doCall13Interface(Iface13 i) { i.callIface13(); }
+  public void doCall14Interface(Iface14 i) { i.callIface14(); }
+  public void doCall15Interface(Iface15 i) { i.callIface15(); }
+  public void doCall16Interface(Iface16 i) { i.callIface16(); }
+  public void doCall17Interface(Iface17 i) { i.callIface17(); }
+  public void doCall18Interface(Iface18 i) { i.callIface18(); }
+  public void doCall19Interface(Iface19 i) { i.callIface19(); }
+  public void doCall20Interface(Iface20 i) { i.callIface20(); }
+  public void doCall21Interface(Iface21 i) { i.callIface21(); }
+  public void doCall22Interface(Iface22 i) { i.callIface22(); }
+  public void doCall23Interface(Iface23 i) { i.callIface23(); }
+  public void doCall24Interface(Iface24 i) { i.callIface24(); }
+  public void doCall25Interface(Iface25 i) { i.callIface25(); }
+  public void doCall26Interface(Iface26 i) { i.callIface26(); }
+  public void doCall27Interface(Iface27 i) { i.callIface27(); }
+  public void doCall28Interface(Iface28 i) { i.callIface28(); }
+  public void doCall29Interface(Iface29 i) { i.callIface29(); }
+  public void doCall30Interface(Iface30 i) { i.callIface30(); }
+  public void doCall31Interface(Iface31 i) { i.callIface31(); }
+  public void doCall32Interface(Iface32 i) { i.callIface32(); }
+  public void doCall33Interface(Iface33 i) { i.callIface33(); }
+  public void doCall34Interface(Iface34 i) { i.callIface34(); }
+  public void doCall35Interface(Iface35 i) { i.callIface35(); }
+  public void doCall36Interface(Iface36 i) { i.callIface36(); }
+  public void doCall37Interface(Iface37 i) { i.callIface37(); }
+  public void doCall38Interface(Iface38 i) { i.callIface38(); }
+  public void doCall39Interface(Iface39 i) { i.callIface39(); }
+  public void doCall40Interface(Iface40 i) { i.callIface40(); }
+  public void doCall41Interface(Iface41 i) { i.callIface41(); }
+  public void doCall42Interface(Iface42 i) { i.callIface42(); }
+  public void doCall43Interface(Iface43 i) { i.callIface43(); }
+  public void doCall44Interface(Iface44 i) { i.callIface44(); }
+  public void doCall45Interface(Iface45 i) { i.callIface45(); }
+  public void doCall46Interface(Iface46 i) { i.callIface46(); }
+  public void doCall47Interface(Iface47 i) { i.callIface47(); }
+  public void doCall48Interface(Iface48 i) { i.callIface48(); }
+  public void doCall49Interface(Iface49 i) { i.callIface49(); }
+  public void doCall50Interface(Iface50 i) { i.callIface50(); }
+  public void doCall51Interface(Iface51 i) { i.callIface51(); }
+  public void doCall52Interface(Iface52 i) { i.callIface52(); }
+  public void doCall53Interface(Iface53 i) { i.callIface53(); }
+  public void doCall54Interface(Iface54 i) { i.callIface54(); }
+  public void doCall55Interface(Iface55 i) { i.callIface55(); }
+  public void doCall56Interface(Iface56 i) { i.callIface56(); }
+  public void doCall57Interface(Iface57 i) { i.callIface57(); }
+  public void doCall58Interface(Iface58 i) { i.callIface58(); }
+  public void doCall59Interface(Iface59 i) { i.callIface59(); }
+  public void doCall60Interface(Iface60 i) { i.callIface60(); }
+  public void doCall61Interface(Iface61 i) { i.callIface61(); }
+  public void doCall62Interface(Iface62 i) { i.callIface62(); }
+  public void doCall63Interface(Iface63 i) { i.callIface63(); }
+  public void doCall64Interface(Iface64 i) { i.callIface64(); }
+
+  // Try calling this through the vtable for comparison.
+  public void doCall0Concrete(MultiClass m) { m.callIface0(); }
+
+  // IMTs are 64 entries in length. By making this 65 interfaces we guarantee that we will have a
+  // collision.
+  static class MultiClass implements Iface0, Iface1, Iface2, Iface3, Iface4,
+                                     Iface5, Iface6, Iface7, Iface8, Iface9,
+                                     Iface10, Iface11, Iface12, Iface13, Iface14,
+                                     Iface15, Iface16, Iface17, Iface18, Iface19,
+                                     Iface20, Iface21, Iface22, Iface23, Iface24,
+                                     Iface25, Iface26, Iface27, Iface28, Iface29,
+                                     Iface30, Iface31, Iface32, Iface33, Iface34,
+                                     Iface35, Iface36, Iface37, Iface38, Iface39,
+                                     Iface40, Iface41, Iface42, Iface43, Iface44,
+                                     Iface45, Iface46, Iface47, Iface48, Iface49,
+                                     Iface50, Iface51, Iface52, Iface53, Iface54,
+                                     Iface55, Iface56, Iface57, Iface58, Iface59,
+                                     Iface60, Iface61, Iface62, Iface63, Iface64 { }
+
+  // The declaration of the 64 interfaces. We give them all default methods to avoid having to
+  // repeat ourselves.
+  static interface Iface0 { default void callIface0() {} }
+  static interface Iface1 { default void callIface1() {} }
+  static interface Iface2 { default void callIface2() {} }
+  static interface Iface3 { default void callIface3() {} }
+  static interface Iface4 { default void callIface4() {} }
+  static interface Iface5 { default void callIface5() {} }
+  static interface Iface6 { default void callIface6() {} }
+  static interface Iface7 { default void callIface7() {} }
+  static interface Iface8 { default void callIface8() {} }
+  static interface Iface9 { default void callIface9() {} }
+  static interface Iface10 { default void callIface10() {} }
+  static interface Iface11 { default void callIface11() {} }
+  static interface Iface12 { default void callIface12() {} }
+  static interface Iface13 { default void callIface13() {} }
+  static interface Iface14 { default void callIface14() {} }
+  static interface Iface15 { default void callIface15() {} }
+  static interface Iface16 { default void callIface16() {} }
+  static interface Iface17 { default void callIface17() {} }
+  static interface Iface18 { default void callIface18() {} }
+  static interface Iface19 { default void callIface19() {} }
+  static interface Iface20 { default void callIface20() {} }
+  static interface Iface21 { default void callIface21() {} }
+  static interface Iface22 { default void callIface22() {} }
+  static interface Iface23 { default void callIface23() {} }
+  static interface Iface24 { default void callIface24() {} }
+  static interface Iface25 { default void callIface25() {} }
+  static interface Iface26 { default void callIface26() {} }
+  static interface Iface27 { default void callIface27() {} }
+  static interface Iface28 { default void callIface28() {} }
+  static interface Iface29 { default void callIface29() {} }
+  static interface Iface30 { default void callIface30() {} }
+  static interface Iface31 { default void callIface31() {} }
+  static interface Iface32 { default void callIface32() {} }
+  static interface Iface33 { default void callIface33() {} }
+  static interface Iface34 { default void callIface34() {} }
+  static interface Iface35 { default void callIface35() {} }
+  static interface Iface36 { default void callIface36() {} }
+  static interface Iface37 { default void callIface37() {} }
+  static interface Iface38 { default void callIface38() {} }
+  static interface Iface39 { default void callIface39() {} }
+  static interface Iface40 { default void callIface40() {} }
+  static interface Iface41 { default void callIface41() {} }
+  static interface Iface42 { default void callIface42() {} }
+  static interface Iface43 { default void callIface43() {} }
+  static interface Iface44 { default void callIface44() {} }
+  static interface Iface45 { default void callIface45() {} }
+  static interface Iface46 { default void callIface46() {} }
+  static interface Iface47 { default void callIface47() {} }
+  static interface Iface48 { default void callIface48() {} }
+  static interface Iface49 { default void callIface49() {} }
+  static interface Iface50 { default void callIface50() {} }
+  static interface Iface51 { default void callIface51() {} }
+  static interface Iface52 { default void callIface52() {} }
+  static interface Iface53 { default void callIface53() {} }
+  static interface Iface54 { default void callIface54() {} }
+  static interface Iface55 { default void callIface55() {} }
+  static interface Iface56 { default void callIface56() {} }
+  static interface Iface57 { default void callIface57() {} }
+  static interface Iface58 { default void callIface58() {} }
+  static interface Iface59 { default void callIface59() {} }
+  static interface Iface60 { default void callIface60() {} }
+  static interface Iface61 { default void callIface61() {} }
+  static interface Iface62 { default void callIface62() {} }
+  static interface Iface63 { default void callIface63() {} }
+  static interface Iface64 { default void callIface64() {} }
+}