<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
You found a bug with break/continue lowering! If you add finally to both try statements I believe it should be correct, so there is some logic missing.
<div><br>
</div>
<div>I have a better sense now of what you are proposing with the updated example (still working my way through the emails). The current modeling approach preserves the structure when lowering models and relies on properties of the code model for structural
 correctness (use and dominence). But, IIUC when lifting from bytecode that structure can ill-formed and it is hard to recover.</div>
<div><br>
</div>
<div>In your modeling approach (ignoring multi-catch for now) I think it may be possible to refer directly to the catch blocks as successors for both exit and enter, thereby avoiding a level of indirection. I am trying to work through some of the rules of region
 enters and exits, how they relate to each other, and operations covered by regions. On key aspect I did not realize before is being able to partially exit a region - presumably there is a required order to such exits based on the order of related enters?</div>
<div><br>
</div>
<div>It would be interesting to expand on your example to include finally blocks e.g., (the lowered model has been transformed to remove redundant blocks an which I believe to be correct)</div>
<div><br>
</div>
<div>
<div><font face="Courier New">    @CodeReflection</font></div>
<div><font face="Courier New">    static void nestedCatch(int i) {</font></div>
<div><font face="Courier New">        PrintStream out = System.out;</font></div>
<div><font face="Courier New">        while (true) {</font></div>
<div><font face="Courier New">            try {</font></div>
<div><font face="Courier New">                try {</font></div>
<div><font face="Courier New">                    if (i == 0) {</font></div>
<div><font face="Courier New">                        break;</font></div>
<div><font face="Courier New">                    } else if (i == 1) {</font></div>
<div><font face="Courier New">                        continue;</font></div>
<div><font face="Courier New">                    }</font></div>
<div><font face="Courier New">                } catch (NullPointerException npe) {</font></div>
<div><font face="Courier New">                    out.println("CATCH NPE");</font></div>
<div><font face="Courier New">                } finally {</font></div>
<div><font face="Courier New">                    out.println("FINALLY INNER");</font></div>
<div><font face="Courier New">                }</font></div>
<div><font face="Courier New">                out.println("AFTER TRY INNER");</font></div>
<div><font face="Courier New">            } catch (RuntimeException re) {</font></div>
<div><font face="Courier New">                out.println("CATCH RE");</font></div>
<div><font face="Courier New">            } finally {</font></div>
<div><font face="Courier New">                out.println("FINALLY OUTER");</font></div>
<div><font face="Courier New">            }</font></div>
<div><font face="Courier New">        }</font></div>
<div><font face="Courier New">    }</font></div>
</div>
<div><br>
</div>
<div><br>
</div>
<div>
<div><font face="Courier New">func @"nestedCatch" @loc="126:5:file:/Users/sandoz/Projects/jdk/test/babylon-test/src/main/java/T.java" (%0 : int)void -> {</font></div>
<div><font face="Courier New">    %1 : Var<int> = var %0 @"i" @loc="126:5";</font></div>
<div><font face="Courier New">    %2 : java.io.PrintStream = field.load @"java.lang.System::out()java.io.PrintStream" @loc="128:27";</font></div>
<div><font face="Courier New">    %3 : Var<java.io.PrintStream> = var %2 @"out" @loc="128:9";</font></div>
<div><font face="Courier New">    branch ^block_1;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_1:</font></div>
<div><font face="Courier New">    %4 : boolean = constant @"true" @loc="129:16";</font></div>
<div><font face="Courier New">    cbranch %4 ^block_2 ^block_21;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_2:</font></div>
<div><font face="Courier New">    %5 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_3 ^block_17 ^block_20;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_3:</font></div>
<div><font face="Courier New">    %6 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_4 ^block_13 ^block_16;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_4:</font></div>
<div><font face="Courier New">    %7 : int = var.load %1 @loc="132:25";</font></div>
<div><font face="Courier New">    %8 : int = constant @"0" @loc="132:30";</font></div>
<div><font face="Courier New">    %9 : boolean = eq %7 %8 @loc="132:25";</font></div>
<div><font face="Courier New">    cbranch %9 ^block_5 ^block_8;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_5:</font></div>
<div><font face="Courier New">    exception.region.exit %6 ^block_6;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_6:</font></div>
<div><font face="Courier New">    %10 : java.io.PrintStream = var.load %3 @loc="140:21";</font></div>
<div><font face="Courier New">    %11 : java.lang.String = constant @"FINALLY INNER" @loc="140:33";</font></div>
<div><font face="Courier New">    invoke %10 %11 @"java.io.PrintStream::println(java.lang.String)void" @loc="140:21";</font></div>
<div><font face="Courier New">    exception.region.exit %5 ^block_7;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_7:</font></div>
<div><font face="Courier New">    %12 : java.io.PrintStream = var.load %3 @loc="146:17";</font></div>
<div><font face="Courier New">    %13 : java.lang.String = constant @"FINALLY OUTER" @loc="146:29";</font></div>
<div><font face="Courier New">    invoke %12 %13 @"java.io.PrintStream::println(java.lang.String)void" @loc="146:17";</font></div>
<div><font face="Courier New">    branch ^block_21;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_8:</font></div>
<div><font face="Courier New">    %14 : int = var.load %1 @loc="134:32";</font></div>
<div><font face="Courier New">    %15 : int = constant @"1" @loc="134:37";</font></div>
<div><font face="Courier New">    %16 : boolean = eq %14 %15 @loc="134:32";</font></div>
<div><font face="Courier New">    cbranch %16 ^block_9 ^block_12;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_9:</font></div>
<div><font face="Courier New">    exception.region.exit %6 ^block_10;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_10:</font></div>
<div><font face="Courier New">    %17 : java.io.PrintStream = var.load %3 @loc="140:21";</font></div>
<div><font face="Courier New">    %18 : java.lang.String = constant @"FINALLY INNER" @loc="140:33";</font></div>
<div><font face="Courier New">    invoke %17 %18 @"java.io.PrintStream::println(java.lang.String)void" @loc="140:21";</font></div>
<div><font face="Courier New">    exception.region.exit %5 ^block_11;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_11:</font></div>
<div><font face="Courier New">    %19 : java.io.PrintStream = var.load %3 @loc="146:17";</font></div>
<div><font face="Courier New">    %20 : java.lang.String = constant @"FINALLY OUTER" @loc="146:29";</font></div>
<div><font face="Courier New">    invoke %19 %20 @"java.io.PrintStream::println(java.lang.String)void" @loc="146:17";</font></div>
<div><font face="Courier New">    branch ^block_1;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_12:</font></div>
<div><font face="Courier New">    exception.region.exit %6 ^block_15;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_13(%21 : java.lang.NullPointerException):</font></div>
<div><font face="Courier New">    %22 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_14 ^block_16;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_14:</font></div>
<div><font face="Courier New">    %23 : Var<java.lang.NullPointerException> = var %21 @"npe" @loc="131:17";</font></div>
<div><font face="Courier New">    %24 : java.io.PrintStream = var.load %3 @loc="138:21";</font></div>
<div><font face="Courier New">    %25 : java.lang.String = constant @"CATCH NPE" @loc="138:33";</font></div>
<div><font face="Courier New">    invoke %24 %25 @"java.io.PrintStream::println(java.lang.String)void" @loc="138:21";</font></div>
<div><font face="Courier New">    exception.region.exit %22 ^block_15;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_15:</font></div>
<div><font face="Courier New">    %26 : java.io.PrintStream = var.load %3 @loc="140:21";</font></div>
<div><font face="Courier New">    %27 : java.lang.String = constant @"FINALLY INNER" @loc="140:33";</font></div>
<div><font face="Courier New">    invoke %26 %27 @"java.io.PrintStream::println(java.lang.String)void" @loc="140:21";</font></div>
<div><font face="Courier New">    %28 : java.io.PrintStream = var.load %3 @loc="142:17";</font></div>
<div><font face="Courier New">    %29 : java.lang.String = constant @"AFTER TRY INNER" @loc="142:29";</font></div>
<div><font face="Courier New">    invoke %28 %29 @"java.io.PrintStream::println(java.lang.String)void" @loc="142:17";</font></div>
<div><font face="Courier New">    exception.region.exit %5 ^block_19;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_16(%30 : java.lang.Throwable):</font></div>
<div><font face="Courier New">    %31 : java.io.PrintStream = var.load %3 @loc="140:21";</font></div>
<div><font face="Courier New">    %32 : java.lang.String = constant @"FINALLY INNER" @loc="140:33";</font></div>
<div><font face="Courier New">    invoke %31 %32 @"java.io.PrintStream::println(java.lang.String)void" @loc="140:21";</font></div>
<div><font face="Courier New">    throw %30;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_17(%33 : java.lang.RuntimeException):</font></div>
<div><font face="Courier New">    %34 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_18 ^block_20;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_18:</font></div>
<div><font face="Courier New">    %35 : Var<java.lang.RuntimeException> = var %33 @"re" @loc="130:13";</font></div>
<div><font face="Courier New">    %36 : java.io.PrintStream = var.load %3 @loc="144:17";</font></div>
<div><font face="Courier New">    %37 : java.lang.String = constant @"CATCH RE" @loc="144:29";</font></div>
<div><font face="Courier New">    invoke %36 %37 @"java.io.PrintStream::println(java.lang.String)void" @loc="144:17";</font></div>
<div><font face="Courier New">    exception.region.exit %34 ^block_19;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_19:</font></div>
<div><font face="Courier New">    %38 : java.io.PrintStream = var.load %3 @loc="146:17";</font></div>
<div><font face="Courier New">    %39 : java.lang.String = constant @"FINALLY OUTER" @loc="146:29";</font></div>
<div><font face="Courier New">    invoke %38 %39 @"java.io.PrintStream::println(java.lang.String)void" @loc="146:17";</font></div>
<div><font face="Courier New">    branch ^block_1;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_20(%40 : java.lang.Throwable):</font></div>
<div><font face="Courier New">    %41 : java.io.PrintStream = var.load %3 @loc="146:17";</font></div>
<div><font face="Courier New">    %42 : java.lang.String = constant @"FINALLY OUTER" @loc="146:29";</font></div>
<div><font face="Courier New">    invoke %41 %42 @"java.io.PrintStream::println(java.lang.String)void" @loc="146:17";</font></div>
<div><font face="Courier New">    throw %40;</font></div>
<div><font face="Courier New">  </font></div>
<div><font face="Courier New">  ^block_21:</font></div>
<div><font face="Courier New">    return @loc="126:5";</font></div>
<div><font face="Courier New">};</font></div>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br id="lineBreakAtBeginningOfMessage">
<div><br>
</div>
</div>
</body>
</html>