Ai
1 Star 0 Fork 24

Benshuai5D/openjdk-21

forked from src-openEuler/openjdk-21
关闭
 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
Backport-JDK-8340532-C2-assert-is_OuterStripMinedLoo.patch 4.43 KB
一键复制 编辑 原始数据 按行查看 历史
Benshuai5D 提交于 2025-07-21 22:07 +08:00 . sync master to openEuler-24.03-LTS
Subject: [PATCH] Backport JDK-8340532: C2: assert(is_OuterStripMinedLoop())
failed: invalid node class: IfTrue
---
src/hotspot/share/opto/ifnode.cpp | 8 +++
src/hotspot/share/opto/loopTransform.cpp | 1 -
.../TestIdenticalDominatingCLE.java | 66 +++++++++++++++++++
3 files changed, 74 insertions(+), 1 deletion(-)
create mode 100644 test/hotspot/jtreg/compiler/loopstripmining/TestIdenticalDominatingCLE.java
diff --git a/src/hotspot/share/opto/ifnode.cpp b/src/hotspot/share/opto/ifnode.cpp
index f63f4ae80..f0e1b154d 100644
--- a/src/hotspot/share/opto/ifnode.cpp
+++ b/src/hotspot/share/opto/ifnode.cpp
@@ -1494,6 +1494,14 @@ Node* IfNode::Ideal(PhaseGVN *phase, bool can_reshape) {
Node* prev_dom = search_identical(dist);
if (prev_dom != nullptr) {
+ // Dominating CountedLoopEnd (left over from some now dead loop) will become the new loop exit. Outer strip mined
+ // loop will go away. Mark this loop as no longer strip mined.
+ if (is_CountedLoopEnd()) {
+ CountedLoopNode* counted_loop_node = as_CountedLoopEnd()->loopnode();
+ if (counted_loop_node != nullptr) {
+ counted_loop_node->clear_strip_mined();
+ }
+ }
// Replace dominated IfNode
return dominated_by(prev_dom, igvn, false);
}
diff --git a/src/hotspot/share/opto/loopTransform.cpp b/src/hotspot/share/opto/loopTransform.cpp
index e35657cd1..bb9a54919 100644
--- a/src/hotspot/share/opto/loopTransform.cpp
+++ b/src/hotspot/share/opto/loopTransform.cpp
@@ -717,7 +717,6 @@ void PhaseIdealLoop::do_peeling(IdealLoopTree *loop, Node_List &old_new) {
#endif
}
}
- Node* entry = head->in(LoopNode::EntryControl);
// Step 1: Clone the loop body. The clone becomes the peeled iteration.
// The pre-loop illegally has 2 control users (old & new loops).
diff --git a/test/hotspot/jtreg/compiler/loopstripmining/TestIdenticalDominatingCLE.java b/test/hotspot/jtreg/compiler/loopstripmining/TestIdenticalDominatingCLE.java
new file mode 100644
index 000000000..371c0fb2b
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/loopstripmining/TestIdenticalDominatingCLE.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2024, 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 8340532
+ * @summary C2: assert(is_OuterStripMinedLoop()) failed: invalid node class: IfTrue
+ * @requires vm.compiler2.enabled
+ * @run main/othervm -XX:CompileOnly=TestIdenticalDominatingCLE::* -XX:CompileThreshold=100 -Xcomp -XX:-TieredCompilation
+ * -XX:-RangeCheckElimination -XX:LoopMaxUnroll=0 TestIdenticalDominatingCLE
+ *
+ */
+
+
+public class TestIdenticalDominatingCLE {
+ boolean bFld;
+ long lFld;
+ float[][] fArr = new float[6][6];
+
+ public static void main(String[] var0) {
+ TestIdenticalDominatingCLE t = new TestIdenticalDominatingCLE();
+ t.test();
+ }
+
+ void test() {
+ int i = 0;
+ do {
+ for (int j = 0; j < 2; j++) {
+ float f = fArr[j][3] / Float.valueOf((float)1.318095814E9);
+ switch (i) {
+ case 1:
+ if (bFld ^ bFld) {
+ } else {
+ for (int k = 0; k < 600; k++) {
+ }
+ }
+ break;
+ default:
+ if (bFld) {
+ }
+ }
+ }
+ lFld = ++i;
+ } while (i < 6);
+ }
+}
--
2.48.1
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhangyunbo7/openjdk-21.git
git@gitee.com:zhangyunbo7/openjdk-21.git
zhangyunbo7
openjdk-21
openjdk-21
openEuler-24.03-LTS

搜索帮助