8211698: Crash in C2 compiled code during execution of double array heavy processing code

Correctly registered new Opaque4Node in add_range_check_predicate

Reviewed-by: roland, thartmann
This commit is contained in:
Rahul Raghavan 2018-12-18 19:13:54 +05:30
parent 2fa6333113
commit 5a6385b363
5 changed files with 62 additions and 6 deletions

View File

@ -3469,8 +3469,7 @@ void Compile::final_graph_reshaping_main_switch(Node* n, Final_Reshape_Counts& f
}
case Op_CmpUL: {
if (!Matcher::has_match_rule(Op_CmpUL)) {
// We don't support unsigned long comparisons. Set 'max_idx_expr'
// to max_julong if < 0 to make the signed comparison fail.
// No support for unsigned long comparisons
ConINode* sign_pos = new ConINode(TypeInt::make(BitsPerLong - 1));
Node* sign_bit_mask = new RShiftLNode(n->in(1), sign_pos);
Node* orl = new OrLNode(n->in(1), sign_bit_mask);

View File

@ -2289,9 +2289,9 @@ Node* PhaseIdealLoop::add_range_check_predicate(IdealLoopTree* loop, CountedLoop
register_new_node(opaque_bol, predicate_proj);
IfNode* new_iff = NULL;
if (overflow) {
new_iff = new IfNode(predicate_proj, bol, PROB_MAX, COUNT_UNKNOWN);
new_iff = new IfNode(predicate_proj, opaque_bol, PROB_MAX, COUNT_UNKNOWN);
} else {
new_iff = new RangeCheckNode(predicate_proj, bol, PROB_MAX, COUNT_UNKNOWN);
new_iff = new RangeCheckNode(predicate_proj, opaque_bol, PROB_MAX, COUNT_UNKNOWN);
}
register_control(new_iff, loop->_parent, predicate_proj);
Node* iffalse = new IfFalseNode(new_iff);

View File

@ -302,7 +302,7 @@ public:
void set_slp_max_unroll(int unroll_factor) { _slp_maximum_unroll_factor = unroll_factor; }
int slp_max_unroll() const { return _slp_maximum_unroll_factor; }
virtual LoopNode* skip_strip_mined(int expect_opaq = 1);
virtual LoopNode* skip_strip_mined(int expect_skeleton = 1);
OuterStripMinedLoopNode* outer_loop() const;
virtual IfTrueNode* outer_loop_tail() const;
virtual OuterStripMinedLoopEndNode* outer_loop_end() const;

View File

@ -1367,7 +1367,7 @@ static void kill_dead_code( Node *dead, PhaseIterGVN *igvn ) {
igvn->C->remove_range_check_cast(cast);
}
if (dead->Opcode() == Op_Opaque4) {
igvn->C->remove_range_check_cast(dead);
igvn->C->remove_opaque4_node(dead);
}
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
bs->unregister_potential_barrier_node(dead);

View File

@ -0,0 +1,57 @@
/*
* Copyright (c) 2018, Oracle and/or its affiliates. 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 8211698
* @summary Crash in C2 compiled code during execution of double array heavy processing code
*
* @run main/othervm -XX:CompileOnly=Test8211698.test Test8211698
*
*/
public class Test8211698 {
public static void main(String[] args) {
Test8211698 issue = new Test8211698();
for (int i = 0; i < 10000; i++) {
issue.test();
}
}
public void test() {
int[] iarr1 = new int[888];
for (int i = 5; i > 0; i--) {
for (int j = 0; j <= i - 1; j++) {
int istep = 2 * j - i;
int iadj = 0;
if (istep < 0) {
iadj = iarr1[-istep];
} else {
iadj = iarr1[istep];
}
}
}
}
}