8191153: assert(u_ctrl != blk1 && u_ctrl != blk2) failed: won't converge
authorroland
Mon, 27 Nov 2017 10:44:19 -0800
changeset 48131 235a18d659fc
parent 48130 998c88ae423a
child 48132 3c0ef95d12e3
child 48133 d851eb254409
8191153: assert(u_ctrl != blk1 && u_ctrl != blk2) failed: won't converge Summary: relax assert Reviewed-by: kvn
src/hotspot/share/opto/split_if.cpp
test/hotspot/jtreg/compiler/loopopts/TestSplitIfPinnedCMove.java
--- a/src/hotspot/share/opto/split_if.cpp	Fri Nov 10 10:30:42 2017 +0100
+++ b/src/hotspot/share/opto/split_if.cpp	Mon Nov 27 10:44:19 2017 -0800
@@ -169,7 +169,7 @@
               assert(u->in(1) == bol, "");
               // Get control block of either the CMove or the If input
               Node *u_ctrl = u->is_If() ? u->in(0) : get_ctrl(u);
-              assert(u_ctrl != blk1 && u_ctrl != blk2, "won't converge");
+              assert((u_ctrl != blk1 && u_ctrl != blk2) || u->is_CMove(), "won't converge");
               Node *x = bol->clone();
               register_new_node(x, u_ctrl);
               _igvn.replace_input_of(u, 1, x);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/compiler/loopopts/TestSplitIfPinnedCMove.java	Mon Nov 27 10:44:19 2017 -0800
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2017, Red Hat, Inc. 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 8191153
+ * @summary too strong assert from 8186125
+ *
+ * @run main/othervm -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestSplitIfPinnedCMove::not_inlined -XX:CompileOnly=TestSplitIfPinnedCMove::test TestSplitIfPinnedCMove
+ *
+ */
+
+public class TestSplitIfPinnedCMove {
+    static void not_inlined() {}
+
+    static class A {
+        A(int f) {
+            this.f = f;
+        }
+        int f;
+    }
+
+    static int test(int i1, int i3, A a1, A a2) {
+        // loops to trigger more loop optimization passes
+        int res = 0;
+        for (int i = 0; i < 2; i++) {
+            for (int j = 0; j < 2; j++) {
+                for (int k = 0; k < 2; k++) {
+                    res++;
+                }
+            }
+        }
+        // null check a1 and a2
+        res += a1.f + a2.f;
+
+        boolean f2 = false;
+        if (i1 > 0) {
+            not_inlined();
+            f2 = true;
+        }
+
+        // Should become CMoveP and be pinned here
+        res += (i3 > 0 ? a1 : a2).f;
+
+        // f2 should be split through phi with above if
+        if (f2) {
+            not_inlined();
+            res += 42;
+        }
+
+        // Another use for i3 > 0
+        if (i3 > 0) {
+            res++;
+        }
+        return res;
+    }
+
+    public static void main(String[] args) {
+        A a = new A(42);
+        for (int i = 0; i < 20_000; i++) {
+                test((i % 2) == 0 ? 0 : 1, (i % 2) == 0 ? 0 : 1, a, a);
+        }
+    }
+}