jdk/test/hotspot/jtreg/compiler/c2/TestDeadPathManyDeadDataNodes.java
2026-07-15 09:25:58 +00:00

1302 lines
42 KiB
Java

/*
* Copyright (c) 2026 IBM Corporation. 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.
*/
/**
* @test
* @bug 8380166
* @summary C2: crash in compiled code due to zero division because of widened CastII
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
* -Xcomp -XX:CompileOnly=TestDeadPathManyDeadDataNodes::test1
* -XX:CompileCommand=quiet
* -XX:CompileCommand=inline,TestDeadPathManyDeadDataNodes::inlined1
* -XX:MaxRecursiveInlineLevel=1000 -XX:MaxInlineLevel=1000
* -XX:-TieredCompilation -XX:+AlwaysIncrementalInline
* -XX:+DelayAfterInliningCutoff -XX:+IncrementalInlineForceCleanup
* -XX:NodeCountInliningCutoff=100000 -XX:+StressIGVN
* ${test.main.class}
* @run main ${test.main.class}
*/
package compiler.c2;
public class TestDeadPathManyDeadDataNodes {
private static int field;
private static boolean boolField2;
private static int arrayLengthField;
public static void main(String[] args) {
Object o = new Object();
try {
test1(false, 0);
} catch (NegativeArraySizeException nase) {
}
}
private static int test1(boolean boolParam, int intParam) {
int length;
int res = 0;
length = -1;
for (int i = 0; i < 2; i++) {
if (boolParam) {
field = 42;
}
int[] array = new int[length];
arrayLengthField = array.length;
while(true) {
Object o = new Object();
int arrayLength = arrayLengthField;
arrayLengthField = 0;
switch (intParam) {
case 0:
if (boolField2) {
break;
}
field = 42;
continue;
case 1:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 2:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 3:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 4:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 5:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 6:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 7:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 8:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 9:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 10:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 11:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 12:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 13:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 14:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 15:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 16:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 17:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 18:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 19:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 20:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 21:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 22:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 23:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 24:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 25:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 26:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 27:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 28:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 29:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 30:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 31:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 32:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 33:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 34:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 35:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 36:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 37:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 38:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 39:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 40:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 41:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 42:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 43:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 44:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 45:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 46:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 47:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 48:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 49:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 50:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 51:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 52:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 53:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 54:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 55:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 56:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 57:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 58:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 59:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 60:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 61:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 62:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 63:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 64:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 65:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 66:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 67:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 68:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 69:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 70:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 71:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 72:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 73:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 74:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 75:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 76:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 77:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 78:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 79:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 80:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 81:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 82:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 83:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 84:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 85:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 86:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 87:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 88:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 89:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 90:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 91:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 92:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 93:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 94:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 95:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 96:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 97:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
case 98:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
continue;
case 99:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
continue;
default:
res += inlined1(boolParam, intParam/100, arrayLength, 92);
continue;
}
field = 42;
break;
}
length = lastInlined();
}
return res;
}
static int lastInlined() {
return -1;
}
static int inlined1(boolean boolParam, int intParam, int arrayLength, int count) {
int res = 0;
switch (intParam) {
case 0:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 1:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 2:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 3:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 4:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 5:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 6:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 7:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 8:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 9:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 10:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 11:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 12:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 13:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 14:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 15:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 16:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 17:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 18:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 19:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 20:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 21:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 22:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 23:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 24:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 25:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 26:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 27:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 28:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 29:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 30:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 31:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 32:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 33:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 34:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 35:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 36:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 37:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 38:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 39:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 40:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 41:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 42:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 43:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 44:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 45:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 46:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 47:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 48:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 49:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 50:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 51:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 52:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 53:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 54:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 55:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 56:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 57:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 58:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 59:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 60:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 61:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 62:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 63:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 64:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 65:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 66:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 67:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 68:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 69:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 70:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 71:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 72:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 73:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 74:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 75:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 76:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 77:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 78:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 79:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 80:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 81:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 82:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 83:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 84:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 85:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 86:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 87:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 88:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 89:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 90:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 91:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 92:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 93:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 94:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 95:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 96:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 97:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
case 98:
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
case 99:
if (boolParam) {
res += arrayLength * 2;
}
field = 42;
return res;
default:
if (count == 0) {
if (boolParam) {
res += arrayLength * 1;
}
field = 42;
return res;
} else {
return inlined1(boolParam, intParam / 100, arrayLength, count-1);
}
}
}
}