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");
+    }
+  }
+}