1 import jdk.incubator.code.Reflect;
   2 import java.util.Collection;
   3 import java.util.RandomAccess;
   4 import java.util.Stack;
   5 
   6 /*
   7  * @test
   8  * @modules jdk.incubator.code
   9  * @build SwitchStatementTest
  10  * @build CodeReflectionTester
  11  * @run main CodeReflectionTester SwitchStatementTest
  12  */
  13 public class SwitchStatementTest {
  14 
  15     @IR("""
  16             func @"caseConstantRuleExpression" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
  17                 %1 : Var<java.type:"java.lang.String"> = var %0 @"r";
  18                 %2 : java.type:"java.lang.String" = constant @"";
  19                 %3 : Var<java.type:"java.lang.String"> = var %2 @"s";
  20                 %4 : java.type:"java.lang.String" = var.load %1;
  21                 java.switch.statement %4
  22                     (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
  23                         %6 : java.type:"java.lang.String" = constant @"FOO";
  24                         %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
  25                         yield %7;
  26                     }
  27                     ()java.type:"void" -> {
  28                         %8 : java.type:"java.lang.String" = var.load %3;
  29                         %9 : java.type:"java.lang.String" = constant @"BAR";
  30                         %10 : java.type:"java.lang.String" = concat %8 %9;
  31                         var.store %3 %10;
  32                         yield;
  33                     }
  34                     (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
  35                         %12 : java.type:"java.lang.String" = constant @"BAR";
  36                         %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
  37                         yield %13;
  38                     }
  39                     ()java.type:"void" -> {
  40                         %14 : java.type:"java.lang.String" = var.load %3;
  41                         %15 : java.type:"java.lang.String" = constant @"BAZ";
  42                         %16 : java.type:"java.lang.String" = concat %14 %15;
  43                         var.store %3 %16;
  44                         yield;
  45                     }
  46                     (%17 : java.type:"java.lang.String")java.type:"boolean" -> {
  47                         %18 : java.type:"java.lang.String" = constant @"BAZ";
  48                         %19 : java.type:"boolean" = invoke %17 %18 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
  49                         yield %19;
  50                     }
  51                     ()java.type:"void" -> {
  52                         %20 : java.type:"java.lang.String" = var.load %3;
  53                         %21 : java.type:"java.lang.String" = constant @"FOO";
  54                         %22 : java.type:"java.lang.String" = concat %20 %21;
  55                         var.store %3 %22;
  56                         yield;
  57                     }
  58                     ()java.type:"boolean" -> {
  59                         %23 : java.type:"boolean" = constant @true;
  60                         yield %23;
  61                     }
  62                     ()java.type:"void" -> {
  63                         %24 : java.type:"java.lang.String" = var.load %3;
  64                         %25 : java.type:"java.lang.String" = constant @"else";
  65                         %26 : java.type:"java.lang.String" = concat %24 %25;
  66                         var.store %3 %26;
  67                         yield;
  68                     };
  69                 %27 : java.type:"java.lang.String" = var.load %3;
  70                 return %27;
  71             };
  72             """)
  73     @Reflect
  74     public static String caseConstantRuleExpression(String r) {
  75         String s = "";
  76         switch (r) {
  77             case "FOO" -> s += "BAR";
  78             case "BAR" -> s += "BAZ";
  79             case "BAZ" -> s += "FOO";
  80             default -> s += "else";
  81         }
  82         return s;
  83     }
  84 
  85     @IR("""
  86             func @"caseConstantRuleBlock" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
  87                 %1 : Var<java.type:"java.lang.String"> = var %0 @"r";
  88                 %2 : java.type:"java.lang.String" = constant @"";
  89                 %3 : Var<java.type:"java.lang.String"> = var %2 @"s";
  90                 %4 : java.type:"java.lang.String" = var.load %1;
  91                 java.switch.statement %4
  92                     (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
  93                         %6 : java.type:"java.lang.String" = constant @"FOO";
  94                         %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
  95                         yield %7;
  96                     }
  97                     ()java.type:"void" -> {
  98                         %8 : java.type:"java.lang.String" = var.load %3;
  99                         %9 : java.type:"java.lang.String" = constant @"BAR";
 100                         %10 : java.type:"java.lang.String" = concat %8 %9;
 101                         var.store %3 %10;
 102                         yield;
 103                     }
 104                     (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
 105                         %12 : java.type:"java.lang.String" = constant @"BAR";
 106                         %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
 107                         yield %13;
 108                     }
 109                     ()java.type:"void" -> {
 110                         %14 : java.type:"java.lang.String" = var.load %3;
 111                         %15 : java.type:"java.lang.String" = constant @"BAZ";
 112                         %16 : java.type:"java.lang.String" = concat %14 %15;
 113                         var.store %3 %16;
 114                         yield;
 115                     }
 116                     (%17 : java.type:"java.lang.String")java.type:"boolean" -> {
 117                         %18 : java.type:"java.lang.String" = constant @"BAZ";
 118                         %19 : java.type:"boolean" = invoke %17 %18 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
 119                         yield %19;
 120                     }
 121                     ()java.type:"void" -> {
 122                         %20 : java.type:"java.lang.String" = var.load %3;
 123                         %21 : java.type:"java.lang.String" = constant @"FOO";
 124                         %22 : java.type:"java.lang.String" = concat %20 %21;
 125                         var.store %3 %22;
 126                         yield;
 127                     }
 128                     ()java.type:"boolean" -> {
 129                         %23 : java.type:"boolean" = constant @true;
 130                         yield %23;
 131                     }
 132                     ()java.type:"void" -> {
 133                         %24 : java.type:"java.lang.String" = var.load %3;
 134                         %25 : java.type:"java.lang.String" = constant @"else";
 135                         %26 : java.type:"java.lang.String" = concat %24 %25;
 136                         var.store %3 %26;
 137                         yield;
 138                     };
 139                 %27 : java.type:"java.lang.String" = var.load %3;
 140                 return %27;
 141             };
 142             """)
 143     @Reflect
 144     public static String caseConstantRuleBlock(String r) {
 145         String s = "";
 146         switch (r) {
 147             case "FOO" -> {
 148                 s += "BAR";
 149             }
 150             case "BAR" -> {
 151                 s += "BAZ";
 152             }
 153             case "BAZ" -> {
 154                 s += "FOO";
 155             }
 156             default -> {
 157                 s += "else";
 158             }
 159         }
 160         return s;
 161     }
 162 
 163     @IR("""
 164             func @"caseConstantStatement" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
 165                 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
 166                 %2 : java.type:"java.lang.String" = constant @"";
 167                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
 168                 %4 : java.type:"java.lang.String" = var.load %1;
 169                 java.switch.statement %4
 170                     (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
 171                         %6 : java.type:"java.lang.String" = constant @"FOO";
 172                         %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
 173                         yield %7;
 174                     }
 175                     ()java.type:"void" -> {
 176                         %8 : java.type:"java.lang.String" = var.load %3;
 177                         %9 : java.type:"java.lang.String" = constant @"BAR";
 178                         %10 : java.type:"java.lang.String" = concat %8 %9;
 179                         var.store %3 %10;
 180                         java.break;
 181                     }
 182                     (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
 183                         %12 : java.type:"java.lang.String" = constant @"BAR";
 184                         %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
 185                         yield %13;
 186                     }
 187                     ()java.type:"void" -> {
 188                         %14 : java.type:"java.lang.String" = var.load %3;
 189                         %15 : java.type:"java.lang.String" = constant @"BAZ";
 190                         %16 : java.type:"java.lang.String" = concat %14 %15;
 191                         var.store %3 %16;
 192                         java.break;
 193                     }
 194                     (%17 : java.type:"java.lang.String")java.type:"boolean" -> {
 195                         %18 : java.type:"java.lang.String" = constant @"BAZ";
 196                         %19 : java.type:"boolean" = invoke %17 %18 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
 197                         yield %19;
 198                     }
 199                     ()java.type:"void" -> {
 200                         %20 : java.type:"java.lang.String" = var.load %3;
 201                         %21 : java.type:"java.lang.String" = constant @"FOO";
 202                         %22 : java.type:"java.lang.String" = concat %20 %21;
 203                         var.store %3 %22;
 204                         java.break;
 205                     }
 206                     ()java.type:"boolean" -> {
 207                         %23 : java.type:"boolean" = constant @true;
 208                         yield %23;
 209                     }
 210                     ()java.type:"void" -> {
 211                         %24 : java.type:"java.lang.String" = var.load %3;
 212                         %25 : java.type:"java.lang.String" = constant @"else";
 213                         %26 : java.type:"java.lang.String" = concat %24 %25;
 214                         var.store %3 %26;
 215                         yield;
 216                     };
 217                 %27 : java.type:"java.lang.String" = var.load %3;
 218                 return %27;
 219             };
 220             """)
 221     @Reflect
 222     private static String caseConstantStatement(String s) {
 223         String r = "";
 224         switch (s) {
 225             case "FOO":
 226                 r += "BAR";
 227                 break;
 228             case "BAR":
 229                 r += "BAZ";
 230                 break;
 231             case "BAZ":
 232                 r += "FOO";
 233                 break;
 234             default:
 235                 r += "else";
 236         }
 237         return r;
 238     }
 239 
 240     @IR("""
 241             func @"caseConstantMultiLabels" (%0 : java.type:"char")java.type:"java.lang.String" -> {
 242                 %1 : Var<java.type:"char"> = var %0 @"c";
 243                 %2 : java.type:"java.lang.String" = constant @"";
 244                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
 245                 %4 : java.type:"char" = var.load %1;
 246                 %5 : java.type:"char" = invoke %4 @java.ref:"java.lang.Character::toLowerCase(char):char";
 247                 java.switch.statement %5
 248                     (%6 : java.type:"char")java.type:"boolean" -> {
 249                         %7 : java.type:"boolean" = java.cor
 250                             ()java.type:"boolean" -> {
 251                                 %8 : java.type:"char" = constant @'a';
 252                                 %9 : java.type:"boolean" = eq %6 %8;
 253                                 yield %9;
 254                             }
 255                             ()java.type:"boolean" -> {
 256                                 %10 : java.type:"char" = constant @'e';
 257                                 %11 : java.type:"boolean" = eq %6 %10;
 258                                 yield %11;
 259                             }
 260                             ()java.type:"boolean" -> {
 261                                 %12 : java.type:"char" = constant @'i';
 262                                 %13 : java.type:"boolean" = eq %6 %12;
 263                                 yield %13;
 264                             }
 265                             ()java.type:"boolean" -> {
 266                                 %14 : java.type:"char" = constant @'o';
 267                                 %15 : java.type:"boolean" = eq %6 %14;
 268                                 yield %15;
 269                             }
 270                             ()java.type:"boolean" -> {
 271                                 %16 : java.type:"char" = constant @'u';
 272                                 %17 : java.type:"boolean" = eq %6 %16;
 273                                 yield %17;
 274                             };
 275                         yield %7;
 276                     }
 277                     ()java.type:"void" -> {
 278                         %18 : java.type:"java.lang.String" = var.load %3;
 279                         %19 : java.type:"java.lang.String" = constant @"vowel";
 280                         %20 : java.type:"java.lang.String" = concat %18 %19;
 281                         var.store %3 %20;
 282                         java.break;
 283                     }
 284                     ()java.type:"boolean" -> {
 285                         %21 : java.type:"boolean" = constant @true;
 286                         yield %21;
 287                     }
 288                     ()java.type:"void" -> {
 289                         %22 : java.type:"java.lang.String" = var.load %3;
 290                         %23 : java.type:"java.lang.String" = constant @"consonant";
 291                         %24 : java.type:"java.lang.String" = concat %22 %23;
 292                         var.store %3 %24;
 293                         yield;
 294                     };
 295                 %25 : java.type:"java.lang.String" = var.load %3;
 296                 return %25;
 297             };
 298             """)
 299     @Reflect
 300     private static String caseConstantMultiLabels(char c) {
 301         String r = "";
 302         switch (Character.toLowerCase(c)) {
 303             case 'a', 'e', 'i', 'o', 'u':
 304                 r += "vowel";
 305                 break;
 306             default:
 307                 r += "consonant";
 308         }
 309         return r;
 310     }
 311 
 312     @IR("""
 313             func @"caseConstantThrow" (%0 : java.type:"java.lang.Integer")java.type:"java.lang.String" -> {
 314                 %1 : Var<java.type:"java.lang.Integer"> = var %0 @"i";
 315                 %2 : java.type:"java.lang.String" = constant @"";
 316                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
 317                 %4 : java.type:"java.lang.Integer" = var.load %1;
 318                 java.switch.statement %4
 319                     (%5 : java.type:"java.lang.Integer")java.type:"boolean" -> {
 320                         %6 : java.type:"int" = invoke %5 @java.ref:"java.lang.Integer::intValue():int";
 321                         %7 : java.type:"int" = constant @8;
 322                         %8 : java.type:"boolean" = eq %6 %7;
 323                         yield %8;
 324                     }
 325                     ()java.type:"void" -> {
 326                         %9 : java.type:"java.lang.IllegalArgumentException" = new @java.ref:"java.lang.IllegalArgumentException::()";
 327                         throw %9;
 328                     }
 329                     (%10 : java.type:"java.lang.Integer")java.type:"boolean" -> {
 330                         %11 : java.type:"int" = invoke %10 @java.ref:"java.lang.Integer::intValue():int";
 331                         %12 : java.type:"int" = constant @9;
 332                         %13 : java.type:"boolean" = eq %11 %12;
 333                         yield %13;
 334                     }
 335                     ()java.type:"void" -> {
 336                         %14 : java.type:"java.lang.String" = var.load %3;
 337                         %15 : java.type:"java.lang.String" = constant @"Nine";
 338                         %16 : java.type:"java.lang.String" = concat %14 %15;
 339                         var.store %3 %16;
 340                         yield;
 341                     }
 342                     ()java.type:"boolean" -> {
 343                         %17 : java.type:"boolean" = constant @true;
 344                         yield %17;
 345                     }
 346                     ()java.type:"void" -> {
 347                         %18 : java.type:"java.lang.String" = var.load %3;
 348                         %19 : java.type:"java.lang.String" = constant @"An integer";
 349                         %20 : java.type:"java.lang.String" = concat %18 %19;
 350                         var.store %3 %20;
 351                         yield;
 352                     };
 353                 %21 : java.type:"java.lang.String" = var.load %3;
 354                 return %21;
 355             };
 356             """)
 357     @Reflect
 358     private static String caseConstantThrow(Integer i) {
 359         String r = "";
 360         switch (i) {
 361             case 8 -> throw new IllegalArgumentException();
 362             case 9 -> r += "Nine";
 363             default -> r += "An integer";
 364         }
 365         return r;
 366     }
 367 
 368     @IR("""
 369             func @"caseConstantNullLabel" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
 370                 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
 371                 %2 : java.type:"java.lang.String" = constant @"";
 372                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
 373                 %4 : java.type:"java.lang.String" = var.load %1;
 374                 java.switch.statement %4
 375                     (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
 376                         %6 : java.type:"java.lang.Object" = constant @null;
 377                         %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
 378                         yield %7;
 379                     }
 380                     ()java.type:"void" -> {
 381                         %8 : java.type:"java.lang.String" = var.load %3;
 382                         %9 : java.type:"java.lang.String" = constant @"null";
 383                         %10 : java.type:"java.lang.String" = concat %8 %9;
 384                         var.store %3 %10;
 385                         yield;
 386                     }
 387                     ()java.type:"boolean" -> {
 388                         %11 : java.type:"boolean" = constant @true;
 389                         yield %11;
 390                     }
 391                     ()java.type:"void" -> {
 392                         %12 : java.type:"java.lang.String" = var.load %3;
 393                         %13 : java.type:"java.lang.String" = constant @"non null";
 394                         %14 : java.type:"java.lang.String" = concat %12 %13;
 395                         var.store %3 %14;
 396                         yield;
 397                     };
 398                 %15 : java.type:"java.lang.String" = var.load %3;
 399                 return %15;
 400             };
 401             """)
 402     @Reflect
 403     private static String caseConstantNullLabel(String s) {
 404         String r = "";
 405         switch (s) {
 406             case null -> r += "null";
 407             default -> r += "non null";
 408         }
 409         return r;
 410     }
 411 
 412 //    @Reflect
 413 //    @@@ not supported
 414     private static String caseConstantNullAndDefault(String s) {
 415         String r = "";
 416         switch (s) {
 417             case "abc" -> r += "alphabet";
 418             case null, default -> r += "null or default";
 419         }
 420         return r;
 421     }
 422 
 423     @IR("""
 424             func @"caseConstantFallThrough" (%0 : java.type:"char")java.type:"java.lang.String" -> {
 425                 %1 : Var<java.type:"char"> = var %0 @"c";
 426                 %2 : java.type:"java.lang.String" = constant @"";
 427                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
 428                 %4 : java.type:"char" = var.load %1;
 429                 java.switch.statement %4
 430                     (%5 : java.type:"char")java.type:"boolean" -> {
 431                         %6 : java.type:"char" = constant @'A';
 432                         %7 : java.type:"boolean" = eq %5 %6;
 433                         yield %7;
 434                     }
 435                     ()java.type:"void" -> {
 436                         java.switch.fallthrough;
 437                     }
 438                     (%8 : java.type:"char")java.type:"boolean" -> {
 439                         %9 : java.type:"char" = constant @'B';
 440                         %10 : java.type:"boolean" = eq %8 %9;
 441                         yield %10;
 442                     }
 443                     ()java.type:"void" -> {
 444                         %11 : java.type:"java.lang.String" = var.load %3;
 445                         %12 : java.type:"java.lang.String" = constant @"A or B";
 446                         %13 : java.type:"java.lang.String" = concat %11 %12;
 447                         var.store %3 %13;
 448                         java.break;
 449                     }
 450                     ()java.type:"boolean" -> {
 451                         %14 : java.type:"boolean" = constant @true;
 452                         yield %14;
 453                     }
 454                     ()java.type:"void" -> {
 455                         %15 : java.type:"java.lang.String" = var.load %3;
 456                         %16 : java.type:"java.lang.String" = constant @"Neither A nor B";
 457                         %17 : java.type:"java.lang.String" = concat %15 %16;
 458                         var.store %3 %17;
 459                         yield;
 460                     };
 461                 %18 : java.type:"java.lang.String" = var.load %3;
 462                 return %18;
 463             };
 464             """)
 465     @Reflect
 466     private static String caseConstantFallThrough(char c) {
 467         String r = "";
 468         switch (c) {
 469             case 'A':
 470             case 'B':
 471                 r += "A or B";
 472                 break;
 473             default:
 474                 r += "Neither A nor B";
 475         }
 476         return r;
 477     }
 478 
 479     enum Day {
 480         MON, TUE, WED, THU, FRI, SAT, SUN
 481     }
 482     @IR("""
 483             func @"caseConstantEnum" (%0 : java.type:"SwitchStatementTest$Day")java.type:"java.lang.String" -> {
 484                 %1 : Var<java.type:"SwitchStatementTest$Day"> = var %0 @"d";
 485                 %2 : java.type:"java.lang.String" = constant @"";
 486                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
 487                 %4 : java.type:"SwitchStatementTest$Day" = var.load %1;
 488                 java.switch.statement %4
 489                     (%5 : java.type:"SwitchStatementTest$Day")java.type:"boolean" -> {
 490                         %6 : java.type:"boolean" = java.cor
 491                             ()java.type:"boolean" -> {
 492                                 %7 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::MON:SwitchStatementTest$Day";
 493                                 %8 : java.type:"boolean" = eq %5 %7;
 494                                 yield %8;
 495                             }
 496                             ()java.type:"boolean" -> {
 497                                 %9 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::FRI:SwitchStatementTest$Day";
 498                                 %10 : java.type:"boolean" = eq %5 %9;
 499                                 yield %10;
 500                             }
 501                             ()java.type:"boolean" -> {
 502                                 %11 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::SUN:SwitchStatementTest$Day";
 503                                 %12 : java.type:"boolean" = eq %5 %11;
 504                                 yield %12;
 505                             };
 506                         yield %6;
 507                     }
 508                     ()java.type:"void" -> {
 509                         %13 : java.type:"java.lang.String" = var.load %3;
 510                         %14 : java.type:"int" = constant @6;
 511                         %15 : java.type:"java.lang.String" = concat %13 %14;
 512                         var.store %3 %15;
 513                         yield;
 514                     }
 515                     (%16 : java.type:"SwitchStatementTest$Day")java.type:"boolean" -> {
 516                         %17 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::TUE:SwitchStatementTest$Day";
 517                         %18 : java.type:"boolean" = eq %16 %17;
 518                         yield %18;
 519                     }
 520                     ()java.type:"void" -> {
 521                         %19 : java.type:"java.lang.String" = var.load %3;
 522                         %20 : java.type:"int" = constant @7;
 523                         %21 : java.type:"java.lang.String" = concat %19 %20;
 524                         var.store %3 %21;
 525                         yield;
 526                     }
 527                     (%22 : java.type:"SwitchStatementTest$Day")java.type:"boolean" -> {
 528                         %23 : java.type:"boolean" = java.cor
 529                             ()java.type:"boolean" -> {
 530                                 %24 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::THU:SwitchStatementTest$Day";
 531                                 %25 : java.type:"boolean" = eq %22 %24;
 532                                 yield %25;
 533                             }
 534                             ()java.type:"boolean" -> {
 535                                 %26 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::SAT:SwitchStatementTest$Day";
 536                                 %27 : java.type:"boolean" = eq %22 %26;
 537                                 yield %27;
 538                             };
 539                         yield %23;
 540                     }
 541                     ()java.type:"void" -> {
 542                         %28 : java.type:"java.lang.String" = var.load %3;
 543                         %29 : java.type:"int" = constant @8;
 544                         %30 : java.type:"java.lang.String" = concat %28 %29;
 545                         var.store %3 %30;
 546                         yield;
 547                     }
 548                     (%31 : java.type:"SwitchStatementTest$Day")java.type:"boolean" -> {
 549                         %32 : java.type:"SwitchStatementTest$Day" = field.load @java.ref:"SwitchStatementTest$Day::WED:SwitchStatementTest$Day";
 550                         %33 : java.type:"boolean" = eq %31 %32;
 551                         yield %33;
 552                     }
 553                     ()java.type:"void" -> {
 554                         %34 : java.type:"java.lang.String" = var.load %3;
 555                         %35 : java.type:"int" = constant @9;
 556                         %36 : java.type:"java.lang.String" = concat %34 %35;
 557                         var.store %3 %36;
 558                         yield;
 559                     };
 560                 %37 : java.type:"java.lang.String" = var.load %3;
 561                 return %37;
 562             };
 563             """)
 564     @Reflect
 565     private static String caseConstantEnum(Day d) {
 566         String r = "";
 567         switch (d) {
 568             case MON, FRI, SUN -> r += 6;
 569             case TUE -> r += 7;
 570             case THU, SAT -> r += 8;
 571             case WED -> r += 9;
 572         }
 573         return r;
 574     }
 575 
 576     static class Constants {
 577         static final int c1 = 12;
 578     }
 579     @IR("""
 580             func @"caseConstantOtherKindsOfExpr" (%0 : java.type:"int")java.type:"java.lang.String" -> {
 581                 %1 : Var<java.type:"int"> = var %0 @"i";
 582                 %2 : java.type:"java.lang.String" = constant @"";
 583                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
 584                 %4 : java.type:"int" = constant @11;
 585                 %5 : Var<java.type:"int"> = var %4 @"eleven";
 586                 %6 : java.type:"int" = var.load %1;
 587                 java.switch.statement %6
 588                     (%7 : java.type:"int")java.type:"boolean" -> {
 589                         %8 : java.type:"int" = constant @1;
 590                         %9 : java.type:"int" = constant @15;
 591                         %10 : java.type:"int" = and %8 %9;
 592                         %11 : java.type:"boolean" = eq %7 %10;
 593                         yield %11;
 594                     }
 595                     ()java.type:"void" -> {
 596                         %12 : java.type:"java.lang.String" = var.load %3;
 597                         %13 : java.type:"int" = constant @1;
 598                         %14 : java.type:"java.lang.String" = concat %12 %13;
 599                         var.store %3 %14;
 600                         yield;
 601                     }
 602                     (%15 : java.type:"int")java.type:"boolean" -> {
 603                         %16 : java.type:"int" = constant @4;
 604                         %17 : java.type:"int" = constant @1;
 605                         %18 : java.type:"int" = ashr %16 %17;
 606                         %19 : java.type:"boolean" = eq %15 %18;
 607                         yield %19;
 608                     }
 609                     ()java.type:"void" -> {
 610                         %20 : java.type:"java.lang.String" = var.load %3;
 611                         %21 : java.type:"java.lang.String" = constant @"2";
 612                         %22 : java.type:"java.lang.String" = concat %20 %21;
 613                         var.store %3 %22;
 614                         yield;
 615                     }
 616                     (%23 : java.type:"int")java.type:"boolean" -> {
 617                         %24 : java.type:"long" = constant @3;
 618                         %25 : java.type:"int" = conv %24;
 619                         %26 : java.type:"boolean" = eq %23 %25;
 620                         yield %26;
 621                     }
 622                     ()java.type:"void" -> {
 623                         %27 : java.type:"java.lang.String" = var.load %3;
 624                         %28 : java.type:"int" = constant @3;
 625                         %29 : java.type:"java.lang.String" = concat %27 %28;
 626                         var.store %3 %29;
 627                         yield;
 628                     }
 629                     (%30 : java.type:"int")java.type:"boolean" -> {
 630                         %31 : java.type:"int" = constant @2;
 631                         %32 : java.type:"int" = constant @1;
 632                         %33 : java.type:"int" = lshl %31 %32;
 633                         %34 : java.type:"boolean" = eq %30 %33;
 634                         yield %34;
 635                     }
 636                     ()java.type:"void" -> {
 637                         %35 : java.type:"java.lang.String" = var.load %3;
 638                         %36 : java.type:"int" = constant @4;
 639                         %37 : java.type:"java.lang.String" = concat %35 %36;
 640                         var.store %3 %37;
 641                         yield;
 642                     }
 643                     (%38 : java.type:"int")java.type:"boolean" -> {
 644                         %39 : java.type:"int" = constant @10;
 645                         %40 : java.type:"int" = constant @2;
 646                         %41 : java.type:"int" = div %39 %40;
 647                         %42 : java.type:"boolean" = eq %38 %41;
 648                         yield %42;
 649                     }
 650                     ()java.type:"void" -> {
 651                         %43 : java.type:"java.lang.String" = var.load %3;
 652                         %44 : java.type:"int" = constant @5;
 653                         %45 : java.type:"java.lang.String" = concat %43 %44;
 654                         var.store %3 %45;
 655                         yield;
 656                     }
 657                     (%46 : java.type:"int")java.type:"boolean" -> {
 658                         %47 : java.type:"int" = constant @12;
 659                         %48 : java.type:"int" = constant @6;
 660                         %49 : java.type:"int" = sub %47 %48;
 661                         %50 : java.type:"boolean" = eq %46 %49;
 662                         yield %50;
 663                     }
 664                     ()java.type:"void" -> {
 665                         %51 : java.type:"java.lang.String" = var.load %3;
 666                         %52 : java.type:"int" = constant @6;
 667                         %53 : java.type:"java.lang.String" = concat %51 %52;
 668                         var.store %3 %53;
 669                         yield;
 670                     }
 671                     (%54 : java.type:"int")java.type:"boolean" -> {
 672                         %55 : java.type:"int" = constant @3;
 673                         %56 : java.type:"int" = constant @4;
 674                         %57 : java.type:"int" = add %55 %56;
 675                         %58 : java.type:"boolean" = eq %54 %57;
 676                         yield %58;
 677                     }
 678                     ()java.type:"void" -> {
 679                         %59 : java.type:"java.lang.String" = var.load %3;
 680                         %60 : java.type:"int" = constant @7;
 681                         %61 : java.type:"java.lang.String" = concat %59 %60;
 682                         var.store %3 %61;
 683                         yield;
 684                     }
 685                     (%62 : java.type:"int")java.type:"boolean" -> {
 686                         %63 : java.type:"int" = constant @2;
 687                         %64 : java.type:"int" = constant @2;
 688                         %65 : java.type:"int" = mul %63 %64;
 689                         %66 : java.type:"int" = constant @2;
 690                         %67 : java.type:"int" = mul %65 %66;
 691                         %68 : java.type:"boolean" = eq %62 %67;
 692                         yield %68;
 693                     }
 694                     ()java.type:"void" -> {
 695                         %69 : java.type:"java.lang.String" = var.load %3;
 696                         %70 : java.type:"int" = constant @8;
 697                         %71 : java.type:"java.lang.String" = concat %69 %70;
 698                         var.store %3 %71;
 699                         yield;
 700                     }
 701                     (%72 : java.type:"int")java.type:"boolean" -> {
 702                         %73 : java.type:"int" = constant @8;
 703                         %74 : java.type:"int" = constant @1;
 704                         %75 : java.type:"int" = or %73 %74;
 705                         %76 : java.type:"boolean" = eq %72 %75;
 706                         yield %76;
 707                     }
 708                     ()java.type:"void" -> {
 709                         %77 : java.type:"java.lang.String" = var.load %3;
 710                         %78 : java.type:"int" = constant @9;
 711                         %79 : java.type:"java.lang.String" = concat %77 %78;
 712                         var.store %3 %79;
 713                         yield;
 714                     }
 715                     (%80 : java.type:"int")java.type:"boolean" -> {
 716                         %81 : java.type:"int" = constant @10;
 717                         %82 : java.type:"boolean" = eq %80 %81;
 718                         yield %82;
 719                     }
 720                     ()java.type:"void" -> {
 721                         %83 : java.type:"java.lang.String" = var.load %3;
 722                         %84 : java.type:"int" = constant @10;
 723                         %85 : java.type:"java.lang.String" = concat %83 %84;
 724                         var.store %3 %85;
 725                         yield;
 726                     }
 727                     (%86 : java.type:"int")java.type:"boolean" -> {
 728                         %87 : java.type:"int" = var.load %5;
 729                         %88 : java.type:"boolean" = eq %86 %87;
 730                         yield %88;
 731                     }
 732                     ()java.type:"void" -> {
 733                         %89 : java.type:"java.lang.String" = var.load %3;
 734                         %90 : java.type:"int" = constant @11;
 735                         %91 : java.type:"java.lang.String" = concat %89 %90;
 736                         var.store %3 %91;
 737                         yield;
 738                     }
 739                     (%92 : java.type:"int")java.type:"boolean" -> {
 740                         %93 : java.type:"int" = field.load @java.ref:"SwitchStatementTest$Constants::c1:int";
 741                         %94 : java.type:"boolean" = eq %92 %93;
 742                         yield %94;
 743                     }
 744                     ()java.type:"void" -> {
 745                         %95 : java.type:"java.lang.String" = var.load %3;
 746                         %96 : java.type:"int" = field.load @java.ref:"SwitchStatementTest$Constants::c1:int";
 747                         %97 : java.type:"java.lang.String" = concat %95 %96;
 748                         var.store %3 %97;
 749                         yield;
 750                     }
 751                     (%98 : java.type:"int")java.type:"boolean" -> {
 752                         %99 : java.type:"int" = java.cexpression
 753                             ()java.type:"boolean" -> {
 754                                 %100 : java.type:"int" = constant @1;
 755                                 %101 : java.type:"int" = constant @0;
 756                                 %102 : java.type:"boolean" = gt %100 %101;
 757                                 yield %102;
 758                             }
 759                             ()java.type:"int" -> {
 760                                 %103 : java.type:"int" = constant @13;
 761                                 yield %103;
 762                             }
 763                             ()java.type:"int" -> {
 764                                 %104 : java.type:"int" = constant @133;
 765                                 yield %104;
 766                             };
 767                         %105 : java.type:"boolean" = eq %98 %99;
 768                         yield %105;
 769                     }
 770                     ()java.type:"void" -> {
 771                         %106 : java.type:"java.lang.String" = var.load %3;
 772                         %107 : java.type:"int" = constant @13;
 773                         %108 : java.type:"java.lang.String" = concat %106 %107;
 774                         var.store %3 %108;
 775                         yield;
 776                     }
 777                     ()java.type:"boolean" -> {
 778                         %109 : java.type:"boolean" = constant @true;
 779                         yield %109;
 780                     }
 781                     ()java.type:"void" -> {
 782                         %110 : java.type:"java.lang.String" = var.load %3;
 783                         %111 : java.type:"java.lang.String" = constant @"an int";
 784                         %112 : java.type:"java.lang.String" = concat %110 %111;
 785                         var.store %3 %112;
 786                         yield;
 787                     };
 788                 %113 : java.type:"java.lang.String" = var.load %3;
 789                 return %113;
 790             };
 791             """)
 792     @Reflect
 793     private static String caseConstantOtherKindsOfExpr(int i) {
 794         String r = "";
 795         final int eleven = 11;
 796         switch (i) {
 797             case 1 & 0xF -> r += 1;
 798             case 4>>1 -> r += "2";
 799             case (int) 3L -> r += 3;
 800             case 2<<1 -> r += 4;
 801             case 10 / 2 -> r += 5;
 802             case 12 - 6 -> r += 6;
 803             case 3 + 4 -> r += 7;
 804             case 2 * 2 * 2 -> r += 8;
 805             case 8 | 1 -> r += 9;
 806             case (10) -> r += 10;
 807             case eleven -> r += 11;
 808             case Constants.c1 -> r += Constants.c1;
 809             case 1 > 0 ? 13 : 133 -> r += 13;
 810             default -> r += "an int";
 811         }
 812         return r;
 813     }
 814 
 815     @IR("""
 816             func @"caseConstantConv" (%0 : java.type:"short")java.type:"java.lang.String" -> {
 817                 %1 : Var<java.type:"short"> = var %0 @"a";
 818                 %2 : java.type:"int" = constant @1;
 819                 %3 : java.type:"short" = conv %2;
 820                 %4 : Var<java.type:"short"> = var %3 @"s";
 821                 %5 : java.type:"int" = constant @2;
 822                 %6 : java.type:"byte" = conv %5;
 823                 %7 : Var<java.type:"byte"> = var %6 @"b";
 824                 %8 : java.type:"java.lang.String" = constant @"";
 825                 %9 : Var<java.type:"java.lang.String"> = var %8 @"r";
 826                 %10 : java.type:"short" = var.load %1;
 827                 java.switch.statement %10
 828                     (%11 : java.type:"short")java.type:"boolean" -> {
 829                         %12 : java.type:"short" = var.load %4;
 830                         %13 : java.type:"boolean" = eq %11 %12;
 831                         yield %13;
 832                     }
 833                     ()java.type:"void" -> {
 834                         %14 : java.type:"java.lang.String" = var.load %9;
 835                         %15 : java.type:"java.lang.String" = constant @"one";
 836                         %16 : java.type:"java.lang.String" = concat %14 %15;
 837                         var.store %9 %16;
 838                         yield;
 839                     }
 840                     (%17 : java.type:"short")java.type:"boolean" -> {
 841                         %18 : java.type:"byte" = var.load %7;
 842                         %19 : java.type:"short" = conv %18;
 843                         %20 : java.type:"boolean" = eq %17 %19;
 844                         yield %20;
 845                     }
 846                     ()java.type:"void" -> {
 847                         %21 : java.type:"java.lang.String" = var.load %9;
 848                         %22 : java.type:"java.lang.String" = constant @"two";
 849                         %23 : java.type:"java.lang.String" = concat %21 %22;
 850                         var.store %9 %23;
 851                         yield;
 852                     }
 853                     (%24 : java.type:"short")java.type:"boolean" -> {
 854                         %25 : java.type:"int" = constant @3;
 855                         %26 : java.type:"short" = conv %25;
 856                         %27 : java.type:"boolean" = eq %24 %26;
 857                         yield %27;
 858                     }
 859                     ()java.type:"void" -> {
 860                         %28 : java.type:"java.lang.String" = var.load %9;
 861                         %29 : java.type:"java.lang.String" = constant @"three";
 862                         %30 : java.type:"java.lang.String" = concat %28 %29;
 863                         var.store %9 %30;
 864                         yield;
 865                     }
 866                     ()java.type:"boolean" -> {
 867                         %31 : java.type:"boolean" = constant @true;
 868                         yield %31;
 869                     }
 870                     ()java.type:"void" -> {
 871                         %32 : java.type:"java.lang.String" = var.load %9;
 872                         %33 : java.type:"java.lang.String" = constant @"else";
 873                         %34 : java.type:"java.lang.String" = concat %32 %33;
 874                         var.store %9 %34;
 875                         yield;
 876                     };
 877                 %35 : java.type:"java.lang.String" = var.load %9;
 878                 return %35;
 879             };
 880             """)
 881     @Reflect
 882     static String caseConstantConv(short a) {
 883         final short s = 1;
 884         final byte b = 2;
 885         String r = "";
 886         switch (a) {
 887             case s -> r += "one"; // identity, short -> short
 888             case b -> r += "two"; // widening primitive conversion, byte -> short
 889             case 3 -> r += "three"; // narrowing primitive conversion, int -> short
 890             default -> r += "else";
 891         }
 892         return r;
 893     }
 894 
 895     @IR("""
 896             func @"caseConstantConv2" (%0 : java.type:"java.lang.Byte")java.type:"java.lang.String" -> {
 897                 %1 : Var<java.type:"java.lang.Byte"> = var %0 @"a";
 898                 %2 : java.type:"int" = constant @2;
 899                 %3 : java.type:"byte" = conv %2;
 900                 %4 : Var<java.type:"byte"> = var %3 @"b";
 901                 %5 : java.type:"java.lang.String" = constant @"";
 902                 %6 : Var<java.type:"java.lang.String"> = var %5 @"r";
 903                 %7 : java.type:"java.lang.Byte" = var.load %1;
 904                 java.switch.statement %7
 905                     (%8 : java.type:"java.lang.Byte")java.type:"boolean" -> {
 906                         %9 : java.type:"byte" = invoke %8 @java.ref:"java.lang.Byte::byteValue():byte";
 907                         %10 : java.type:"int" = constant @1;
 908                         %11 : java.type:"byte" = conv %10;
 909                         %12 : java.type:"boolean" = eq %9 %11;
 910                         yield %12;
 911                     }
 912                     ()java.type:"void" -> {
 913                         %13 : java.type:"java.lang.String" = var.load %6;
 914                         %14 : java.type:"java.lang.String" = constant @"one";
 915                         %15 : java.type:"java.lang.String" = concat %13 %14;
 916                         var.store %6 %15;
 917                         yield;
 918                     }
 919                     (%16 : java.type:"java.lang.Byte")java.type:"boolean" -> {
 920                         %17 : java.type:"byte" = invoke %16 @java.ref:"java.lang.Byte::byteValue():byte";
 921                         %18 : java.type:"byte" = var.load %4;
 922                         %19 : java.type:"boolean" = eq %17 %18;
 923                         yield %19;
 924                     }
 925                     ()java.type:"void" -> {
 926                         %20 : java.type:"java.lang.String" = var.load %6;
 927                         %21 : java.type:"java.lang.String" = constant @"two";
 928                         %22 : java.type:"java.lang.String" = concat %20 %21;
 929                         var.store %6 %22;
 930                         yield;
 931                     }
 932                     ()java.type:"boolean" -> {
 933                         %23 : java.type:"boolean" = constant @true;
 934                         yield %23;
 935                     }
 936                     ()java.type:"void" -> {
 937                         %24 : java.type:"java.lang.String" = var.load %6;
 938                         %25 : java.type:"java.lang.String" = constant @"default";
 939                         %26 : java.type:"java.lang.String" = concat %24 %25;
 940                         var.store %6 %26;
 941                         yield;
 942                     };
 943                 %27 : java.type:"java.lang.String" = var.load %6;
 944                 return %27;
 945             };
 946             """)
 947     @Reflect
 948     static String caseConstantConv2(Byte a) {
 949         final byte b = 2;
 950         String r = "";
 951         switch (a) {
 952             case 1 -> r+= "one";
 953             case b -> r+= "two";
 954             default -> r+= "default";
 955         }
 956         return r;
 957     }
 958 
 959     @IR("""
 960             func @"nonEnhancedSwStatNoDefault" (%0 : java.type:"int")java.type:"java.lang.String" -> {
 961                 %1 : Var<java.type:"int"> = var %0 @"a";
 962                 %2 : java.type:"java.lang.String" = constant @"";
 963                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
 964                 %4 : java.type:"int" = var.load %1;
 965                 java.switch.statement %4
 966                     (%5 : java.type:"int")java.type:"boolean" -> {
 967                         %6 : java.type:"int" = constant @1;
 968                         %7 : java.type:"boolean" = eq %5 %6;
 969                         yield %7;
 970                     }
 971                     ()java.type:"void" -> {
 972                         %8 : java.type:"java.lang.String" = var.load %3;
 973                         %9 : java.type:"java.lang.String" = constant @"1";
 974                         %10 : java.type:"java.lang.String" = concat %8 %9;
 975                         var.store %3 %10;
 976                         yield;
 977                     }
 978                     (%11 : java.type:"int")java.type:"boolean" -> {
 979                         %12 : java.type:"int" = constant @2;
 980                         %13 : java.type:"boolean" = eq %11 %12;
 981                         yield %13;
 982                     }
 983                     ()java.type:"void" -> {
 984                         %14 : java.type:"java.lang.String" = var.load %3;
 985                         %15 : java.type:"int" = constant @2;
 986                         %16 : java.type:"java.lang.String" = concat %14 %15;
 987                         var.store %3 %16;
 988                         yield;
 989                     };
 990                 %17 : java.type:"java.lang.String" = var.load %3;
 991                 return %17;
 992             };
 993             """)
 994     @Reflect
 995     static String nonEnhancedSwStatNoDefault(int a) {
 996         String r = "";
 997         switch (a) {
 998             case 1 -> r += "1";
 999             case 2 -> r += 2;
1000         }
1001         return r;
1002     }
1003 
1004     enum E {A, B}
1005     @IR("""
1006             func @"enhancedSwStatNoDefault1" (%0 : java.type:"SwitchStatementTest$E")java.type:"java.lang.String" -> {
1007                 %1 : Var<java.type:"SwitchStatementTest$E"> = var %0 @"e";
1008                 %2 : java.type:"java.lang.String" = constant @"";
1009                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1010                 %4 : java.type:"SwitchStatementTest$E" = var.load %1;
1011                 java.switch.statement %4
1012                     (%5 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1013                         %6 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::A:SwitchStatementTest$E";
1014                         %7 : java.type:"boolean" = eq %5 %6;
1015                         yield %7;
1016                     }
1017                     ()java.type:"void" -> {
1018                         %8 : java.type:"java.lang.String" = var.load %3;
1019                         %9 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::A:SwitchStatementTest$E";
1020                         %10 : java.type:"java.lang.String" = cast %9 @java.type:"java.lang.String";
1021                         %11 : java.type:"java.lang.String" = concat %8 %10;
1022                         var.store %3 %11;
1023                         yield;
1024                     }
1025                     (%12 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1026                         %13 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::B:SwitchStatementTest$E";
1027                         %14 : java.type:"boolean" = eq %12 %13;
1028                         yield %14;
1029                     }
1030                     ()java.type:"void" -> {
1031                         %15 : java.type:"java.lang.String" = var.load %3;
1032                         %16 : java.type:"SwitchStatementTest$E" = field.load @java.ref:"SwitchStatementTest$E::B:SwitchStatementTest$E";
1033                         %17 : java.type:"java.lang.String" = cast %16 @java.type:"java.lang.String";
1034                         %18 : java.type:"java.lang.String" = concat %15 %17;
1035                         var.store %3 %18;
1036                         yield;
1037                     }
1038                     (%19 : java.type:"SwitchStatementTest$E")java.type:"boolean" -> {
1039                         %20 : java.type:"java.lang.Object" = constant @null;
1040                         %21 : java.type:"boolean" = eq %19 %20;
1041                         yield %21;
1042                     }
1043                     ()java.type:"void" -> {
1044                         %22 : java.type:"java.lang.String" = var.load %3;
1045                         %23 : java.type:"java.lang.String" = constant @"null";
1046                         %24 : java.type:"java.lang.String" = concat %22 %23;
1047                         var.store %3 %24;
1048                         yield;
1049                     }
1050                     ()java.type:"boolean" -> {
1051                         %25 : java.type:"boolean" = constant @true;
1052                         yield %25;
1053                     }
1054                     ()java.type:"void" -> {
1055                         %26 : java.type:"java.lang.MatchException" = new @java.ref:"java.lang.MatchException::()";
1056                         throw %26;
1057                     };
1058                 %27 : java.type:"java.lang.String" = var.load %3;
1059                 return %27;
1060             };
1061             """)
1062     @Reflect
1063     static String enhancedSwStatNoDefault1(E e) {
1064         String r = "";
1065         switch (e) {
1066             case A -> r += E.A;
1067             case B -> r += E.B;
1068             case null -> r += "null";
1069         }
1070         return r;
1071     }
1072 
1073     sealed interface I permits K, J {}
1074     record K() implements I {}
1075     static final class J implements I {}
1076     @IR("""
1077             func @"enhancedSwStatNoDefault2" (%0 : java.type:"SwitchStatementTest$I")java.type:"java.lang.String" -> {
1078                 %1 : Var<java.type:"SwitchStatementTest$I"> = var %0 @"i";
1079                 %2 : java.type:"java.lang.String" = constant @"";
1080                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1081                 %4 : java.type:"SwitchStatementTest$I" = var.load %1;
1082                 %5 : java.type:"SwitchStatementTest$K" = constant @null;
1083                 %6 : Var<java.type:"SwitchStatementTest$K"> = var %5 @"k";
1084                 %7 : java.type:"SwitchStatementTest$J" = constant @null;
1085                 %8 : Var<java.type:"SwitchStatementTest$J"> = var %7 @"j";
1086                 java.switch.statement %4
1087                     (%9 : java.type:"SwitchStatementTest$I")java.type:"boolean" -> {
1088                         %10 : java.type:"boolean" = pattern.match %9
1089                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$K>" -> {
1090                                 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$K>" = pattern.type @"k";
1091                                 yield %11;
1092                             }
1093                             (%12 : java.type:"SwitchStatementTest$K")java.type:"void" -> {
1094                                 var.store %6 %12;
1095                                 yield;
1096                             };
1097                         yield %10;
1098                     }
1099                     ()java.type:"void" -> {
1100                         %13 : java.type:"java.lang.String" = var.load %3;
1101                         %14 : java.type:"java.lang.String" = constant @"K";
1102                         %15 : java.type:"java.lang.String" = concat %13 %14;
1103                         var.store %3 %15;
1104                         yield;
1105                     }
1106                     (%16 : java.type:"SwitchStatementTest$I")java.type:"boolean" -> {
1107                         %17 : java.type:"boolean" = pattern.match %16
1108                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$J>" -> {
1109                                 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<SwitchStatementTest$J>" = pattern.type @"j";
1110                                 yield %18;
1111                             }
1112                             (%19 : java.type:"SwitchStatementTest$J")java.type:"void" -> {
1113                                 var.store %8 %19;
1114                                 yield;
1115                             };
1116                         yield %17;
1117                     }
1118                     ()java.type:"void" -> {
1119                         %20 : java.type:"java.lang.String" = var.load %3;
1120                         %21 : java.type:"java.lang.String" = constant @"J";
1121                         %22 : java.type:"java.lang.String" = concat %20 %21;
1122                         var.store %3 %22;
1123                         yield;
1124                     }
1125                     ()java.type:"boolean" -> {
1126                         %23 : java.type:"boolean" = constant @true;
1127                         yield %23;
1128                     }
1129                     ()java.type:"void" -> {
1130                         %24 : java.type:"java.lang.MatchException" = new @java.ref:"java.lang.MatchException::()";
1131                         throw %24;
1132                     };
1133                 %25 : java.type:"java.lang.String" = var.load %3;
1134                 return %25;
1135             };
1136             """)
1137     @Reflect
1138     static String enhancedSwStatNoDefault2(I i) {
1139         String r = "";
1140         switch (i) {
1141             case K k -> r += "K";
1142             case J j -> r += "J";
1143         }
1144         return r;
1145     }
1146 
1147     @IR("""
1148             func @"enhancedSwStatUnconditionalPattern" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
1149                 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
1150                 %2 : java.type:"java.lang.String" = constant @"";
1151                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1152                 %4 : java.type:"java.lang.String" = var.load %1;
1153                 %5 : java.type:"java.lang.Object" = constant @null;
1154                 %6 : Var<java.type:"java.lang.Object"> = var %5 @"o";
1155                 java.switch.statement %4
1156                     (%7 : java.type:"java.lang.String")java.type:"boolean" -> {
1157                         %8 : java.type:"java.lang.String" = constant @"A";
1158                         %9 : java.type:"boolean" = invoke %7 %8 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1159                         yield %9;
1160                     }
1161                     ()java.type:"void" -> {
1162                         %10 : java.type:"java.lang.String" = var.load %3;
1163                         %11 : java.type:"java.lang.String" = constant @"A";
1164                         %12 : java.type:"java.lang.String" = concat %10 %11;
1165                         var.store %3 %12;
1166                         yield;
1167                     }
1168                     (%13 : java.type:"java.lang.String")java.type:"boolean" -> {
1169                         %14 : java.type:"boolean" = pattern.match %13
1170                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Object>" -> {
1171                                 %15 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Object>" = pattern.type @"o";
1172                                 yield %15;
1173                             }
1174                             (%16 : java.type:"java.lang.Object")java.type:"void" -> {
1175                                 var.store %6 %16;
1176                                 yield;
1177                             };
1178                         yield %14;
1179                     }
1180                     ()java.type:"void" -> {
1181                         %17 : java.type:"java.lang.String" = var.load %3;
1182                         %18 : java.type:"java.lang.String" = constant @"obj";
1183                         %19 : java.type:"java.lang.String" = concat %17 %18;
1184                         var.store %3 %19;
1185                         yield;
1186                     };
1187                 %20 : java.type:"java.lang.String" = var.load %3;
1188                 return %20;
1189             };
1190             """)
1191     @Reflect
1192     static String enhancedSwStatUnconditionalPattern(String s) {
1193         String r = "";
1194         switch (s) {
1195             case "A" -> r += "A";
1196             case Object o -> r += "obj";
1197         }
1198         return r;
1199     }
1200 
1201     @IR("""
1202             func @"casePatternRuleExpression" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1203                 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1204                 %2 : java.type:"java.lang.String" = constant @"";
1205                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1206                 %4 : java.type:"java.lang.Object" = var.load %1;
1207                 %5 : java.type:"java.lang.Integer" = constant @null;
1208                 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1209                 %7 : java.type:"java.lang.String" = constant @null;
1210                 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1211                 java.switch.statement %4
1212                     (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1213                         %10 : java.type:"boolean" = pattern.match %9
1214                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1215                                 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1216                                 yield %11;
1217                             }
1218                             (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1219                                 var.store %6 %12;
1220                                 yield;
1221                             };
1222                         yield %10;
1223                     }
1224                     ()java.type:"void" -> {
1225                         %13 : java.type:"java.lang.String" = var.load %3;
1226                         %14 : java.type:"java.lang.String" = constant @"integer";
1227                         %15 : java.type:"java.lang.String" = concat %13 %14;
1228                         var.store %3 %15;
1229                         yield;
1230                     }
1231                     (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1232                         %17 : java.type:"boolean" = pattern.match %16
1233                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1234                                 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1235                                 yield %18;
1236                             }
1237                             (%19 : java.type:"java.lang.String")java.type:"void" -> {
1238                                 var.store %8 %19;
1239                                 yield;
1240                             };
1241                         yield %17;
1242                     }
1243                     ()java.type:"void" -> {
1244                         %20 : java.type:"java.lang.String" = var.load %3;
1245                         %21 : java.type:"java.lang.String" = constant @"string";
1246                         %22 : java.type:"java.lang.String" = concat %20 %21;
1247                         var.store %3 %22;
1248                         yield;
1249                     }
1250                     ()java.type:"boolean" -> {
1251                         %23 : java.type:"boolean" = constant @true;
1252                         yield %23;
1253                     }
1254                     ()java.type:"void" -> {
1255                         %24 : java.type:"java.lang.String" = var.load %3;
1256                         %25 : java.type:"java.lang.String" = constant @"else";
1257                         %26 : java.type:"java.lang.String" = concat %24 %25;
1258                         var.store %3 %26;
1259                         yield;
1260                     };
1261                 %27 : java.type:"java.lang.String" = var.load %3;
1262                 return %27;
1263             };
1264             """)
1265     @Reflect
1266     private static String casePatternRuleExpression(Object o) {
1267         String r = "";
1268         switch (o) {
1269             case Integer i -> r += "integer";
1270             case String s -> r+= "string";
1271             default -> r+= "else";
1272         }
1273         return r;
1274     }
1275 
1276     @IR("""
1277             func @"casePatternRuleBlock" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1278                 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1279                 %2 : java.type:"java.lang.String" = constant @"";
1280                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1281                 %4 : java.type:"java.lang.Object" = var.load %1;
1282                 %5 : java.type:"java.lang.Integer" = constant @null;
1283                 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1284                 %7 : java.type:"java.lang.String" = constant @null;
1285                 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1286                 java.switch.statement %4
1287                     (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1288                         %10 : java.type:"boolean" = pattern.match %9
1289                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1290                                 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1291                                 yield %11;
1292                             }
1293                             (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1294                                 var.store %6 %12;
1295                                 yield;
1296                             };
1297                         yield %10;
1298                     }
1299                     ()java.type:"void" -> {
1300                         %13 : java.type:"java.lang.String" = var.load %3;
1301                         %14 : java.type:"java.lang.String" = constant @"integer";
1302                         %15 : java.type:"java.lang.String" = concat %13 %14;
1303                         var.store %3 %15;
1304                         yield;
1305                     }
1306                     (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1307                         %17 : java.type:"boolean" = pattern.match %16
1308                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1309                                 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1310                                 yield %18;
1311                             }
1312                             (%19 : java.type:"java.lang.String")java.type:"void" -> {
1313                                 var.store %8 %19;
1314                                 yield;
1315                             };
1316                         yield %17;
1317                     }
1318                     ()java.type:"void" -> {
1319                         %20 : java.type:"java.lang.String" = var.load %3;
1320                         %21 : java.type:"java.lang.String" = constant @"string";
1321                         %22 : java.type:"java.lang.String" = concat %20 %21;
1322                         var.store %3 %22;
1323                         yield;
1324                     }
1325                     ()java.type:"boolean" -> {
1326                         %23 : java.type:"boolean" = constant @true;
1327                         yield %23;
1328                     }
1329                     ()java.type:"void" -> {
1330                         %24 : java.type:"java.lang.String" = var.load %3;
1331                         %25 : java.type:"java.lang.String" = constant @"else";
1332                         %26 : java.type:"java.lang.String" = concat %24 %25;
1333                         var.store %3 %26;
1334                         yield;
1335                     };
1336                 %27 : java.type:"java.lang.String" = var.load %3;
1337                 return %27;
1338             };
1339             """)
1340     @Reflect
1341     private static String casePatternRuleBlock(Object o) {
1342         String r = "";
1343         switch (o) {
1344             case Integer i -> {
1345                 r += "integer";
1346             }
1347             case String s -> {
1348                 r += "string";
1349             }
1350             default -> {
1351                 r += "else";
1352             }
1353         }
1354         return r;
1355     }
1356 
1357     @IR("""
1358             func @"casePatternStatement" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1359                 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1360                 %2 : java.type:"java.lang.String" = constant @"";
1361                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1362                 %4 : java.type:"java.lang.Object" = var.load %1;
1363                 %5 : java.type:"java.lang.Integer" = constant @null;
1364                 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1365                 %7 : java.type:"java.lang.String" = constant @null;
1366                 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1367                 java.switch.statement %4
1368                     (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1369                         %10 : java.type:"boolean" = pattern.match %9
1370                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1371                                 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1372                                 yield %11;
1373                             }
1374                             (%12 : java.type:"java.lang.Integer")java.type:"void" -> {
1375                                 var.store %6 %12;
1376                                 yield;
1377                             };
1378                         yield %10;
1379                     }
1380                     ()java.type:"void" -> {
1381                         %13 : java.type:"java.lang.String" = var.load %3;
1382                         %14 : java.type:"java.lang.String" = constant @"integer";
1383                         %15 : java.type:"java.lang.String" = concat %13 %14;
1384                         var.store %3 %15;
1385                         java.break;
1386                     }
1387                     (%16 : java.type:"java.lang.Object")java.type:"boolean" -> {
1388                         %17 : java.type:"boolean" = pattern.match %16
1389                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1390                                 %18 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1391                                 yield %18;
1392                             }
1393                             (%19 : java.type:"java.lang.String")java.type:"void" -> {
1394                                 var.store %8 %19;
1395                                 yield;
1396                             };
1397                         yield %17;
1398                     }
1399                     ()java.type:"void" -> {
1400                         %20 : java.type:"java.lang.String" = var.load %3;
1401                         %21 : java.type:"java.lang.String" = constant @"string";
1402                         %22 : java.type:"java.lang.String" = concat %20 %21;
1403                         var.store %3 %22;
1404                         java.break;
1405                     }
1406                     ()java.type:"boolean" -> {
1407                         %23 : java.type:"boolean" = constant @true;
1408                         yield %23;
1409                     }
1410                     ()java.type:"void" -> {
1411                         %24 : java.type:"java.lang.String" = var.load %3;
1412                         %25 : java.type:"java.lang.String" = constant @"else";
1413                         %26 : java.type:"java.lang.String" = concat %24 %25;
1414                         var.store %3 %26;
1415                         yield;
1416                     };
1417                 %27 : java.type:"java.lang.String" = var.load %3;
1418                 return %27;
1419             };
1420             """)
1421     @Reflect
1422     private static String casePatternStatement(Object o) {
1423         String r = "";
1424         switch (o) {
1425             case Integer i:
1426                 r += "integer";
1427                 break;
1428             case String s:
1429                 r += "string";
1430                 break;
1431             default:
1432                 r += "else";
1433         }
1434         return r;
1435     }
1436 
1437     @IR("""
1438             func @"casePatternThrow" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1439                 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1440                 %2 : java.type:"java.lang.String" = constant @"";
1441                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1442                 %4 : java.type:"java.lang.Object" = var.load %1;
1443                 %5 : java.type:"java.lang.Number" = constant @null;
1444                 %6 : Var<java.type:"java.lang.Number"> = var %5 @"n";
1445                 %7 : java.type:"java.lang.String" = constant @null;
1446                 %8 : Var<java.type:"java.lang.String"> = var %7 @"s";
1447                 java.switch.statement %4
1448                     (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1449                         %10 : java.type:"boolean" = pattern.match %9
1450                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" -> {
1451                                 %11 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1452                                 yield %11;
1453                             }
1454                             (%12 : java.type:"java.lang.Number")java.type:"void" -> {
1455                                 var.store %6 %12;
1456                                 yield;
1457                             };
1458                         yield %10;
1459                     }
1460                     ()java.type:"void" -> {
1461                         %13 : java.type:"java.lang.IllegalArgumentException" = new @java.ref:"java.lang.IllegalArgumentException::()";
1462                         throw %13;
1463                     }
1464                     (%14 : java.type:"java.lang.Object")java.type:"boolean" -> {
1465                         %15 : java.type:"boolean" = pattern.match %14
1466                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1467                                 %16 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1468                                 yield %16;
1469                             }
1470                             (%17 : java.type:"java.lang.String")java.type:"void" -> {
1471                                 var.store %8 %17;
1472                                 yield;
1473                             };
1474                         yield %15;
1475                     }
1476                     ()java.type:"void" -> {
1477                         %18 : java.type:"java.lang.String" = var.load %3;
1478                         %19 : java.type:"java.lang.String" = constant @"a string";
1479                         %20 : java.type:"java.lang.String" = concat %18 %19;
1480                         var.store %3 %20;
1481                         yield;
1482                     }
1483                     ()java.type:"boolean" -> {
1484                         %21 : java.type:"boolean" = constant @true;
1485                         yield %21;
1486                     }
1487                     ()java.type:"void" -> {
1488                         %22 : java.type:"java.lang.String" = var.load %3;
1489                         %23 : java.type:"java.lang.Object" = var.load %1;
1490                         %24 : java.type:"java.lang.Class<?>" = invoke %23 @java.ref:"java.lang.Object::getClass():java.lang.Class";
1491                         %25 : java.type:"java.lang.String" = invoke %24 @java.ref:"java.lang.Class::getName():java.lang.String";
1492                         %26 : java.type:"java.lang.String" = concat %22 %25;
1493                         var.store %3 %26;
1494                         yield;
1495                     };
1496                 %27 : java.type:"java.lang.String" = var.load %3;
1497                 return %27;
1498             };
1499             """)
1500     @Reflect
1501     private static String casePatternThrow(Object o) {
1502         String r = "";
1503         switch (o) {
1504             case Number n -> throw new IllegalArgumentException();
1505             case String s -> r += "a string";
1506             default -> r += o.getClass().getName();
1507         }
1508         return r;
1509     }
1510 
1511     // @@@ code model for such as code is not supported
1512 //    @Reflect
1513     private static String casePatternMultiLabel(Object o) {
1514         String r = "";
1515         switch (o) {
1516             case Integer _, Long _, Character _, Byte _, Short _-> r += "integral type";
1517             default -> r += "non integral type";
1518         }
1519         return r;
1520     }
1521 
1522     @IR("""
1523             func @"casePatternWithCaseConstant" (%0 : java.type:"java.lang.Integer")java.type:"java.lang.String" -> {
1524                 %1 : Var<java.type:"java.lang.Integer"> = var %0 @"a";
1525                 %2 : java.type:"java.lang.String" = constant @"";
1526                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1527                 %4 : java.type:"java.lang.Integer" = var.load %1;
1528                 %5 : java.type:"java.lang.Integer" = constant @null;
1529                 %6 : Var<java.type:"java.lang.Integer"> = var %5 @"i";
1530                 %7 : java.type:"java.lang.Integer" = constant @null;
1531                 %8 : Var<java.type:"java.lang.Integer"> = var %7 @"i";
1532                 java.switch.statement %4
1533                     (%9 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1534                         %10 : java.type:"int" = invoke %9 @java.ref:"java.lang.Integer::intValue():int";
1535                         %11 : java.type:"int" = constant @42;
1536                         %12 : java.type:"boolean" = eq %10 %11;
1537                         yield %12;
1538                     }
1539                     ()java.type:"void" -> {
1540                         %13 : java.type:"java.lang.String" = var.load %3;
1541                         %14 : java.type:"java.lang.String" = constant @"forty two";
1542                         %15 : java.type:"java.lang.String" = concat %13 %14;
1543                         var.store %3 %15;
1544                         yield;
1545                     }
1546                     (%16 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1547                         %17 : java.type:"boolean" = java.cand
1548                             ()java.type:"boolean" -> {
1549                                 %18 : java.type:"boolean" = pattern.match %16
1550                                     ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1551                                         %19 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1552                                         yield %19;
1553                                     }
1554                                     (%20 : java.type:"java.lang.Integer")java.type:"void" -> {
1555                                         var.store %6 %20;
1556                                         yield;
1557                                     };
1558                                 yield %18;
1559                             }
1560                             ()java.type:"boolean" -> {
1561                                 %21 : java.type:"java.lang.Integer" = var.load %6;
1562                                 %22 : java.type:"int" = invoke %21 @java.ref:"java.lang.Integer::intValue():int";
1563                                 %23 : java.type:"int" = constant @0;
1564                                 %24 : java.type:"boolean" = gt %22 %23;
1565                                 yield %24;
1566                             };
1567                         yield %17;
1568                     }
1569                     ()java.type:"void" -> {
1570                         %25 : java.type:"java.lang.String" = var.load %3;
1571                         %26 : java.type:"java.lang.String" = constant @"positive int";
1572                         %27 : java.type:"java.lang.String" = concat %25 %26;
1573                         var.store %3 %27;
1574                         yield;
1575                     }
1576                     (%28 : java.type:"java.lang.Integer")java.type:"boolean" -> {
1577                         %29 : java.type:"boolean" = java.cand
1578                             ()java.type:"boolean" -> {
1579                                 %30 : java.type:"boolean" = pattern.match %28
1580                                     ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" -> {
1581                                         %31 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Integer>" = pattern.type @"i";
1582                                         yield %31;
1583                                     }
1584                                     (%32 : java.type:"java.lang.Integer")java.type:"void" -> {
1585                                         var.store %8 %32;
1586                                         yield;
1587                                     };
1588                                 yield %30;
1589                             }
1590                             ()java.type:"boolean" -> {
1591                                 %33 : java.type:"java.lang.Integer" = var.load %8;
1592                                 %34 : java.type:"int" = invoke %33 @java.ref:"java.lang.Integer::intValue():int";
1593                                 %35 : java.type:"int" = constant @0;
1594                                 %36 : java.type:"boolean" = lt %34 %35;
1595                                 yield %36;
1596                             };
1597                         yield %29;
1598                     }
1599                     ()java.type:"void" -> {
1600                         %37 : java.type:"java.lang.String" = var.load %3;
1601                         %38 : java.type:"java.lang.String" = constant @"negative int";
1602                         %39 : java.type:"java.lang.String" = concat %37 %38;
1603                         var.store %3 %39;
1604                         yield;
1605                     }
1606                     ()java.type:"boolean" -> {
1607                         %40 : java.type:"boolean" = constant @true;
1608                         yield %40;
1609                     }
1610                     ()java.type:"void" -> {
1611                         %41 : java.type:"java.lang.String" = var.load %3;
1612                         %42 : java.type:"java.lang.String" = constant @"zero";
1613                         %43 : java.type:"java.lang.String" = concat %41 %42;
1614                         var.store %3 %43;
1615                         yield;
1616                     };
1617                 %44 : java.type:"java.lang.String" = var.load %3;
1618                 return %44;
1619             };
1620             """)
1621     @Reflect
1622     static String casePatternWithCaseConstant(Integer a) {
1623         String r = "";
1624         switch (a) {
1625             case 42 -> r += "forty two";
1626             case Integer i when i > 0 -> r += "positive int";
1627             case Integer i when i < 0 -> r += "negative int";
1628             default -> r += "zero";
1629         }
1630         return r;
1631     }
1632 
1633     @IR("""
1634             func @"caseTypePattern" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1635                 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1636                 %2 : java.type:"java.lang.String" = constant @"";
1637                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1638                 %4 : java.type:"java.lang.Object" = var.load %1;
1639                 %5 : java.type:"java.lang.String" = constant @null;
1640                 %6 : Var<java.type:"java.lang.String"> = var %5;
1641                 %7 : java.type:"java.util.RandomAccess" = constant @null;
1642                 %8 : Var<java.type:"java.util.RandomAccess"> = var %7;
1643                 %9 : java.type:"int[]" = constant @null;
1644                 %10 : Var<java.type:"int[]"> = var %9;
1645                 %11 : java.type:"java.util.Stack[][]" = constant @null;
1646                 %12 : Var<java.type:"java.util.Stack[][]"> = var %11;
1647                 %13 : java.type:"java.util.Collection[][][]" = constant @null;
1648                 %14 : Var<java.type:"java.util.Collection[][][]"> = var %13;
1649                 %15 : java.type:"java.lang.Number" = constant @null;
1650                 %16 : Var<java.type:"java.lang.Number"> = var %15 @"n";
1651                 java.switch.statement %4
1652                     (%17 : java.type:"java.lang.Object")java.type:"boolean" -> {
1653                         %18 : java.type:"boolean" = pattern.match %17
1654                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1655                                 %19 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type;
1656                                 yield %19;
1657                             }
1658                             (%20 : java.type:"java.lang.String")java.type:"void" -> {
1659                                 var.store %6 %20;
1660                                 yield;
1661                             };
1662                         yield %18;
1663                     }
1664                     ()java.type:"void" -> {
1665                         %21 : java.type:"java.lang.String" = var.load %3;
1666                         %22 : java.type:"java.lang.String" = constant @"String";
1667                         %23 : java.type:"java.lang.String" = concat %21 %22;
1668                         var.store %3 %23;
1669                         yield;
1670                     }
1671                     (%24 : java.type:"java.lang.Object")java.type:"boolean" -> {
1672                         %25 : java.type:"boolean" = pattern.match %24
1673                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.RandomAccess>" -> {
1674                                 %26 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.RandomAccess>" = pattern.type;
1675                                 yield %26;
1676                             }
1677                             (%27 : java.type:"java.util.RandomAccess")java.type:"void" -> {
1678                                 var.store %8 %27;
1679                                 yield;
1680                             };
1681                         yield %25;
1682                     }
1683                     ()java.type:"void" -> {
1684                         %28 : java.type:"java.lang.String" = var.load %3;
1685                         %29 : java.type:"java.lang.String" = constant @"RandomAccess";
1686                         %30 : java.type:"java.lang.String" = concat %28 %29;
1687                         var.store %3 %30;
1688                         yield;
1689                     }
1690                     (%31 : java.type:"java.lang.Object")java.type:"boolean" -> {
1691                         %32 : java.type:"boolean" = pattern.match %31
1692                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<int[]>" -> {
1693                                 %33 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<int[]>" = pattern.type;
1694                                 yield %33;
1695                             }
1696                             (%34 : java.type:"int[]")java.type:"void" -> {
1697                                 var.store %10 %34;
1698                                 yield;
1699                             };
1700                         yield %32;
1701                     }
1702                     ()java.type:"void" -> {
1703                         %35 : java.type:"java.lang.String" = var.load %3;
1704                         %36 : java.type:"java.lang.String" = constant @"int[]";
1705                         %37 : java.type:"java.lang.String" = concat %35 %36;
1706                         var.store %3 %37;
1707                         yield;
1708                     }
1709                     (%38 : java.type:"java.lang.Object")java.type:"boolean" -> {
1710                         %39 : java.type:"boolean" = pattern.match %38
1711                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Stack[][]>" -> {
1712                                 %40 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Stack[][]>" = pattern.type;
1713                                 yield %40;
1714                             }
1715                             (%41 : java.type:"java.util.Stack[][]")java.type:"void" -> {
1716                                 var.store %12 %41;
1717                                 yield;
1718                             };
1719                         yield %39;
1720                     }
1721                     ()java.type:"void" -> {
1722                         %42 : java.type:"java.lang.String" = var.load %3;
1723                         %43 : java.type:"java.lang.String" = constant @"Stack[][]";
1724                         %44 : java.type:"java.lang.String" = concat %42 %43;
1725                         var.store %3 %44;
1726                         yield;
1727                     }
1728                     (%45 : java.type:"java.lang.Object")java.type:"boolean" -> {
1729                         %46 : java.type:"boolean" = pattern.match %45
1730                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Collection[][][]>" -> {
1731                                 %47 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.util.Collection[][][]>" = pattern.type;
1732                                 yield %47;
1733                             }
1734                             (%48 : java.type:"java.util.Collection[][][]")java.type:"void" -> {
1735                                 var.store %14 %48;
1736                                 yield;
1737                             };
1738                         yield %46;
1739                     }
1740                     ()java.type:"void" -> {
1741                         %49 : java.type:"java.lang.String" = var.load %3;
1742                         %50 : java.type:"java.lang.String" = constant @"Collection[][][]";
1743                         %51 : java.type:"java.lang.String" = concat %49 %50;
1744                         var.store %3 %51;
1745                         yield;
1746                     }
1747                     (%52 : java.type:"java.lang.Object")java.type:"boolean" -> {
1748                         %53 : java.type:"boolean" = pattern.match %52
1749                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" -> {
1750                                 %54 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1751                                 yield %54;
1752                             }
1753                             (%55 : java.type:"java.lang.Number")java.type:"void" -> {
1754                                 var.store %16 %55;
1755                                 yield;
1756                             };
1757                         yield %53;
1758                     }
1759                     ()java.type:"void" -> {
1760                         %56 : java.type:"java.lang.String" = var.load %3;
1761                         %57 : java.type:"java.lang.String" = constant @"Number";
1762                         %58 : java.type:"java.lang.String" = concat %56 %57;
1763                         var.store %3 %58;
1764                         yield;
1765                     }
1766                     ()java.type:"boolean" -> {
1767                         %59 : java.type:"boolean" = constant @true;
1768                         yield %59;
1769                     }
1770                     ()java.type:"void" -> {
1771                         %60 : java.type:"java.lang.String" = var.load %3;
1772                         %61 : java.type:"java.lang.String" = constant @"something else";
1773                         %62 : java.type:"java.lang.String" = concat %60 %61;
1774                         var.store %3 %62;
1775                         yield;
1776                     };
1777                 %63 : java.type:"java.lang.String" = var.load %3;
1778                 return %63;
1779             };
1780             """)
1781     @Reflect
1782     static String caseTypePattern(Object o) {
1783         String r = "";
1784         switch (o) {
1785             case String _ -> r+= "String"; // class
1786             case RandomAccess _ -> r+= "RandomAccess"; // interface
1787             case int[] _ -> r+= "int[]"; // array primitive
1788             case Stack[][] _ -> r+= "Stack[][]"; // array class
1789             case Collection[][][] _ -> r+= "Collection[][][]"; // array interface
1790             case final Number n -> r+= "Number"; // final modifier
1791             default -> r+= "something else";
1792         }
1793         return r;
1794     }
1795 
1796     record R(Number n) {}
1797     @IR("""
1798             func @"caseRecordPattern" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1799                 %1 : Var<java.type:"java.lang.Object"> = var %0 @"o";
1800                 %2 : java.type:"java.lang.String" = constant @"";
1801                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1802                 %4 : java.type:"java.lang.Object" = var.load %1;
1803                 %5 : java.type:"java.lang.Number" = constant @null;
1804                 %6 : Var<java.type:"java.lang.Number"> = var %5 @"n";
1805                 java.switch.statement %4
1806                     (%7 : java.type:"java.lang.Object")java.type:"boolean" -> {
1807                         %8 : java.type:"boolean" = pattern.match %7
1808                             ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" -> {
1809                                 %9 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1810                                 %10 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" = pattern.record %9 @java.ref:"(java.lang.Number n)SwitchStatementTest$R";
1811                                 yield %10;
1812                             }
1813                             (%11 : java.type:"java.lang.Number")java.type:"void" -> {
1814                                 var.store %6 %11;
1815                                 yield;
1816                             };
1817                         yield %8;
1818                     }
1819                     ()java.type:"void" -> {
1820                         %12 : java.type:"java.lang.String" = var.load %3;
1821                         %13 : java.type:"java.lang.String" = constant @"R(_)";
1822                         %14 : java.type:"java.lang.String" = concat %12 %13;
1823                         var.store %3 %14;
1824                         yield;
1825                     }
1826                     ()java.type:"boolean" -> {
1827                         %15 : java.type:"boolean" = constant @true;
1828                         yield %15;
1829                     }
1830                     ()java.type:"void" -> {
1831                         %16 : java.type:"java.lang.String" = var.load %3;
1832                         %17 : java.type:"java.lang.String" = constant @"else";
1833                         %18 : java.type:"java.lang.String" = concat %16 %17;
1834                         var.store %3 %18;
1835                         yield;
1836                     };
1837                 %19 : java.type:"java.lang.String" = var.load %3;
1838                 return %19;
1839             };
1840             """)
1841     @Reflect
1842     static String caseRecordPattern(Object o) {
1843         String r = "";
1844         switch (o) {
1845             case R(Number n) -> r += "R(_)";
1846             default -> r+= "else";
1847         }
1848         return r;
1849     }
1850 
1851     @IR("""
1852             func @"casePatternGuard" (%0 : java.type:"java.lang.Object")java.type:"java.lang.String" -> {
1853                 %1 : Var<java.type:"java.lang.Object"> = var %0 @"obj";
1854                 %2 : java.type:"java.lang.String" = constant @"";
1855                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1856                 %4 : java.type:"java.lang.Object" = var.load %1;
1857                 %5 : java.type:"java.lang.String" = constant @null;
1858                 %6 : Var<java.type:"java.lang.String"> = var %5 @"s";
1859                 %7 : java.type:"java.lang.Number" = constant @null;
1860                 %8 : Var<java.type:"java.lang.Number"> = var %7 @"n";
1861                 java.switch.statement %4
1862                     (%9 : java.type:"java.lang.Object")java.type:"boolean" -> {
1863                         %10 : java.type:"boolean" = java.cand
1864                             ()java.type:"boolean" -> {
1865                                 %11 : java.type:"boolean" = pattern.match %9
1866                                     ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" -> {
1867                                         %12 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.String>" = pattern.type @"s";
1868                                         yield %12;
1869                                     }
1870                                     (%13 : java.type:"java.lang.String")java.type:"void" -> {
1871                                         var.store %6 %13;
1872                                         yield;
1873                                     };
1874                                 yield %11;
1875                             }
1876                             ()java.type:"boolean" -> {
1877                                 %14 : java.type:"java.lang.String" = var.load %6;
1878                                 %15 : java.type:"int" = invoke %14 @java.ref:"java.lang.String::length():int";
1879                                 %16 : java.type:"int" = constant @3;
1880                                 %17 : java.type:"boolean" = gt %15 %16;
1881                                 yield %17;
1882                             };
1883                         yield %10;
1884                     }
1885                     ()java.type:"void" -> {
1886                         %18 : java.type:"java.lang.String" = var.load %3;
1887                         %19 : java.type:"java.lang.String" = constant @"str with length > %d";
1888                         %20 : java.type:"java.lang.String" = var.load %6;
1889                         %21 : java.type:"int" = invoke %20 @java.ref:"java.lang.String::length():int";
1890                         %22 : java.type:"java.lang.Integer" = invoke %21 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
1891                         %23 : java.type:"java.lang.String" = invoke %19 %22 @java.ref:"java.lang.String::formatted(java.lang.Object[]):java.lang.String" @invoke.kind="INSTANCE" @invoke.varargs=true;
1892                         %24 : java.type:"java.lang.String" = concat %18 %23;
1893                         var.store %3 %24;
1894                         yield;
1895                     }
1896                     (%25 : java.type:"java.lang.Object")java.type:"boolean" -> {
1897                         %26 : java.type:"boolean" = java.cand
1898                             ()java.type:"boolean" -> {
1899                                 %27 : java.type:"boolean" = pattern.match %25
1900                                     ()java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" -> {
1901                                         %28 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Type<java.lang.Number>" = pattern.type @"n";
1902                                         %29 : java.type:"jdk.incubator.code.dialect.java.JavaOp$Pattern$Record<SwitchStatementTest$R>" = pattern.record %28 @java.ref:"(java.lang.Number n)SwitchStatementTest$R";
1903                                         yield %29;
1904                                     }
1905                                     (%30 : java.type:"java.lang.Number")java.type:"void" -> {
1906                                         var.store %8 %30;
1907                                         yield;
1908                                     };
1909                                 yield %27;
1910                             }
1911                             ()java.type:"boolean" -> {
1912                                 %31 : java.type:"java.lang.Number" = var.load %8;
1913                                 %32 : java.type:"java.lang.Class<?>" = invoke %31 @java.ref:"java.lang.Object::getClass():java.lang.Class";
1914                                 %33 : java.type:"java.lang.Class" = constant @java.type:"java.lang.Double";
1915                                 %34 : java.type:"boolean" = invoke %32 %33 @java.ref:"java.lang.Object::equals(java.lang.Object):boolean";
1916                                 yield %34;
1917                             };
1918                         yield %26;
1919                     }
1920                     ()java.type:"void" -> {
1921                         %35 : java.type:"java.lang.String" = var.load %3;
1922                         %36 : java.type:"java.lang.String" = constant @"R(Double)";
1923                         %37 : java.type:"java.lang.String" = concat %35 %36;
1924                         var.store %3 %37;
1925                         yield;
1926                     }
1927                     ()java.type:"boolean" -> {
1928                         %38 : java.type:"boolean" = constant @true;
1929                         yield %38;
1930                     }
1931                     ()java.type:"void" -> {
1932                         %39 : java.type:"java.lang.String" = var.load %3;
1933                         %40 : java.type:"java.lang.String" = constant @"else";
1934                         %41 : java.type:"java.lang.String" = concat %39 %40;
1935                         var.store %3 %41;
1936                         yield;
1937                     };
1938                 %42 : java.type:"java.lang.String" = var.load %3;
1939                 return %42;
1940             };
1941             """)
1942     @Reflect
1943     static String casePatternGuard(Object obj) {
1944         String r = "";
1945         switch (obj) {
1946             case String s when s.length() > 3 -> r += "str with length > %d".formatted(s.length());
1947             case R(Number n) when n.getClass().equals(Double.class) -> r += "R(Double)";
1948             default -> r += "else";
1949         }
1950         return r;
1951     }
1952 
1953     @IR("""
1954             func @"defaultCaseNotTheLast" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
1955                 %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
1956                 %2 : java.type:"java.lang.String" = constant @"";
1957                 %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
1958                 %4 : java.type:"java.lang.String" = var.load %1;
1959                 java.switch.statement %4
1960                     ()java.type:"boolean" -> {
1961                         %17 : java.type:"boolean" = constant @true;
1962                         yield %17;
1963                     }
1964                     ()java.type:"void" -> {
1965                         %18 : java.type:"java.lang.String" = var.load %3;
1966                         %19 : java.type:"java.lang.String" = constant @"else";
1967                         %20 : java.type:"java.lang.String" = concat %18 %19;
1968                         var.store %3 %20;
1969                         yield;
1970                     }
1971                     (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
1972                         %6 : java.type:"java.lang.String" = constant @"M";
1973                         %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1974                         yield %7;
1975                     }
1976                     ()java.type:"void" -> {
1977                         %8 : java.type:"java.lang.String" = var.load %3;
1978                         %9 : java.type:"java.lang.String" = constant @"Mow";
1979                         %10 : java.type:"java.lang.String" = concat %8 %9;
1980                         var.store %3 %10;
1981                         yield;
1982                     }
1983                     (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
1984                         %12 : java.type:"java.lang.String" = constant @"A";
1985                         %13 : java.type:"boolean" = invoke %11 %12 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
1986                         yield %13;
1987                     }
1988                     ()java.type:"void" -> {
1989                         %14 : java.type:"java.lang.String" = var.load %3;
1990                         %15 : java.type:"java.lang.String" = constant @"Aow";
1991                         %16 : java.type:"java.lang.String" = concat %14 %15;
1992                         var.store %3 %16;
1993                         yield;
1994                     };
1995                 %21 : java.type:"java.lang.String" = var.load %3;
1996                 return %21;
1997             };
1998             """)
1999     @Reflect
2000     static String defaultCaseNotTheLast(String s) {
2001         String r = "";
2002         switch (s) {
2003             default -> r += "else";
2004             case "M" -> r += "Mow";
2005             case "A" -> r += "Aow";
2006         }
2007         return r;
2008     }
2009 
2010     @IR("""
2011             func @"f" (%0 : java.type:"int")java.type:"int" -> {
2012                   %1 : Var<java.type:"int"> = var %0 @"i";
2013                   %2 : java.type:"int" = var.load %1;
2014                   java.switch.statement %2
2015                       (%3 : java.type:"int")java.type:"boolean" -> {
2016                           %4 : java.type:"int" = constant @0;
2017                           %5 : java.type:"boolean" = eq %3 %4;
2018                           yield %5;
2019                       }
2020                       ()java.type:"void" -> {
2021                           %6 : java.type:"int" = constant @0;
2022                           return %6;
2023                       };
2024                   %7 : java.type:"int" = constant @0;
2025                   return %7;
2026               };
2027             """)
2028     @Reflect
2029     static int f(int i) {
2030         switch (i) {
2031             case 0 -> {
2032                 return 0;
2033             }
2034         }
2035         return 0;
2036     }
2037 
2038     @IR("""
2039             func @"outOfOrderFallThrought" (%0 : java.type:"int")java.type:"java.lang.String" -> {
2040                   %1 : Var<java.type:"int"> = var %0 @"i";
2041                   %2 : java.type:"java.lang.String" = constant @"";
2042                   %3 : Var<java.type:"java.lang.String"> = var %2 @"ret";
2043                   %4 : java.type:"int" = var.load %1;
2044                   java.switch.statement %4
2045                       ()java.type:"boolean" -> {
2046                           %5 : java.type:"boolean" = constant @true;
2047                           yield %5;
2048                       }
2049                       ()java.type:"void" -> {
2050                           %6 : java.type:"java.lang.String" = var.load %3;
2051                           %7 : java.type:"java.lang.String" = constant @"? ";
2052                           %8 : java.type:"java.lang.String" = concat %6 %7;
2053                           var.store %3 %8;
2054                           java.switch.fallthrough;
2055                       }
2056                       (%9 : java.type:"int")java.type:"boolean" -> {
2057                           %10 : java.type:"int" = constant @4;
2058                           %11 : java.type:"boolean" = eq %9 %10;
2059                           yield %11;
2060                       }
2061                       ()java.type:"void" -> {
2062                           %12 : java.type:"java.lang.String" = var.load %3;
2063                           %13 : java.type:"java.lang.String" = constant @"four ";
2064                           %14 : java.type:"java.lang.String" = concat %12 %13;
2065                           var.store %3 %14;
2066                           java.switch.fallthrough;
2067                       }
2068                       (%15 : java.type:"int")java.type:"boolean" -> {
2069                           %16 : java.type:"int" = constant @2;
2070                           %17 : java.type:"boolean" = eq %15 %16;
2071                           yield %17;
2072                       }
2073                       ()java.type:"void" -> {
2074                           %18 : java.type:"java.lang.String" = var.load %3;
2075                           %19 : java.type:"java.lang.String" = constant @"two ";
2076                           %20 : java.type:"java.lang.String" = concat %18 %19;
2077                           var.store %3 %20;
2078                           java.switch.fallthrough;
2079                       }
2080                       (%21 : java.type:"int")java.type:"boolean" -> {
2081                           %22 : java.type:"int" = constant @3;
2082                           %23 : java.type:"boolean" = eq %21 %22;
2083                           yield %23;
2084                       }
2085                       ()java.type:"void" -> {
2086                           %24 : java.type:"java.lang.String" = var.load %3;
2087                           %25 : java.type:"java.lang.String" = constant @"three ";
2088                           %26 : java.type:"java.lang.String" = concat %24 %25;
2089                           var.store %3 %26;
2090                           java.switch.fallthrough;
2091                       }
2092                       (%27 : java.type:"int")java.type:"boolean" -> {
2093                           %28 : java.type:"int" = constant @1;
2094                           %29 : java.type:"boolean" = eq %27 %28;
2095                           yield %29;
2096                       }
2097                       ()java.type:"void" -> {
2098                           %30 : java.type:"java.lang.String" = var.load %3;
2099                           %31 : java.type:"java.lang.String" = constant @"one";
2100                           %32 : java.type:"java.lang.String" = concat %30 %31;
2101                           var.store %3 %32;
2102                           yield;
2103                       };
2104                   %33 : java.type:"java.lang.String" = var.load %3;
2105                   return %33;
2106               };
2107             """)
2108     @Reflect
2109     static String outOfOrderFallThrought(int i) {
2110         String ret = "";
2111         switch (i) {
2112             default:
2113                 ret += "? ";
2114             case 4:
2115                 ret += "four ";
2116             case 2:
2117                 ret += "two ";
2118             case 3:
2119                 ret += "three ";
2120             case 1:
2121                 ret += "one";
2122         }
2123         return ret;
2124     }
2125 
2126     @IR("""
2127             func @"caseConstantPrimitiveWrapperSelector" (%0 : java.type:"java.lang.Integer")java.type:"java.lang.String" -> {
2128                   %1 : Var<java.type:"java.lang.Integer"> = var %0 @"i";
2129                   %2 : java.type:"java.lang.String" = constant @"";
2130                   %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2131                   %4 : java.type:"java.lang.Integer" = var.load %1;
2132                   java.switch.statement %4
2133                       (%5 : java.type:"java.lang.Integer")java.type:"boolean" -> {
2134                           %6 : java.type:"int" = invoke %5 @java.ref:"java.lang.Integer::intValue():int";
2135                           %7 : java.type:"int" = constant @1;
2136                           %8 : java.type:"boolean" = eq %6 %7;
2137                           yield %8;
2138                       }
2139                       ()java.type:"void" -> {
2140                           %9 : java.type:"java.lang.String" = var.load %3;
2141                           %10 : java.type:"java.lang.String" = constant @"one";
2142                           %11 : java.type:"java.lang.String" = concat %9 %10;
2143                           var.store %3 %11;
2144                           yield;
2145                       }
2146                       (%12 : java.type:"java.lang.Integer")java.type:"boolean" -> {
2147                           %13 : java.type:"boolean" = java.cor
2148                               ()java.type:"boolean" -> {
2149                                   %14 : java.type:"int" = invoke %12 @java.ref:"java.lang.Integer::intValue():int";
2150                                   %15 : java.type:"int" = constant @2;
2151                                   %16 : java.type:"boolean" = eq %14 %15;
2152                                   yield %16;
2153                               }
2154                               ()java.type:"boolean" -> {
2155                                   %17 : java.type:"int" = invoke %12 @java.ref:"java.lang.Integer::intValue():int";
2156                                   %18 : java.type:"int" = constant @3;
2157                                   %19 : java.type:"boolean" = eq %17 %18;
2158                                   yield %19;
2159                               };
2160                           yield %13;
2161                       }
2162                       ()java.type:"void" -> {
2163                           %20 : java.type:"java.lang.String" = var.load %3;
2164                           %21 : java.type:"java.lang.String" = constant @"two or three";
2165                           %22 : java.type:"java.lang.String" = concat %20 %21;
2166                           var.store %3 %22;
2167                           yield;
2168                       }
2169                       ()java.type:"boolean" -> {
2170                           %23 : java.type:"boolean" = constant @true;
2171                           yield %23;
2172                       }
2173                       ()java.type:"void" -> {
2174                           %24 : java.type:"java.lang.String" = var.load %3;
2175                           %25 : java.type:"java.lang.String" = constant @"else";
2176                           %26 : java.type:"java.lang.String" = concat %24 %25;
2177                           var.store %3 %26;
2178                           yield;
2179                       };
2180                   %27 : java.type:"java.lang.String" = var.load %3;
2181                   return %27;
2182               };
2183             """)
2184     @Reflect
2185     static String caseConstantPrimitiveWrapperSelector(Integer i) {
2186         String r = "";
2187         switch (i) {
2188             case 1 -> r += "one";
2189             case 2, 3 -> r += "two or three";
2190             default -> r += "else";
2191         };
2192         return r;
2193     }
2194 
2195     @IR("""
2196             func @"constantLabelCasted" (%0 : java.type:"int")java.type:"java.lang.String" -> {
2197                   %1 : Var<java.type:"int"> = var %0 @"i";
2198                   %2 : java.type:"java.lang.String" = constant @"";
2199                   %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2200                   %4 : java.type:"int" = var.load %1;
2201                   java.switch.statement %4
2202                       (%5 : java.type:"int")java.type:"boolean" -> {
2203                           %6 : java.type:"int" = constant @1;
2204                           %7 : java.type:"byte" = conv %6;
2205                           %8 : java.type:"int" = conv %7;
2206                           %9 : java.type:"boolean" = eq %5 %8;
2207                           yield %9;
2208                       }
2209                       ()java.type:"void" -> {
2210                           %10 : java.type:"java.lang.String" = var.load %3;
2211                           %11 : java.type:"java.lang.String" = constant @"one";
2212                           %12 : java.type:"java.lang.String" = concat %10 %11;
2213                           var.store %3 %12;
2214                           yield;
2215                       }
2216                       ()java.type:"boolean" -> {
2217                           %13 : java.type:"boolean" = constant @true;
2218                           yield %13;
2219                       }
2220                       ()java.type:"void" -> {
2221                           %14 : java.type:"java.lang.String" = var.load %3;
2222                           %15 : java.type:"java.lang.String" = constant @"not one";
2223                           %16 : java.type:"java.lang.String" = concat %14 %15;
2224                           var.store %3 %16;
2225                           yield;
2226                       };
2227                   %17 : java.type:"java.lang.String" = var.load %3;
2228                   return %17;
2229               };
2230             """)
2231     @Reflect
2232     static String constantLabelCasted(int i) {
2233         String r = "";
2234         switch (i) {
2235             case (byte) 1 -> r += "one";
2236             default -> r += "not one";
2237         };
2238         return r;
2239     }
2240 
2241     @IR("""
2242             func @"caseConstantStringLiteral" (%0 : java.type:"java.lang.String")java.type:"java.lang.String" -> {
2243                   %1 : Var<java.type:"java.lang.String"> = var %0 @"s";
2244                   %2 : java.type:"java.lang.String" = constant @"";
2245                   %3 : Var<java.type:"java.lang.String"> = var %2 @"r";
2246                   %4 : java.type:"java.lang.String" = var.load %1;
2247                   java.switch.statement %4
2248                       (%5 : java.type:"java.lang.String")java.type:"boolean" -> {
2249                           %6 : java.type:"java.lang.String" = constant @"1";
2250                           %7 : java.type:"boolean" = invoke %5 %6 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
2251                           yield %7;
2252                       }
2253                       ()java.type:"void" -> {
2254                           %8 : java.type:"java.lang.String" = var.load %3;
2255                           %9 : java.type:"java.lang.String" = constant @"one";
2256                           %10 : java.type:"java.lang.String" = concat %8 %9;
2257                           var.store %3 %10;
2258                           yield;
2259                       }
2260                       (%11 : java.type:"java.lang.String")java.type:"boolean" -> {
2261                           %12 : java.type:"boolean" = java.cor
2262                               ()java.type:"boolean" -> {
2263                                   %13 : java.type:"java.lang.String" = constant @"2";
2264                                   %14 : java.type:"boolean" = invoke %11 %13 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
2265                                   yield %14;
2266                               }
2267                               ()java.type:"boolean" -> {
2268                                   %15 : java.type:"java.lang.String" = constant @"3";
2269                                   %16 : java.type:"boolean" = invoke %11 %15 @java.ref:"java.util.Objects::equals(java.lang.Object, java.lang.Object):boolean";
2270                                   yield %16;
2271                               };
2272                           yield %12;
2273                       }
2274                       ()java.type:"void" -> {
2275                           %17 : java.type:"java.lang.String" = var.load %3;
2276                           %18 : java.type:"java.lang.String" = constant @"two or three";
2277                           %19 : java.type:"java.lang.String" = concat %17 %18;
2278                           var.store %3 %19;
2279                           yield;
2280                       }
2281                       ()java.type:"boolean" -> {
2282                           %20 : java.type:"boolean" = constant @true;
2283                           yield %20;
2284                       }
2285                       ()java.type:"void" -> {
2286                           %21 : java.type:"java.lang.String" = var.load %3;
2287                           %22 : java.type:"java.lang.String" = constant @"else";
2288                           %23 : java.type:"java.lang.String" = concat %21 %22;
2289                           var.store %3 %23;
2290                           yield;
2291                       };
2292                   %24 : java.type:"java.lang.String" = var.load %3;
2293                   return %24;
2294               };
2295             """)
2296     @Reflect
2297     static String caseConstantStringLiteral(String s) {
2298         String r = "";
2299         switch (s) {
2300             case "1" -> r += "one";
2301             case "2", "3" -> r+= "two or three";
2302             default -> r += "else";
2303         };
2304         return r;
2305     }
2306 
2307 }