1 /*
  2  * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 /*
 25  * @test
 26  * @modules jdk.incubator.code
 27  * @summary test lowering of synchronized blocks
 28  * @build TestSynchronized
 29  * @build CodeReflectionTester
 30  * @run main CodeReflectionTester TestSynchronized
 31  */
 32 
 33 import jdk.incubator.code.CodeReflection;
 34 
 35 public class TestSynchronized {
 36 
 37     @CodeReflection
 38     @LoweredModel(value = """
 39             func @"test1" (%0 : java.lang.Object, %1 : int)int -> {
 40                 %2 : Var<java.lang.Object> = var %0 @"m";
 41                 %3 : Var<int> = var %1 @"i";
 42                 %4 : java.lang.Object = var.load %2;
 43                 branch ^block_1(%4);
 44 
 45               ^block_1(%5 : java.lang.Object):
 46                 monitor.enter %5;
 47                 exception.region.enter ^block_2 ^block_4;
 48 
 49               ^block_2:
 50                 %7 : int = var.load %3;
 51                 %8 : int = constant @"1";
 52                 %9 : int = add %7 %8;
 53                 var.store %3 %9;
 54                 monitor.exit %5;
 55                 exception.region.exit ^block_3 ^block_4;
 56 
 57               ^block_3:
 58                 %10 : int = var.load %3;
 59                 return %10;
 60 
 61               ^block_4(%11 : java.lang.Throwable):
 62                 exception.region.enter ^block_5 ^block_4;
 63 
 64               ^block_5:
 65                 monitor.exit %5;
 66                 exception.region.exit ^block_6 ^block_4;
 67 
 68               ^block_6:
 69                 throw %11;
 70             };
 71             """, ssa = false)
 72     static int test1(Object m, int i) {
 73         synchronized (m) {
 74             i++;
 75         }
 76         return i;
 77     }
 78 
 79 
 80     @CodeReflection
 81     @LoweredModel(value = """
 82             func @"test2" (%0 : java.lang.Object, %1 : int)int -> {
 83                 %2 : Var<java.lang.Object> = var %0 @"m";
 84                 %3 : Var<int> = var %1 @"i";
 85                 %4 : java.lang.Object = var.load %2;
 86                 branch ^block_1(%4);
 87 
 88               ^block_1(%5 : java.lang.Object):
 89                 monitor.enter %5;
 90                 exception.region.enter ^block_2 ^block_8;
 91 
 92               ^block_2:
 93                 %7 : int = var.load %3;
 94                 %8 : int = constant @"0";
 95                 %9 : boolean = gt %7 %8;
 96                 cbranch %9 ^block_3 ^block_5;
 97 
 98               ^block_3:
 99                 %10 : int = constant @"-1";
100                 monitor.exit %5;
101                 exception.region.exit ^block_4 ^block_8;
102 
103               ^block_4:
104                 return %10;
105 
106               ^block_5:
107                 branch ^block_6;
108 
109               ^block_6:
110                 %11 : int = var.load %3;
111                 %12 : int = constant @"1";
112                 %13 : int = add %11 %12;
113                 var.store %3 %13;
114                 monitor.exit %5;
115                 exception.region.exit ^block_7 ^block_8;
116 
117               ^block_7:
118                 %14 : int = var.load %3;
119                 return %14;
120 
121               ^block_8(%15 : java.lang.Throwable):
122                 exception.region.enter ^block_9 ^block_8;
123 
124               ^block_9:
125                 monitor.exit %5;
126                 exception.region.exit ^block_10 ^block_8;
127 
128               ^block_10:
129                 throw %15;
130             };
131             """, ssa = false)
132     static int test2(Object m, int i) {
133         synchronized (m) {
134             if (i > 0) {
135                 return -1;
136             }
137             i++;
138         }
139         return i;
140     }
141 
142 }