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