

class Test {

    static abstract class MyAbstract {
        abstract public void m();
    }

    static class MyClass extends MyAbstract {
        public void m() { };
    }

    static class MyClass2 extends MyAbstract {
        public void m() { };
    }

    static int result;
    static int[] iArrFld;
    static Boolean b;
    
    static void dontInline() { }

    static void vMeth1(MyAbstract intf) {
        intf.m();
        int iArr[] = new int[256];
        for (int j = 0; j < iArr.length; j++) {
            iArr[j] = (j % 2 == 0) ? 5 + j : 5 - j;
        }
        iArrFld = iArr;
        for (int i5 : iArr) {
            try {
                i5 = 12430 / iArrFld[(i5 >>> 1) % 256];
                iArrFld[(i5 >>> 1) % 256] = 141 / i5;
                i5 = i5 / i5;
            } catch (ArithmeticException a_e) {
            }
            int val = (i5 >>> 1) % 10 + 36;
            switch (val) {
            case 36:
                dontInline();
                for (int j = -2967; j < 4342; j += 4) {}
                result += 45.363F;
            case 40:
                break;
            case 41:
                iArr[1] -= 199;
            }
        }
    }

    static void vMeth(MyAbstract intf) {
        if (b) return;
        vMeth1(intf);
    }

    public static void main(String[] args) {
        MyAbstract intf = new MyClass();
        for (int i = 0; i < 2; ++i) {
            try {
                b = true;
                for (int j = 0; j < 10000; j += 1) vMeth(intf);
            } finally {
                b = false;
            }
            vMeth(intf);
        }
        // Trigger deopt due to assert_abstract_with_unique_concrete_subtype dependency
        MyClass2 t = new MyClass2();
        vMeth(intf);
        if (result != 30645) {
            throw new RuntimeException("Test failed: " + result);
        }
    }
}
