/* * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. * */ super public class TestBackedgeLoadArrayFill { public Method "":"()V" stack 2 locals 1 { aload_0; invokespecial Method java/lang/Object."":"()V"; return; } static Method test_101:"()V" stack 20 locals 20 { // test_002 in jasm: using try-catch ldc 6; istore_0; // i = 6 ldc 25; newarray int; astore_1; // arr = new int[25] HEAD: aload_1; iload_0; iconst_1; iastore; // arr[i] = 1 // second block - the only one -> head block can be copied: one before, one on backedge try t0; aload_1; iload_0; aload_1; iload_0; iaload; iastore; // arr[i] = arr[i] goto FINALLY; endtry t0; catch t0 java/lang/Exception; pop; // exception FINALLY: iinc 0, 1; // i++ iload_0; ldc 21; if_icmplt HEAD; // if i < 21 // write array aload_1; putstatic Field TestBackedgeLoadArrayFillMain.intA:"[I"; return; } static Method test_102:"()V" stack 20 locals 20 { // test_002 in jasm: without try-catch ldc 5; istore_0; // i = 5 ldc 25; newarray int; astore_1; // arr = new int[25] HEAD: aload_1; iload_0; iconst_1; iastore; // arr[i] = 1 goto SECOND; // second block - the only one -> head block can be copied: one before, one on backedge // must have some material before inc, else it is partial peeled away // And if we set -XX:-PartialPeelLoop, then the counted loop is never detected SECOND: aload_1; iload_0; aload_1; iload_0; iaload; iastore; // arr[i] = arr[i] iinc 0, 1; // i++ iload_0; ldc 21; if_icmplt HEAD; // if i < 21 // write array aload_1; putstatic Field TestBackedgeLoadArrayFillMain.intA:"[I"; return; } static Method test_103:"()V" stack 20 locals 20 { // test_002 in jasm: without try-catch, and second array ldc 7; istore_0; // i = 7 ldc 25; newarray int; astore_1; // arr = new int[25] ldc 25; newarray int; astore_2; // arr2 = new int[25] HEAD: aload_1; iload_0; iconst_1; iastore; // arr[i] = 1 goto SECOND; // second block - the only one -> head block can be copied: one before, one on backedge SECOND: // we can also do the identity read-write on another array - it just has to eventually disappear aload_2; iload_0; aload_2; iload_0; iaload; iastore; // arr2[i] = arr2[i] iinc 0, 1; // i++ iload_0; ldc 21; if_icmplt HEAD; // if i < 21 // write array aload_1; putstatic Field TestBackedgeLoadArrayFillMain.intA:"[I"; return; } static Method test_104:"()V" stack 20 locals 20 { ldc 9; istore_0; // i = 9 ldc 25; newarray int; astore_1; // arr = new int[25] HEAD: aload_1; iload_0; iconst_1; iastore; // arr[i] = 1 goto SECOND; // second block - the only one -> head block can be copied: one before, one on backedge SECOND: // CFG leads to partial peel -> load moved into loop body, then intrinsified iload_0; ldc 2; irem; ifeq SKIP; SKIP: iinc 0, 1; // i++ iload_0; ldc 21; if_icmplt HEAD; // if i < 21 // write array aload_1; putstatic Field TestBackedgeLoadArrayFillMain.intA:"[I"; return; } }