1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 public class Main { 18 static int static_int = 0; 19 static long static_long = 0; 20 main(String[] args)21 public static void main(String[] args) { 22 $noinline$testSameStartEndInt(); 23 assertIntEquals(0, static_int); 24 $noinline$testStartBiggerThanEndInt(); 25 assertIntEquals(0, static_int); 26 $noinline$testUnknownParameterValuesInt(10, 1); 27 assertIntEquals(0, static_int); 28 $noinline$testKnownParameterValuesInt(); 29 assertIntEquals(0, static_int); 30 $noinline$testKnownParameterValuesInt_WithOverflow(); 31 assertIntEquals(0, static_int); 32 33 $noinline$testSameStartEndLong(); 34 assertLongEquals(0L, static_long); 35 $noinline$testStartBiggerThanEndLong(); 36 assertLongEquals(0L, static_long); 37 $noinline$testUnknownParameterValuesLong(10L, 1L); 38 assertLongEquals(0L, static_long); 39 $noinline$testKnownParameterValuesLong(); 40 assertLongEquals(0L, static_long); 41 $noinline$testKnownParameterValuesLong_WithOverflow(); 42 assertLongEquals(0L, static_long); 43 } 44 45 /// CHECK-START: void Main.$noinline$testSameStartEndInt() loop_optimization (before) 46 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 47 /// CHECK: If [<<Comp>>] 48 49 /// CHECK-START: void Main.$noinline$testSameStartEndInt() loop_optimization (after) 50 /// CHECK: <<Const1:i\d+>> IntConstant 1 51 /// CHECK: If [<<Const1>>] 52 53 /// CHECK-START: void Main.$noinline$testSameStartEndInt() dead_code_elimination$after_loop_opt (before) 54 /// CHECK: Phi 55 /// CHECK: GreaterThanOrEqual 56 /// CHECK: If 57 /// CHECK: StaticFieldSet 58 59 /// CHECK-START: void Main.$noinline$testSameStartEndInt() dead_code_elimination$after_loop_opt (after) 60 /// CHECK-NOT: Phi 61 /// CHECK-NOT: GreaterThanOrEqual 62 /// CHECK-NOT: If 63 /// CHECK-NOT: StaticFieldSet $noinline$testSameStartEndInt()64 private static void $noinline$testSameStartEndInt() { 65 for (int i = 2; i < 2; i++) { 66 static_int = 24; 67 } 68 } 69 70 /// CHECK-START: void Main.$noinline$testStartBiggerThanEndInt() loop_optimization (before) 71 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 72 /// CHECK: If [<<Comp>>] 73 74 /// CHECK-START: void Main.$noinline$testStartBiggerThanEndInt() loop_optimization (after) 75 /// CHECK: <<Const1:i\d+>> IntConstant 1 76 /// CHECK: If [<<Const1>>] 77 78 /// CHECK-START: void Main.$noinline$testStartBiggerThanEndInt() dead_code_elimination$after_loop_opt (before) 79 /// CHECK: Phi 80 /// CHECK: GreaterThanOrEqual 81 /// CHECK: If 82 /// CHECK: StaticFieldSet 83 84 /// CHECK-START: void Main.$noinline$testStartBiggerThanEndInt() dead_code_elimination$after_loop_opt (after) 85 /// CHECK-NOT: Phi 86 /// CHECK-NOT: GreaterThanOrEqual 87 /// CHECK-NOT: If 88 /// CHECK-NOT: StaticFieldSet $noinline$testStartBiggerThanEndInt()89 public static void $noinline$testStartBiggerThanEndInt() { 90 for (int i = 2; i < 1; i++) { 91 static_int = 24; 92 } 93 } 94 95 // Since the parameters are unknown, we have to keep the loop. 96 97 /// CHECK-START: void Main.$noinline$testUnknownParameterValuesInt(int, int) loop_optimization (before) 98 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 99 /// CHECK: If [<<Comp>>] 100 101 /// CHECK-START: void Main.$noinline$testUnknownParameterValuesInt(int, int) loop_optimization (after) 102 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 103 /// CHECK: If [<<Comp>>] $noinline$testUnknownParameterValuesInt(int start, int end)104 public static void $noinline$testUnknownParameterValuesInt(int start, int end) { 105 for (int i = start; i < end; i++) { 106 static_int = 24; 107 } 108 } 109 $inline$unknownParameterValuesInt(int start, int end)110 public static void $inline$unknownParameterValuesInt(int start, int end) { 111 for (int i = start; i < end; i++) { 112 static_int = 24; 113 } 114 } 115 116 /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt() loop_optimization (before) 117 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 118 /// CHECK: If [<<Comp>>] 119 120 /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt() loop_optimization (after) 121 /// CHECK: <<Const1:i\d+>> IntConstant 1 122 /// CHECK: If [<<Const1>>] 123 124 /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt() dead_code_elimination$after_loop_opt (before) 125 /// CHECK: Phi 126 /// CHECK: GreaterThanOrEqual 127 /// CHECK: If 128 /// CHECK: StaticFieldSet 129 130 /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt() dead_code_elimination$after_loop_opt (after) 131 /// CHECK-NOT: Phi 132 /// CHECK-NOT: GreaterThanOrEqual 133 /// CHECK-NOT: If 134 /// CHECK-NOT: StaticFieldSet $noinline$testKnownParameterValuesInt()135 public static void $noinline$testKnownParameterValuesInt() { 136 $inline$unknownParameterValuesInt(10, 1); 137 } 138 139 // Known limitatation: The loop count calculation would overflow so loop optimization doesn't 140 // know how many trips there are. 141 142 /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt_WithOverflow() loop_optimization (before) 143 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 144 /// CHECK: If [<<Comp>>] 145 146 /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt_WithOverflow() loop_optimization (after) 147 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 148 /// CHECK: If [<<Comp>>] $noinline$testKnownParameterValuesInt_WithOverflow()149 public static void $noinline$testKnownParameterValuesInt_WithOverflow() { 150 $inline$unknownParameterValuesInt(Integer.MAX_VALUE, Integer.MIN_VALUE); 151 } 152 153 /// CHECK-START: void Main.$noinline$testSameStartEndLong() loop_optimization (before) 154 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 155 /// CHECK: If [<<Comp>>] 156 157 /// CHECK-START: void Main.$noinline$testSameStartEndLong() loop_optimization (after) 158 /// CHECK: <<Const1:i\d+>> IntConstant 1 159 /// CHECK: If [<<Const1>>] 160 161 /// CHECK-START: void Main.$noinline$testSameStartEndLong() dead_code_elimination$after_loop_opt (before) 162 /// CHECK: Phi 163 /// CHECK: GreaterThanOrEqual 164 /// CHECK: If 165 /// CHECK: StaticFieldSet 166 167 /// CHECK-START: void Main.$noinline$testSameStartEndLong() dead_code_elimination$after_loop_opt (after) 168 /// CHECK-NOT: Phi 169 /// CHECK-NOT: GreaterThanOrEqual 170 /// CHECK-NOT: If 171 /// CHECK-NOT: StaticFieldSet $noinline$testSameStartEndLong()172 private static void $noinline$testSameStartEndLong() { 173 for (long i = 2; i < 2; i++) { 174 static_long = 24; 175 } 176 } 177 178 /// CHECK-START: void Main.$noinline$testStartBiggerThanEndLong() loop_optimization (before) 179 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 180 /// CHECK: If [<<Comp>>] 181 182 /// CHECK-START: void Main.$noinline$testStartBiggerThanEndLong() loop_optimization (after) 183 /// CHECK: <<Const1:i\d+>> IntConstant 1 184 /// CHECK: If [<<Const1>>] 185 186 /// CHECK-START: void Main.$noinline$testStartBiggerThanEndLong() dead_code_elimination$after_loop_opt (before) 187 /// CHECK: Phi 188 /// CHECK: GreaterThanOrEqual 189 /// CHECK: If 190 /// CHECK: StaticFieldSet 191 192 /// CHECK-START: void Main.$noinline$testStartBiggerThanEndLong() dead_code_elimination$after_loop_opt (after) 193 /// CHECK-NOT: Phi 194 /// CHECK-NOT: GreaterThanOrEqual 195 /// CHECK-NOT: If 196 /// CHECK-NOT: StaticFieldSet $noinline$testStartBiggerThanEndLong()197 public static void $noinline$testStartBiggerThanEndLong() { 198 for (long i = 2; i < 1; i++) { 199 static_long = 24; 200 } 201 } 202 203 // Since the parameters are unknown, we have to keep the loop. 204 205 /// CHECK-START: void Main.$noinline$testUnknownParameterValuesLong(long, long) loop_optimization (before) 206 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 207 /// CHECK: If [<<Comp>>] 208 209 /// CHECK-START: void Main.$noinline$testUnknownParameterValuesLong(long, long) loop_optimization (after) 210 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 211 /// CHECK: If [<<Comp>>] $noinline$testUnknownParameterValuesLong(long start, long end)212 public static void $noinline$testUnknownParameterValuesLong(long start, long end) { 213 for (long i = start; i < end; i++) { 214 static_long = 24; 215 } 216 } 217 $inline$unknownParameterValuesLong(long start, long end)218 public static void $inline$unknownParameterValuesLong(long start, long end) { 219 for (long i = start; i < end; i++) { 220 static_long = 24; 221 } 222 } 223 224 /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong() loop_optimization (before) 225 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 226 /// CHECK: If [<<Comp>>] 227 228 /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong() loop_optimization (after) 229 /// CHECK: <<Const1:i\d+>> IntConstant 1 230 /// CHECK: If [<<Const1>>] 231 232 /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong() dead_code_elimination$after_loop_opt (before) 233 /// CHECK: Phi 234 /// CHECK: GreaterThanOrEqual 235 /// CHECK: If 236 /// CHECK: StaticFieldSet 237 238 /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong() dead_code_elimination$after_loop_opt (after) 239 /// CHECK-NOT: Phi 240 /// CHECK-NOT: GreaterThanOrEqual 241 /// CHECK-NOT: If 242 /// CHECK-NOT: StaticFieldSet $noinline$testKnownParameterValuesLong()243 public static void $noinline$testKnownParameterValuesLong() { 244 $inline$unknownParameterValuesLong(10L, 1L); 245 } 246 247 // Known limitatation: The loop count calculation would overflow so loop optimization doesn't 248 // know how many trips there are. 249 250 /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong_WithOverflow() loop_optimization (before) 251 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 252 /// CHECK: If [<<Comp>>] 253 254 /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong_WithOverflow() loop_optimization (after) 255 /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual 256 /// CHECK: If [<<Comp>>] $noinline$testKnownParameterValuesLong_WithOverflow()257 public static void $noinline$testKnownParameterValuesLong_WithOverflow() { 258 $inline$unknownParameterValuesLong(Long.MAX_VALUE, Long.MIN_VALUE); 259 } 260 assertIntEquals(int expected, int result)261 public static void assertIntEquals(int expected, int result) { 262 if (expected != result) { 263 throw new Error("Expected: " + expected + ", found: " + result); 264 } 265 } 266 assertLongEquals(long expected, long result)267 public static void assertLongEquals(long expected, long result) { 268 if (expected != result) { 269 throw new Error("Expected: " + expected + ", found: " + result); 270 } 271 } 272 } 273