Merge commit 'd8aa3b636c4862745d7bfdaf905b3b67900f3430' into dev-release
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
index 50154ca..eefac9a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
@@ -1082,6 +1082,7 @@
}
} else {
arguments.add(value);
+ argumentRegisters += value.requiredRegisters();
if (instruction.isInvokeMethod()) {
argumentTypes.add(argumentTypeFromValue(value, instruction.asInvokeMethod(), i));
} else {
@@ -1571,6 +1572,7 @@
representative.getDefinition().getClassFileVersion());
}
});
+ assert outlineMethod.getReference().getArity() <= Constants.U8BIT_MAX;
eventConsumer.acceptOutlineMethod(outlineMethod, sites);
generatedOutlines.put(outline, outlineMethod.getReference());
outlineMethods.add(outlineMethod);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineInvokeStaticBailoutTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineInvokeStaticBailoutTest.java
new file mode 100644
index 0000000..a127403
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineInvokeStaticBailoutTest.java
@@ -0,0 +1,426 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.optimize.outliner;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.StringUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+// This is a reproduction for b/291130232.
+public class OutlineInvokeStaticBailoutTest extends TestBase {
+
+ private static final String EXPECTED_RESULT =
+ StringUtils.lines(
+ "1000 1001 1002",
+ "1003 1004 1005",
+ "1006 1007 1008",
+ "1009 1010 1011",
+ "1012 1013 1014",
+ "1015 1016 1017",
+ "1018 1019 1020",
+ "1021 1022 1023",
+ "1024 1025 1026",
+ "1027 1028 1029",
+ "1030 1031 1032",
+ "1033 1034 1035",
+ "1036 1037 1038",
+ "1039 1040 1041",
+ "1042 1043 1044",
+ "1045 1046 1047",
+ "1048 1049 1050",
+ "1051 1052 1053",
+ "1054 1055 1056",
+ "1057 1058 1059",
+ "1060 1061 1062",
+ "1063 1064 1065",
+ "1066 1067 1068",
+ "1069 1070 1071",
+ "1072 1073 1074",
+ "1075 1076 1077",
+ "1078 1079 1080",
+ "1081 1082 1083",
+ "1084 1085 1086",
+ "1087 1088 1089",
+ "1090 1091 1092",
+ "1093 1094 1095",
+ "1096 1097 1098",
+ "1099 1100 1101",
+ "1102 1103 1104",
+ "1105 1106 1107",
+ "1108 1109 1110",
+ "1111 1112 1113",
+ "1114 1115 1116",
+ "1117 1118 1119",
+ "1120 1121 1122",
+ "1123 1124 1125",
+ "1126 1127 1128",
+ "1129 1130 1131",
+ "1132 1133 1134",
+ "1135 1136 1137",
+ "1138 1139 1140",
+ "1141 1142 1143",
+ "1144 1145 1146",
+ "1147 1148 1149",
+ "1150 1151 1152",
+ "1153 1154 1155",
+ "1156 1157 1158",
+ "1159 1160 1161",
+ "1162 1163 1164",
+ "1165 1166 1167",
+ "1168 1169 1170",
+ "1171 1172 1173",
+ "1174 1175 1176",
+ "1177 1178 1179",
+ "1180 1181 1182",
+ "1183 1184 1185",
+ "1186 1187 1188",
+ "1189 1190 1191",
+ "1192 1193 1194",
+ "1195 1196 1197",
+ "1198 1199 1200",
+ "1201 1202 1203",
+ "1204 1205 1206",
+ "1207 1208 1209",
+ "1210 1211 1212",
+ "1213 1214 1215",
+ "1216 1217 1218",
+ "1219 1220 1221",
+ "1222 1223 1224",
+ "1225 1226 1227",
+ "1228 1229 1230",
+ "1231 1232 1233",
+ "1234 1235 1236",
+ "1237 1238 1239",
+ "1240 1241 1242",
+ "1243 1244 1245",
+ "1246 1247 1248",
+ "1249 1250 1251",
+ "1252 1253 1254",
+ "1255 1256 1257",
+ "1258 1259 1260",
+ "1261 1262 1263",
+ "1264 1265 1266",
+ "1267 1268 1269",
+ "0 1 2",
+ "3 4 5",
+ "6 7 8",
+ "9 10 11",
+ "12 13 14",
+ "15 16 17",
+ "18 19 20",
+ "21 22 23",
+ "24 25 26",
+ "27 28 29",
+ "30 31 32",
+ "33 34 35",
+ "36 37 38",
+ "39 40 41",
+ "42 43 44",
+ "45 46 47",
+ "48 49 50",
+ "51 52 53",
+ "54 55 56",
+ "57 58 59",
+ "60 61 62",
+ "63 64 65",
+ "66 67 68",
+ "69 70 71",
+ "72 73 74",
+ "75 76 77",
+ "78 79 80",
+ "81 82 83",
+ "84 85 86",
+ "87 88 89",
+ "90 91 92",
+ "93 94 95",
+ "96 97 98",
+ "99 100 101",
+ "102 103 104",
+ "105 106 107",
+ "108 109 110",
+ "111 112 113",
+ "114 115 116",
+ "117 118 119",
+ "120 121 122",
+ "123 124 125",
+ "126 127 128",
+ "129 130 131",
+ "132 133 134",
+ "135 136 137",
+ "138 139 140",
+ "141 142 143",
+ "144 145 146",
+ "147 148 149",
+ "150 151 152",
+ "153 154 155",
+ "156 157 158",
+ "159 160 161",
+ "162 163 164",
+ "165 166 167",
+ "168 169 170",
+ "171 172 173",
+ "174 175 176",
+ "177 178 179",
+ "180 181 182",
+ "183 184 185",
+ "186 187 188",
+ "189 190 191",
+ "192 193 194",
+ "195 196 197",
+ "198 199 200",
+ "201 202 203",
+ "204 205 206",
+ "207 208 209",
+ "210 211 212",
+ "213 214 215",
+ "216 217 218",
+ "219 220 221",
+ "222 223 224",
+ "225 226 227",
+ "228 229 230",
+ "231 232 233",
+ "234 235 236",
+ "237 238 239",
+ "240 241 242",
+ "243 244 245",
+ "246 247 248",
+ "249 250 251",
+ "252 253 254",
+ "255 256 257",
+ "258 259 260",
+ "261 262 263",
+ "264 265 266",
+ "267 268 269");
+
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ public OutlineInvokeStaticBailoutTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void test() throws Exception {
+ testForR8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .addKeepMainRule(TestClass.class)
+ .addOptionsModification(options -> options.outline.threshold = 2)
+ .enableInliningAnnotations()
+ .setMinApi(parameters)
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+
+ public static class TestClass {
+
+ public static void main(String[] args) {
+ toOutline1();
+ toOutline2();
+ }
+
+ @NeverInline
+ private static void print(String s1, String s2, String s3) {
+ System.out.println(s1 + " " + s2 + " " + s3);
+ }
+
+ @NeverInline
+ private static void toOutline1() {
+ print("1000", "1001", "1002");
+ print("1003", "1004", "1005");
+ print("1006", "1007", "1008");
+ print("1009", "1010", "1011");
+ print("1012", "1013", "1014");
+ print("1015", "1016", "1017");
+ print("1018", "1019", "1020");
+ print("1021", "1022", "1023");
+ print("1024", "1025", "1026");
+ print("1027", "1028", "1029");
+ print("1030", "1031", "1032");
+ print("1033", "1034", "1035");
+ print("1036", "1037", "1038");
+ print("1039", "1040", "1041");
+ print("1042", "1043", "1044");
+ print("1045", "1046", "1047");
+ print("1048", "1049", "1050");
+ print("1051", "1052", "1053");
+ print("1054", "1055", "1056");
+ print("1057", "1058", "1059");
+ print("1060", "1061", "1062");
+ print("1063", "1064", "1065");
+ print("1066", "1067", "1068");
+ print("1069", "1070", "1071");
+ print("1072", "1073", "1074");
+ print("1075", "1076", "1077");
+ print("1078", "1079", "1080");
+ print("1081", "1082", "1083");
+ print("1084", "1085", "1086");
+ print("1087", "1088", "1089");
+ print("1090", "1091", "1092");
+ print("1093", "1094", "1095");
+ print("1096", "1097", "1098");
+ print("1099", "1100", "1101");
+ print("1102", "1103", "1104");
+ print("1105", "1106", "1107");
+ print("1108", "1109", "1110");
+ print("1111", "1112", "1113");
+ print("1114", "1115", "1116");
+ print("1117", "1118", "1119");
+ print("1120", "1121", "1122");
+ print("1123", "1124", "1125");
+ print("1126", "1127", "1128");
+ print("1129", "1130", "1131");
+ print("1132", "1133", "1134");
+ print("1135", "1136", "1137");
+ print("1138", "1139", "1140");
+ print("1141", "1142", "1143");
+ print("1144", "1145", "1146");
+ print("1147", "1148", "1149");
+ print("1150", "1151", "1152");
+ print("1153", "1154", "1155");
+ print("1156", "1157", "1158");
+ print("1159", "1160", "1161");
+ print("1162", "1163", "1164");
+ print("1165", "1166", "1167");
+ print("1168", "1169", "1170");
+ print("1171", "1172", "1173");
+ print("1174", "1175", "1176");
+ print("1177", "1178", "1179");
+ print("1180", "1181", "1182");
+ print("1183", "1184", "1185");
+ print("1186", "1187", "1188");
+ print("1189", "1190", "1191");
+ print("1192", "1193", "1194");
+ print("1195", "1196", "1197");
+ print("1198", "1199", "1200");
+ print("1201", "1202", "1203");
+ print("1204", "1205", "1206");
+ print("1207", "1208", "1209");
+ print("1210", "1211", "1212");
+ print("1213", "1214", "1215");
+ print("1216", "1217", "1218");
+ print("1219", "1220", "1221");
+ print("1222", "1223", "1224");
+ print("1225", "1226", "1227");
+ print("1228", "1229", "1230");
+ print("1231", "1232", "1233");
+ print("1234", "1235", "1236");
+ print("1237", "1238", "1239");
+ print("1240", "1241", "1242");
+ print("1243", "1244", "1245");
+ print("1246", "1247", "1248");
+ print("1249", "1250", "1251");
+ print("1252", "1253", "1254");
+ print("1255", "1256", "1257");
+ print("1258", "1259", "1260");
+ print("1261", "1262", "1263");
+ print("1264", "1265", "1266");
+ print("1267", "1268", "1269");
+ }
+
+ @NeverInline
+ private static void toOutline2() {
+ print("0", "1", "2");
+ print("3", "4", "5");
+ print("6", "7", "8");
+ print("9", "10", "11");
+ print("12", "13", "14");
+ print("15", "16", "17");
+ print("18", "19", "20");
+ print("21", "22", "23");
+ print("24", "25", "26");
+ print("27", "28", "29");
+ print("30", "31", "32");
+ print("33", "34", "35");
+ print("36", "37", "38");
+ print("39", "40", "41");
+ print("42", "43", "44");
+ print("45", "46", "47");
+ print("48", "49", "50");
+ print("51", "52", "53");
+ print("54", "55", "56");
+ print("57", "58", "59");
+ print("60", "61", "62");
+ print("63", "64", "65");
+ print("66", "67", "68");
+ print("69", "70", "71");
+ print("72", "73", "74");
+ print("75", "76", "77");
+ print("78", "79", "80");
+ print("81", "82", "83");
+ print("84", "85", "86");
+ print("87", "88", "89");
+ print("90", "91", "92");
+ print("93", "94", "95");
+ print("96", "97", "98");
+ print("99", "100", "101");
+ print("102", "103", "104");
+ print("105", "106", "107");
+ print("108", "109", "110");
+ print("111", "112", "113");
+ print("114", "115", "116");
+ print("117", "118", "119");
+ print("120", "121", "122");
+ print("123", "124", "125");
+ print("126", "127", "128");
+ print("129", "130", "131");
+ print("132", "133", "134");
+ print("135", "136", "137");
+ print("138", "139", "140");
+ print("141", "142", "143");
+ print("144", "145", "146");
+ print("147", "148", "149");
+ print("150", "151", "152");
+ print("153", "154", "155");
+ print("156", "157", "158");
+ print("159", "160", "161");
+ print("162", "163", "164");
+ print("165", "166", "167");
+ print("168", "169", "170");
+ print("171", "172", "173");
+ print("174", "175", "176");
+ print("177", "178", "179");
+ print("180", "181", "182");
+ print("183", "184", "185");
+ print("186", "187", "188");
+ print("189", "190", "191");
+ print("192", "193", "194");
+ print("195", "196", "197");
+ print("198", "199", "200");
+ print("201", "202", "203");
+ print("204", "205", "206");
+ print("207", "208", "209");
+ print("210", "211", "212");
+ print("213", "214", "215");
+ print("216", "217", "218");
+ print("219", "220", "221");
+ print("222", "223", "224");
+ print("225", "226", "227");
+ print("228", "229", "230");
+ print("231", "232", "233");
+ print("234", "235", "236");
+ print("237", "238", "239");
+ print("240", "241", "242");
+ print("243", "244", "245");
+ print("246", "247", "248");
+ print("249", "250", "251");
+ print("252", "253", "254");
+ print("255", "256", "257");
+ print("258", "259", "260");
+ print("261", "262", "263");
+ print("264", "265", "266");
+ print("267", "268", "269");
+ }
+ }
+}