From d2a63f259e0708cc87058cb8053e65c536adc0a2 Mon Sep 17 00:00:00 2001 From: Roland Westrelin Date: Tue, 30 Mar 2021 07:58:49 +0000 Subject: [PATCH] 8264360: Loop strip mining verification fails with "should be on the backedge" Reviewed-by: kvn, thartmann --- src/hotspot/share/opto/loopnode.cpp | 2 +- .../TestLoadOnBackedgeWithPrec.java | 71 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 test/hotspot/jtreg/compiler/loopstripmining/TestLoadOnBackedgeWithPrec.java diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index be986f26052..304b6385b3d 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -1807,7 +1807,7 @@ void LoopNode::verify_strip_mined(int expect_skeleton) const { for (DUIterator_Fast jmax, j = be->fast_outs(jmax); j < jmax; j++) { Node* n = be->fast_out(j); if (n->is_Load()) { - assert(n->in(0) == be, "should be on the backedge"); + assert(n->in(0) == be || n->find_prec_edge(be) > 0, "should be on the backedge"); do { n = n->raw_out(0); } while (!n->is_Phi()); diff --git a/test/hotspot/jtreg/compiler/loopstripmining/TestLoadOnBackedgeWithPrec.java b/test/hotspot/jtreg/compiler/loopstripmining/TestLoadOnBackedgeWithPrec.java new file mode 100644 index 00000000000..e998e984558 --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopstripmining/TestLoadOnBackedgeWithPrec.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2021, 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 8264360 + * @summary Loop strip mining verification fails with "should be on the backedge" + * + * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation TestLoadOnBackedgeWithPrec + * + */ + + +class a { + int g = 20; + float h = 2; + long b = 6; +} + +public class TestLoadOnBackedgeWithPrec { + int c ; + a[] i = {new a()}; + float j() { + a k = new a(); + float l = 5; + for (int d = 0; d < 8; ++d) { + for (int e = 0; e < 9; ++e) { + k = k; + l *= k.g; + } + for (int f = 0; f < 9; ++f) { + new a(); + } + { + a[] m = { + new a(), new a(), new a(), + new a(), new a(), new a(), + new a(), new a(), new a()}; + c = i[0].g + k.g; + } + } + return k.h; + } + public static void main(String[] args) { + TestLoadOnBackedgeWithPrec n = new TestLoadOnBackedgeWithPrec(); + for (int i = 0; i < 5_000; i++) { + n.j(); + } + } +} +