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