Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
8247824: CTW: C2 (Shenandoah) compilation fails with SEGV in SBC2Supp…
…ort::pin_and_expand

Reviewed-by: rkennke, thartmann
  • Loading branch information
rwestrel committed Jun 18, 2020
1 parent d5ae932 commit 05dc2af21fb0afffee6c42443f5c960d84df28ac
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 4 deletions.
@@ -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 @@ class IdealLoopTree : public ResourceObj {
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;
}
}

0 comments on commit 05dc2af

Please sign in to comment.