changeset 57514:d50867368bac

8229855: C2 fails with assert(false) failed: bad AD file Summary: Strengthen the check to ensure that both control and data paths die consistently. Reviewed-by: vlivanov, roland
author thartmann
date Mon, 13 Jan 2020 13:37:01 +0100
parents 231089800e42
children b42b794ac348
files src/hotspot/share/opto/parse2.cpp test/hotspot/jtreg/compiler/c2/TestJumpTable.java
diffstat 2 files changed, 65 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/share/opto/parse2.cpp	Mon Jan 13 10:50:31 2020 +0100
+++ b/src/hotspot/share/opto/parse2.cpp	Mon Jan 13 13:37:01 2020 +0100
@@ -1048,11 +1048,11 @@
       // if there is a higher range, test for it and process it:
       if (mid < hi && !eq_test_only) {
         // two comparisons of same values--should enable 1 test for 2 branches
-        // Use BoolTest::le instead of BoolTest::gt
+        // Use BoolTest::lt instead of BoolTest::gt
         float cnt = sum_of_cnts(lo, mid-1);
-        IfNode *iff_le  = jump_if_fork_int(key_val, test_val, BoolTest::le, if_prob(cnt, total_cnt), if_cnt(cnt));
-        Node   *iftrue  = _gvn.transform( new IfTrueNode(iff_le) );
-        Node   *iffalse = _gvn.transform( new IfFalseNode(iff_le) );
+        IfNode *iff_lt  = jump_if_fork_int(key_val, test_val, BoolTest::lt, if_prob(cnt, total_cnt), if_cnt(cnt));
+        Node   *iftrue  = _gvn.transform( new IfTrueNode(iff_lt) );
+        Node   *iffalse = _gvn.transform( new IfFalseNode(iff_lt) );
         { PreserveJVMState pjvms(this);
           set_control(iffalse);
           jump_switch_ranges(key_val, mid+1, hi, switch_depth+1);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/compiler/c2/TestJumpTable.java	Mon Jan 13 13:37:01 2020 +0100
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2020, 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.
+ */
+
+/**
+ * @test
+ * @bug 8229855
+ * @summary Test jump table with key value that gets out of bounds after loop unrolling.
+ * @run main/othervm -XX:CompileCommand=dontinline,compiler.c2.TestJumpTable::test*
+ *                   -Xbatch -XX:-TieredCompilation -XX:-UseSwitchProfiling
+ *                   compiler.c2.TestJumpTable
+ */
+
+package compiler.c2;
+
+public class TestJumpTable {
+
+    public static int test() {
+        int res = 0;
+        for (int i = 10; i < 50; ++i) {
+            switch (i * 5) {
+                case 15:
+                case 25:
+                case 40:
+                case 101:
+                    return 42;
+                case 45:
+                case 51:
+                case 60:
+                    res++;
+                    break;
+            }
+        }
+        return res;
+    }
+
+    public static void main(String[] args) {
+        for (int i = 0; i < 20_000; ++i) {
+            test();
+        }
+    }
+}