OpenJDK / jdk / jdk
changeset 56882:586415e8abcb
8229694: JVM crash in SWPointer during C2 OSR compilation
Summary: Handle the case where there is only 1 pack and no operations left when calling SuperWord::find_align_to_ref() to find the best alignment again.
Reviewed-by: kvn, vlivanov, thartmann
author | chagedorn |
---|---|
date | Mon, 11 Nov 2019 10:41:03 +0100 |
parents | d595f1faace2 |
children | 01d47d511f5f |
files | src/hotspot/share/opto/superword.cpp test/hotspot/jtreg/compiler/loopopts/superword/AlignmentOnePack.java |
diffstat | 2 files changed, 81 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/share/opto/superword.cpp Sat Nov 09 10:27:53 2019 -0800 +++ b/src/hotspot/share/opto/superword.cpp Mon Nov 11 10:41:03 2019 +0100 @@ -699,24 +699,34 @@ // Put memory ops from remaining packs back on memops list for // the best alignment search. uint orig_msize = memops.size(); - for (int i = 0; i < _packset.length(); i++) { - Node_List* p = _packset.at(i); + if (_packset.length() == 1 && orig_msize == 0) { + // If there are no remaining memory ops and only 1 pack we have only one choice + // for the alignment + Node_List* p = _packset.at(0); + assert(p->size() > 0, "sanity"); MemNode* s = p->at(0)->as_Mem(); assert(!same_velt_type(s, mem_ref), "sanity"); - memops.push(s); + best_align_to_mem_ref = s; + } else { + for (int i = 0; i < _packset.length(); i++) { + Node_List* p = _packset.at(i); + MemNode* s = p->at(0)->as_Mem(); + assert(!same_velt_type(s, mem_ref), "sanity"); + memops.push(s); + } + best_align_to_mem_ref = find_align_to_ref(memops); + if (best_align_to_mem_ref == NULL) { + if (TraceSuperWord) { + tty->print_cr("SuperWord::find_adjacent_refs(): best_align_to_mem_ref == NULL"); + } + break; + } + best_iv_adjustment = get_iv_adjustment(best_align_to_mem_ref); + NOT_PRODUCT(find_adjacent_refs_trace_1(best_align_to_mem_ref, best_iv_adjustment);) + // Restore list. + while (memops.size() > orig_msize) + (void)memops.pop(); } - best_align_to_mem_ref = find_align_to_ref(memops); - if (best_align_to_mem_ref == NULL) { - if (TraceSuperWord) { - tty->print_cr("SuperWord::find_adjacent_refs(): best_align_to_mem_ref == NULL"); - } - break; - } - best_iv_adjustment = get_iv_adjustment(best_align_to_mem_ref); - NOT_PRODUCT(find_adjacent_refs_trace_1(best_align_to_mem_ref, best_iv_adjustment);) - // Restore list. - while (memops.size() > orig_msize) - (void)memops.pop(); } } // unaligned memory accesses
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/compiler/loopopts/superword/AlignmentOnePack.java Mon Nov 11 10:41:03 2019 +0100 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2019, 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 8229694 + * @summary Tests the case where there is only 1 pack and no operations left when calling SuperWord::find_align_to_ref() to find the best alignment again. + * + * @run main/othervm -Xbatch -XX:CompileCommand=compileonly,compiler.loopopts.superword.AlignmentOnePack::test + * compiler.loopopts.superword.AlignmentOnePack + */ + +package compiler.loopopts.superword; + +public class AlignmentOnePack { + static int iFld; + + public static void test(int[] intArr, short[] shortArr) { + for (int j = 8; j < intArr.length;j++) { + shortArr[10] = 10; + shortArr[j] = 30; + intArr[7] = 260; + intArr[j-1] = 400; + iFld = intArr[j]; + } + } + + public static void main(String[] args) throws Exception { + int[] a = new int[16]; + short[] c = new short[16]; + + for (int i = 0; i < 10000; i++) { + test(a, c); + } + } +}