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 * @summary Smoke test for code reflection with binary operations. 27 * @modules jdk.incubator.code 28 * @build BinopTest 29 * @build CodeReflectionTester 30 * @run main CodeReflectionTester BinopTest 31 */ 32 33 import jdk.incubator.code.CodeReflection; 34 35 public class BinopTest { 36 37 @CodeReflection 38 @IR(""" 39 func @"test" (%0 : java.type:"BinopTest")java.type:"int" -> { 40 %1 : java.type:"int" = constant @5; 41 %2 : java.type:"int" = constant @2; 42 %3 : java.type:"int" = constant @4; 43 %4 : java.type:"int" = mul %2 %3; 44 %5 : java.type:"int" = add %1 %4; 45 %6 : java.type:"int" = constant @3; 46 %7 : java.type:"int" = sub %5 %6; 47 return %7; 48 }; 49 """) 50 int test() { 51 return 5 + 2 * 4 - 3; 52 } 53 54 @CodeReflection 55 @IR(""" 56 func @"test2" (%0 : java.type:"BinopTest")java.type:"int" -> { 57 %1 : java.type:"int" = constant @1; 58 %2 : java.type:"int" = constant @2; 59 %3 : java.type:"int" = constant @3; 60 %4 : java.type:"int" = constant @4; 61 %5 : java.type:"int" = add %3 %4; 62 %6 : java.type:"int" = add %2 %5; 63 %7 : java.type:"int" = add %1 %6; 64 return %7; 65 }; 66 """) 67 int test2() { 68 return 1 + (2 + (3 + 4)); 69 } 70 71 @CodeReflection 72 @IR(""" 73 func @"test3" (%0 : java.type:"BinopTest")java.type:"int" -> { 74 %1 : java.type:"int" = constant @1; 75 %2 : java.type:"int" = constant @2; 76 %3 : java.type:"int" = add %1 %2; 77 %4 : java.type:"int" = constant @3; 78 %5 : java.type:"int" = add %3 %4; 79 %6 : java.type:"int" = constant @4; 80 %7 : java.type:"int" = add %5 %6; 81 return %7; 82 }; 83 """) 84 int test3() { 85 return ((1 + 2) + 3) + 4; 86 } 87 88 @CodeReflection 89 @IR(""" 90 func @"test4" (%0 : java.type:"BinopTest", %1 : java.type:"int")java.type:"int" -> { 91 %2 : Var<java.type:"int"> = var %1 @"i"; 92 %3 : java.type:"int" = var.load %2; 93 %4 : java.type:"int" = constant @1; 94 %5 : java.type:"int" = add %3 %4; 95 var.store %2 %5; 96 %6 : java.type:"int" = var.load %2; 97 %7 : java.type:"int" = constant @1; 98 %8 : java.type:"int" = mul %6 %7; 99 var.store %2 %8; 100 %9 : java.type:"int" = add %5 %8; 101 %10 : java.type:"int" = var.load %2; 102 %11 : java.type:"int" = constant @1; 103 %12 : java.type:"int" = div %10 %11; 104 var.store %2 %12; 105 %13 : java.type:"int" = add %9 %12; 106 %14 : java.type:"int" = var.load %2; 107 %15 : java.type:"int" = constant @1; 108 %16 : java.type:"int" = sub %14 %15; 109 var.store %2 %16; 110 %17 : java.type:"int" = add %13 %16; 111 %18 : java.type:"int" = var.load %2; 112 %19 : java.type:"int" = constant @1; 113 %20 : java.type:"int" = mod %18 %19; 114 var.store %2 %20; 115 %21 : java.type:"int" = add %17 %20; 116 return %21; 117 }; 118 """) 119 int test4(int i) { 120 return (i += 1) + (i *= 1) + (i /= 1) + (i -= 1) + (i %= 1); 121 } 122 123 @CodeReflection 124 @IR(""" 125 func @"test5" (%0 : java.type:"BinopTest", %1 : java.type:"int")java.type:"boolean" -> { 126 %2 : Var<java.type:"int"> = var %1 @"i"; 127 %3 : java.type:"int" = var.load %2; 128 %4 : java.type:"int" = constant @0; 129 %5 : java.type:"boolean" = eq %3 %4; 130 %6 : java.type:"boolean" = not %5; 131 return %6; 132 }; 133 """) 134 boolean test5(int i) { 135 return !(i == 0); 136 } 137 138 @CodeReflection 139 @IR(""" 140 func @"test6" (%0 : java.type:"BinopTest")java.type:"int" -> { 141 %1 : java.type:"int" = constant @5; 142 %2 : java.type:"int" = constant @2; 143 %3 : java.type:"int" = mod %1 %2; 144 return %3; 145 }; 146 """) 147 int test6() { 148 return 5 % 2; 149 } 150 151 @CodeReflection 152 @IR(""" 153 func @"test7" (%0 : java.type:"BinopTest", %1 : java.type:"double")java.type:"void" -> { 154 %2 : Var<java.type:"double"> = var %1 @"d"; 155 %3 : java.type:"double" = var.load %2; 156 %4 : java.type:"int" = constant @1; 157 %5 : java.type:"double" = conv %4; 158 %6 : java.type:"double" = add %3 %5; 159 var.store %2 %6; 160 %7 : java.type:"long" = constant @1; 161 %8 : java.type:"double" = conv %7; 162 %9 : java.type:"double" = var.load %2; 163 %10 : java.type:"double" = add %8 %9; 164 var.store %2 %10; 165 %11 : java.type:"double" = var.load %2; 166 %12 : java.type:"long" = constant @1; 167 %13 : java.type:"double" = conv %12; 168 %14 : java.type:"double" = sub %11 %13; 169 var.store %2 %14; 170 %15 : java.type:"int" = constant @1; 171 %16 : java.type:"double" = conv %15; 172 %17 : java.type:"double" = var.load %2; 173 %18 : java.type:"double" = sub %16 %17; 174 var.store %2 %18; 175 %19 : java.type:"double" = var.load %2; 176 %20 : java.type:"int" = constant @1; 177 %21 : java.type:"double" = conv %20; 178 %22 : java.type:"double" = mul %19 %21; 179 var.store %2 %22; 180 %23 : java.type:"long" = constant @1; 181 %24 : java.type:"double" = conv %23; 182 %25 : java.type:"double" = var.load %2; 183 %26 : java.type:"double" = mul %24 %25; 184 var.store %2 %26; 185 %27 : java.type:"double" = var.load %2; 186 %28 : java.type:"long" = constant @1; 187 %29 : java.type:"double" = conv %28; 188 %30 : java.type:"double" = div %27 %29; 189 var.store %2 %30; 190 %31 : java.type:"int" = constant @1; 191 %32 : java.type:"double" = conv %31; 192 %33 : java.type:"double" = var.load %2; 193 %34 : java.type:"double" = div %32 %33; 194 var.store %2 %34; 195 %35 : java.type:"double" = var.load %2; 196 %36 : java.type:"int" = constant @1; 197 %37 : java.type:"double" = conv %36; 198 %38 : java.type:"double" = mod %35 %37; 199 var.store %2 %38; 200 %39 : java.type:"long" = constant @1; 201 %40 : java.type:"double" = conv %39; 202 %41 : java.type:"double" = var.load %2; 203 %42 : java.type:"double" = mod %40 %41; 204 var.store %2 %42; 205 %43 : java.type:"int" = constant @-1; 206 %44 : java.type:"double" = conv %43; 207 var.store %2 %44; 208 return; 209 }; 210 """) 211 void test7(double d) { 212 d = d + 1; 213 d = 1L + d; 214 215 d = d - 1L; 216 d = 1 - d; 217 218 d = d * 1; 219 d = 1L * d; 220 221 d = d / 1L; 222 d = 1 / d; 223 224 d = d % 1; 225 d = 1L % d; 226 227 d = -1; 228 } 229 230 @CodeReflection 231 @IR(""" 232 func @"test8" (%0 : java.type:"BinopTest", %1 : java.type:"double")java.type:"void" -> { 233 %2 : Var<java.type:"double"> = var %1 @"d"; 234 %3 : java.type:"double" = var.load %2; 235 %4 : java.type:"int" = constant @1; 236 %5 : java.type:"double" = conv %4; 237 %6 : java.type:"double" = add %3 %5; 238 var.store %2 %6; 239 %7 : java.type:"double" = var.load %2; 240 %8 : java.type:"long" = constant @1; 241 %9 : java.type:"double" = conv %8; 242 %10 : java.type:"double" = sub %7 %9; 243 var.store %2 %10; 244 %11 : java.type:"double" = var.load %2; 245 %12 : java.type:"int" = constant @1; 246 %13 : java.type:"double" = conv %12; 247 %14 : java.type:"double" = mul %11 %13; 248 var.store %2 %14; 249 %15 : java.type:"double" = var.load %2; 250 %16 : java.type:"long" = constant @1; 251 %17 : java.type:"double" = conv %16; 252 %18 : java.type:"double" = div %15 %17; 253 var.store %2 %18; 254 %19 : java.type:"double" = var.load %2; 255 %20 : java.type:"int" = constant @1; 256 %21 : java.type:"double" = conv %20; 257 %22 : java.type:"double" = mod %19 %21; 258 var.store %2 %22; 259 return; 260 }; 261 """) 262 void test8(double d) { 263 d += 1; 264 265 d -= 1L; 266 267 d *= 1; 268 269 d /= 1L; 270 271 d %= 1; 272 } 273 274 @CodeReflection 275 @IR(""" 276 func @"test9" (%0 : java.type:"BinopTest", %1 : java.type:"byte", %2 : java.type:"byte", %3 : java.type:"short")java.type:"void" -> { 277 %4 : Var<java.type:"byte"> = var %1 @"a"; 278 %5 : Var<java.type:"byte"> = var %2 @"b"; 279 %6 : Var<java.type:"short"> = var %3 @"s"; 280 %7 : java.type:"byte" = var.load %4; 281 %8 : java.type:"byte" = var.load %5; 282 %9 : java.type:"byte" = add %7 %8; 283 var.store %4 %9; 284 %10 : java.type:"byte" = var.load %4; 285 %11 : java.type:"short" = var.load %6; 286 %12 : java.type:"byte" = conv %11; 287 %13 : java.type:"byte" = div %10 %12; 288 var.store %4 %13; 289 %14 : java.type:"byte" = var.load %4; 290 %15 : java.type:"double" = constant @3.5d; 291 %16 : java.type:"byte" = conv %15; 292 %17 : java.type:"byte" = mul %14 %16; 293 var.store %4 %17; 294 %18 : java.type:"byte" = var.load %4; 295 %19 : java.type:"byte" = var.load %5; 296 %20 : java.type:"byte" = lshl %18 %19; 297 var.store %4 %20; 298 %21 : java.type:"byte" = var.load %4; 299 %22 : java.type:"int" = constant @1; 300 %23 : java.type:"byte" = conv %22; 301 %24 : java.type:"byte" = ashr %21 %23; 302 var.store %4 %24; 303 %25 : java.type:"byte" = var.load %4; 304 %26 : java.type:"long" = constant @1; 305 %27 : java.type:"byte" = conv %26; 306 %28 : java.type:"byte" = ashr %25 %27; 307 var.store %4 %28; 308 return; 309 }; 310 """) 311 void test9(byte a, byte b, short s) { 312 a += b; 313 314 a /= s; 315 316 a *= 3.5d; 317 318 a <<= b; 319 320 a >>= 1; 321 322 a >>= 1L; 323 } 324 }