/*
 * Copyright (c) 2019, 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.
 *
 */

public class compiler/c1/TestGotoIf version 52:0 {
    public Field f1:"I";
    public Field f2:"I";
    public static Field i:"I";

    Method "<init>":"()V" stack 1 locals 1 {
        aload_0;
        invokespecial Method java/lang/Object."<init>":"()V";
        return;
    }

    public Method test1:"()I" stack 3 locals 1 {
        aload_0;
        getfield Field f1:"I";
        aload_0;
        getfield Field f2:"I";
        iconst_1;
        isub;
        // Without the fix, if got eliminated by CEE
        if_icmpgt Null;
        iconst_1;
      Return: stack_frame_type stack1;
      stack_map int;
        ireturn;
      Null: stack_frame_type same;
        iconst_0;
        goto Return; // Backbranch (t_goto) with safepoint
    }

    public Method test2:"()I" stack 3 locals 1 {
        aload_0;
        getfield Field f1:"I";
        aload_0;
        getfield Field f2:"I";
        iconst_1;
        isub;
        goto Skip;
      Return: stack_frame_type full;
      stack_map int;
        ireturn;
      Skip: stack_frame_type full;
      stack_map int, int;
        // Without the fix, if got eliminated by CEE
        if_icmpgt Null;
        iconst_1;
        goto Return; // Backbranch (f_goto) with safepoint
      Null: stack_frame_type full;
      stack_map;
        iconst_0;
        goto Return; // Backbranch (t_goto) with safepoint
    }

    public Method test3:"()I" stack 3 locals 1 {
        aload_0;
        getfield Field f1:"I";
        aload_0;
        getfield Field f2:"I";
        iconst_1;
        isub;
        goto Skip;
      Return: stack_frame_type full;
      stack_map int;
        ireturn;
      Null: stack_frame_type full;
      stack_map;
        iconst_0;
        goto Return; // Backbranch (t_goto) with safepoint
      Skip: stack_frame_type full;
      stack_map int, int;
        // If will be eliminated by CEE
        if_icmpgt Null; // Backbranch (if) with safepoint
        iconst_1;
        goto Return; // Backbranch (f_goto) with safepoint
    }

    public Method test4:"()I" stack 3 locals 1 {
        aload_0;
        getfield Field f1:"I";
        aload_0;
        getfield Field f2:"I";
        iconst_1;
        isub;
        goto Skip;
      Null: stack_frame_type full;
      stack_map;
        iconst_0;
      Return: stack_frame_type full;
      stack_map int;
        ireturn; 
      Skip: stack_frame_type full;
      stack_map int, int;
        // If will be eliminated by CEE
        if_icmpgt Null; // Backbranch (if) with safepoint
        iconst_1;
        goto Return; // Backbranch (f_goto) with safepoint
    }

    public Method test5:"()I" stack 3 locals 2 {
        aload_0;
        getfield Field f1:"I";
        aload_0;
        getfield Field f2:"I";
        iconst_1;
        isub;
        goto Skip;
      Null: stack_frame_type full;
      stack_map;
        iconst_0;
        goto Return;
      Skip: stack_frame_type full;
      stack_map int, int;
        // If will be eliminated by CEE
        if_icmpgt Null; // Backbranch (if) with safepoint
        iconst_1;
      Return: stack_frame_type full;
      stack_map int;
        ireturn; 
    }

    public Method test6:"()I" stack 4 locals 1 {
        getstatic Field i:"I";
      Loop: stack_frame_type full;
      stack_map int;
        // Decrement i and exit loop if < 0
        iconst_0;
        getstatic Field i:"I";
        iconst_1;
        isub;
        dup;
        putstatic Field i:"I";
        if_icmpgt Exit;

        iconst_1;
        // Without the fix, if got eliminated by CEE
        if_icmpgt Null;
        iconst_1;
        goto Loop; // Backbranch (f_goto) with safepoint
      Null: stack_frame_type same;
        iconst_0;
        goto Loop; // Backbranch (t_goto) with safepoint

      Exit: stack_frame_type full;
      stack_map int;
        iconst_0;
        ireturn; 
    }
}