mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-02 14:38:28 +00:00
8247824: CTW: C2 (Shenandoah) compilation fails with SEGV in SBC2Support::pin_and_expand
Reviewed-by: rkennke, thartmann
This commit is contained in:
parent
d5ae932b3f
commit
05dc2af21f
@ -1083,11 +1083,12 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) {
|
||||
Node* barrier = state->enqueue_barrier(i);
|
||||
Node* ctrl = phase->get_ctrl(barrier);
|
||||
IdealLoopTree* loop = phase->get_loop(ctrl);
|
||||
if (loop->_head->is_OuterStripMinedLoop()) {
|
||||
Node* head = loop->head();
|
||||
if (head->is_OuterStripMinedLoop()) {
|
||||
// Expanding a barrier here will break loop strip mining
|
||||
// verification. Transform the loop so the loop nest doesn't
|
||||
// appear as strip mined.
|
||||
OuterStripMinedLoopNode* outer = loop->_head->as_OuterStripMinedLoop();
|
||||
OuterStripMinedLoopNode* outer = head->as_OuterStripMinedLoop();
|
||||
hide_strip_mined_loop(outer, outer->unique_ctrl_out()->as_CountedLoop(), phase);
|
||||
}
|
||||
}
|
||||
@ -1289,11 +1290,12 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) {
|
||||
ShenandoahLoadReferenceBarrierNode* lrb = state->load_reference_barrier(i);
|
||||
Node* ctrl = phase->get_ctrl(lrb);
|
||||
IdealLoopTree* loop = phase->get_loop(ctrl);
|
||||
if (loop->_head->is_OuterStripMinedLoop()) {
|
||||
Node* head = loop->head();
|
||||
if (head->is_OuterStripMinedLoop()) {
|
||||
// Expanding a barrier here will break loop strip mining
|
||||
// verification. Transform the loop so the loop nest doesn't
|
||||
// appear as strip mined.
|
||||
OuterStripMinedLoopNode* outer = loop->_head->as_OuterStripMinedLoop();
|
||||
OuterStripMinedLoopNode* outer = head->as_OuterStripMinedLoop();
|
||||
hide_strip_mined_loop(outer, outer->unique_ctrl_out()->as_CountedLoop(), phase);
|
||||
}
|
||||
}
|
||||
|
||||
@ -485,6 +485,7 @@ public:
|
||||
Node *_head; // Head of loop
|
||||
Node *_tail; // Tail of loop
|
||||
inline Node *tail(); // Handle lazy update of _tail field
|
||||
inline Node *head(); // Handle lazy update of _head field
|
||||
PhaseIdealLoop* _phase;
|
||||
int _local_loop_unroll_limit;
|
||||
int _local_loop_unroll_factor;
|
||||
@ -1579,6 +1580,13 @@ inline Node* IdealLoopTree::tail() {
|
||||
return _tail;
|
||||
}
|
||||
|
||||
inline Node* IdealLoopTree::head() {
|
||||
// Handle lazy update of _head field.
|
||||
if (_head->in(0) == NULL) {
|
||||
_head = _phase->get_ctrl(_head);
|
||||
}
|
||||
return _head;
|
||||
}
|
||||
|
||||
// Iterate over the loop tree using a preorder, left-to-right traversal.
|
||||
//
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2020, 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 8247824
|
||||
* @summary CTW: C2 (Shenandoah) compilation fails with SEGV in SBC2Support::pin_and_expand
|
||||
* @requires vm.flavor == "server"
|
||||
* @requires vm.gc.Shenandoah & !vm.graal.enabled
|
||||
*
|
||||
* @run main/othervm -XX:-BackgroundCompilation -XX:+UseShenandoahGC -XX:LoopMaxUnroll=0 TestShenandoahLRBInOuterStripMinedLoop
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class TestShenandoahLRBInOuterStripMinedLoop {
|
||||
public static void main(String[] args) {
|
||||
A[] array = new A[4000];
|
||||
Arrays.fill(array, new A());
|
||||
for (int i = 0; i < 20_0000; i++) {
|
||||
test(array);
|
||||
}
|
||||
}
|
||||
|
||||
private static int test(A[] array) {
|
||||
A a = null;
|
||||
int v = 1;
|
||||
A b = null;
|
||||
for (int i = 0; i < 2000; i++) {
|
||||
a = array[i];
|
||||
b = array[2*i];
|
||||
v *= 2;
|
||||
}
|
||||
return a.f + b.f + v;
|
||||
}
|
||||
|
||||
private static class A {
|
||||
public int f;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user