From b64a4110b33c91694536e096cc2570f8e87c596e Mon Sep 17 00:00:00 2001 From: Tobias Hartmann Date: Tue, 5 Jul 2016 07:57:09 +0200 Subject: [PATCH] 8159129: TestStringIntrinsicRangeChecks fails w/ No exception thrown for compressByte/inflateByte Need to convert char offsets to byte offsets before range check. Reviewed-by: vlivanov --- hotspot/src/share/vm/opto/library_call.cpp | 22 ++++++++++--------- .../TestStringIntrinsicRangeChecks.java | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index ffcddf60111..e8f6d7622df 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -1403,18 +1403,20 @@ bool LibraryCallKit::inline_string_copy(bool compress) { (!compress && src_elem == T_BYTE && (dst_elem == T_BYTE || dst_elem == T_CHAR)), "Unsupported array types for inline_string_copy"); - // Range checks - generate_string_range_check(src, src_offset, length, compress && src_elem == T_BYTE); - generate_string_range_check(dst, dst_offset, length, !compress && dst_elem == T_BYTE); - if (stopped()) { - return true; + // Convert char[] offsets to byte[] offsets + bool convert_src = (compress && src_elem == T_BYTE); + bool convert_dst = (!compress && dst_elem == T_BYTE); + if (convert_src) { + src_offset = _gvn.transform(new LShiftINode(src_offset, intcon(1))); + } else if (convert_dst) { + dst_offset = _gvn.transform(new LShiftINode(dst_offset, intcon(1))); } - // Convert char[] offsets to byte[] offsets - if (compress && src_elem == T_BYTE) { - src_offset = _gvn.transform(new LShiftINode(src_offset, intcon(1))); - } else if (!compress && dst_elem == T_BYTE) { - dst_offset = _gvn.transform(new LShiftINode(dst_offset, intcon(1))); + // Range checks + generate_string_range_check(src, src_offset, length, convert_src); + generate_string_range_check(dst, dst_offset, length, convert_dst); + if (stopped()) { + return true; } Node* src_start = array_element_address(src, src_offset, src_elem); diff --git a/hotspot/test/compiler/intrinsics/string/TestStringIntrinsicRangeChecks.java b/hotspot/test/compiler/intrinsics/string/TestStringIntrinsicRangeChecks.java index d4e1fb0b40c..7c93f1405b6 100644 --- a/hotspot/test/compiler/intrinsics/string/TestStringIntrinsicRangeChecks.java +++ b/hotspot/test/compiler/intrinsics/string/TestStringIntrinsicRangeChecks.java @@ -30,7 +30,7 @@ * @library /compiler/patches /testlibrary /test/lib / * @build java.base/java.lang.Helper * @build compiler.intrinsics.string.TestStringIntrinsicRangeChecks - * @run main compiler.intrinsics.string.TestStringIntrinsicRangeChecks + * @run main/othervm -Xbatch -XX:CompileThreshold=100 -XX:-TieredCompilation compiler.intrinsics.string.TestStringIntrinsicRangeChecks */ package compiler.intrinsics.string;