1 /* 2 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 import jdk.incubator.code.CodeReflection; 25 import java.util.List; 26 27 /* 28 * @test 29 * @summary Smoke test for code reflection with for loops. 30 * @modules jdk.incubator.code 31 * @build BreakContinueTest 32 * @build CodeReflectionTester 33 * @run main CodeReflectionTester BreakContinueTest 34 */ 35 36 37 public class BreakContinueTest { 38 @CodeReflection 39 @IR(""" 40 func @"test1" (%0 : java.type:"BreakContinueTest")java.type:"void" -> { 41 java.for 42 ()Var<java.type:"int"> -> { 43 %1 : java.type:"int" = constant @0; 44 %2 : Var<java.type:"int"> = var %1 @"i"; 45 yield %2; 46 } 47 (%3 : Var<java.type:"int">)java.type:"boolean" -> { 48 %4 : java.type:"int" = var.load %3; 49 %5 : java.type:"int" = constant @10; 50 %6 : java.type:"boolean" = lt %4 %5; 51 yield %6; 52 } 53 (%7 : Var<java.type:"int">)java.type:"void" -> { 54 %8 : java.type:"int" = var.load %7; 55 %9 : java.type:"int" = constant @1; 56 %10 : java.type:"int" = add %8 %9; 57 var.store %7 %10; 58 yield; 59 } 60 (%11 : Var<java.type:"int">)java.type:"void" -> { 61 java.if 62 ()java.type:"boolean" -> { 63 %12 : java.type:"boolean" = constant @true; 64 yield %12; 65 } 66 ()java.type:"void" -> { 67 java.continue; 68 } 69 ()java.type:"void" -> { 70 yield; 71 }; 72 java.if 73 ()java.type:"boolean" -> { 74 %13 : java.type:"boolean" = constant @true; 75 yield %13; 76 } 77 ()java.type:"void" -> { 78 java.break; 79 } 80 ()java.type:"void" -> { 81 yield; 82 }; 83 java.for 84 ()Var<java.type:"int"> -> { 85 %14 : java.type:"int" = constant @0; 86 %15 : Var<java.type:"int"> = var %14 @"j"; 87 yield %15; 88 } 89 (%16 : Var<java.type:"int">)java.type:"boolean" -> { 90 %17 : java.type:"int" = var.load %16; 91 %18 : java.type:"int" = constant @10; 92 %19 : java.type:"boolean" = lt %17 %18; 93 yield %19; 94 } 95 (%20 : Var<java.type:"int">)java.type:"void" -> { 96 %21 : java.type:"int" = var.load %20; 97 %22 : java.type:"int" = constant @1; 98 %23 : java.type:"int" = add %21 %22; 99 var.store %20 %23; 100 yield; 101 } 102 (%24 : Var<java.type:"int">)java.type:"void" -> { 103 java.if 104 ()java.type:"boolean" -> { 105 %25 : java.type:"boolean" = constant @true; 106 yield %25; 107 } 108 ()java.type:"void" -> { 109 java.continue; 110 } 111 ()java.type:"void" -> { 112 yield; 113 }; 114 java.if 115 ()java.type:"boolean" -> { 116 %26 : java.type:"boolean" = constant @true; 117 yield %26; 118 } 119 ()java.type:"void" -> { 120 java.break; 121 } 122 ()java.type:"void" -> { 123 yield; 124 }; 125 java.continue; 126 }; 127 java.continue; 128 }; 129 return; 130 }; 131 """) 132 void test1() { 133 for (int i = 0; i < 10; i++) { 134 if (true) { 135 continue; 136 } 137 if (true) { 138 break; 139 } 140 for (int j = 0; j < 10; j++) { 141 if (true) { 142 continue; 143 } 144 if (true) { 145 break; 146 } 147 } 148 } 149 } 150 151 @CodeReflection 152 @IR(""" 153 func @"test2" (%0 : java.type:"BreakContinueTest")java.type:"void" -> { 154 java.labeled ()java.type:"void" -> { 155 %1 : java.type:"java.lang.String" = constant @"outer"; 156 java.for 157 ()Var<java.type:"int"> -> { 158 %2 : java.type:"int" = constant @0; 159 %3 : Var<java.type:"int"> = var %2 @"i"; 160 yield %3; 161 } 162 (%4 : Var<java.type:"int">)java.type:"boolean" -> { 163 %5 : java.type:"int" = var.load %4; 164 %6 : java.type:"int" = constant @10; 165 %7 : java.type:"boolean" = lt %5 %6; 166 yield %7; 167 } 168 (%8 : Var<java.type:"int">)java.type:"void" -> { 169 %9 : java.type:"int" = var.load %8; 170 %10 : java.type:"int" = constant @1; 171 %11 : java.type:"int" = add %9 %10; 172 var.store %8 %11; 173 yield; 174 } 175 (%12 : Var<java.type:"int">)java.type:"void" -> { 176 java.if 177 ()java.type:"boolean" -> { 178 %13 : java.type:"boolean" = constant @true; 179 yield %13; 180 } 181 ()java.type:"void" -> { 182 java.continue %1; 183 } 184 ()java.type:"void" -> { 185 yield; 186 }; 187 java.if 188 ()java.type:"boolean" -> { 189 %14 : java.type:"boolean" = constant @true; 190 yield %14; 191 } 192 ()java.type:"void" -> { 193 java.break %1; 194 } 195 ()java.type:"void" -> { 196 yield; 197 }; 198 java.labeled ()java.type:"void" -> { 199 %15 : java.type:"java.lang.String" = constant @"inner"; 200 java.for 201 ()Var<java.type:"int"> -> { 202 %16 : java.type:"int" = constant @0; 203 %17 : Var<java.type:"int"> = var %16 @"j"; 204 yield %17; 205 } 206 (%18 : Var<java.type:"int">)java.type:"boolean" -> { 207 %19 : java.type:"int" = var.load %18; 208 %20 : java.type:"int" = constant @10; 209 %21 : java.type:"boolean" = lt %19 %20; 210 yield %21; 211 } 212 (%22 : Var<java.type:"int">)java.type:"void" -> { 213 %23 : java.type:"int" = var.load %22; 214 %24 : java.type:"int" = constant @1; 215 %25 : java.type:"int" = add %23 %24; 216 var.store %22 %25; 217 yield; 218 } 219 (%26 : Var<java.type:"int">)java.type:"void" -> { 220 java.if 221 ()java.type:"boolean" -> { 222 %27 : java.type:"boolean" = constant @true; 223 yield %27; 224 } 225 ()java.type:"void" -> { 226 java.continue; 227 } 228 ()java.type:"void" -> { 229 yield; 230 }; 231 java.if 232 ()java.type:"boolean" -> { 233 %28 : java.type:"boolean" = constant @true; 234 yield %28; 235 } 236 ()java.type:"void" -> { 237 java.break; 238 } 239 ()java.type:"void" -> { 240 yield; 241 }; 242 java.if 243 ()java.type:"boolean" -> { 244 %29 : java.type:"boolean" = constant @true; 245 yield %29; 246 } 247 ()java.type:"void" -> { 248 java.continue %1; 249 } 250 ()java.type:"void" -> { 251 yield; 252 }; 253 java.if 254 ()java.type:"boolean" -> { 255 %30 : java.type:"boolean" = constant @true; 256 yield %30; 257 } 258 ()java.type:"void" -> { 259 java.break %1; 260 } 261 ()java.type:"void" -> { 262 yield; 263 }; 264 java.continue; 265 }; 266 yield; 267 }; 268 java.continue; 269 }; 270 yield; 271 }; 272 return; 273 }; 274 """) 275 void test2() { 276 outer: 277 for (int i = 0; i < 10; i++) { 278 if (true) { 279 continue outer; 280 } 281 if (true) { 282 break outer; 283 } 284 inner: 285 for (int j = 0; j < 10; j++) { 286 if (true) { 287 continue; 288 } 289 if (true) { 290 break; 291 } 292 if (true) { 293 continue outer; 294 } 295 if (true) { 296 break outer; 297 } 298 } 299 } 300 } 301 302 @CodeReflection 303 @IR(""" 304 func @"test3" (%0 : java.type:"BreakContinueTest")java.type:"void" -> { 305 java.labeled ()java.type:"void" -> { 306 %1 : java.type:"java.lang.String" = constant @"b1"; 307 java.block ()java.type:"void" -> { 308 java.labeled ()java.type:"void" -> { 309 %2 : java.type:"java.lang.String" = constant @"b2"; 310 java.block ()java.type:"void" -> { 311 java.if 312 ()java.type:"boolean" -> { 313 %3 : java.type:"boolean" = constant @true; 314 yield %3; 315 } 316 ()java.type:"void" -> { 317 java.break %1; 318 } 319 ()java.type:"void" -> { 320 yield; 321 }; 322 java.if 323 ()java.type:"boolean" -> { 324 %4 : java.type:"boolean" = constant @true; 325 yield %4; 326 } 327 ()java.type:"void" -> { 328 java.break %2; 329 } 330 ()java.type:"void" -> { 331 yield; 332 }; 333 yield; 334 }; 335 yield; 336 }; 337 yield; 338 }; 339 yield; 340 }; 341 return; 342 }; 343 """) 344 void test3() { 345 b1: 346 { 347 b2: 348 { 349 if (true) { 350 break b1; 351 } 352 if (true) { 353 break b2; 354 } 355 } 356 } 357 } 358 359 @CodeReflection 360 @IR(""" 361 func @"test4" (%0 : java.type:"BreakContinueTest")java.type:"void" -> { 362 java.labeled ()java.type:"void" -> { 363 %1 : java.type:"java.lang.String" = constant @"b"; 364 java.break %1; 365 }; 366 %2 : java.type:"int" = constant @0; 367 %3 : Var<java.type:"int"> = var %2 @"i"; 368 java.labeled ()java.type:"void" -> { 369 %4 : java.type:"java.lang.String" = constant @"b"; 370 %5 : java.type:"int" = var.load %3; 371 %6 : java.type:"int" = constant @1; 372 %7 : java.type:"int" = add %5 %6; 373 var.store %3 %7; 374 yield; 375 }; 376 java.labeled ()java.type:"void" -> { 377 %8 : java.type:"java.lang.String" = constant @"a"; 378 java.labeled ()java.type:"void" -> { 379 %9 : java.type:"java.lang.String" = constant @"b"; 380 java.block ()java.type:"void" -> { 381 yield; 382 }; 383 yield; 384 }; 385 yield; 386 }; 387 return; 388 }; 389 """) 390 void test4() { 391 b: 392 break b; 393 394 int i = 0; 395 b: 396 i++; 397 398 a: b: { 399 } 400 } 401 }