RFR: 8335221: Some C2 intrinsics incorrectly assume that type argument is compile-time constant [v2]

Christian Hagedorn chagedorn at openjdk.org
Fri Jun 28 09:24:21 UTC 2024


On Thu, 27 Jun 2024 23:25:28 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:

>> Problems were found in some C2 intrinsics while testing Leyden Early Release.
>> 
>> [`inline_array_partition()`](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/library_call.cpp#L5493) and [`inline_array_sort()`](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/library_call.cpp#L5559) intrinsics incorrectly assume that `elementType` argument is always compile-time constant. Which is not true for Leyden (and in general) when constant folding optimization is switched off (or did not executed for particular type).
>> 
>> Note, other intrinsics are very careful about that. For example, see [`inline_Class_cast()`](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/library_call.cpp#L3963) intrinsic.
>> 
>> Add similar checks to `inline_array_partition()` and `inline_array_sort()`.
>> 
>> An other problem is that `null_check()` (which adds new control nodes to graph) was executed in these intrinsics before bailouts from intrinsic generation. We hit next assert if bailout happens:
>> 
>>   assert(ctrl == kit.control(), "Control flow was added although the intrinsic bailed out");
>> 
>> 
>> I moved `null_check()` after bailouts.
>> 
>> An other issue with `null_check()` is it checks for `null` first argument which is `Class`. It can't be `null` because corresponding Java methods are `private` and each call site passed `<primitive_type>.class` as first argument.
>> For example: [DualPivotQuicksort.java#L260](https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/DualPivotQuicksort.java#L260)
>> On other hand there is no null check for passed array (second argument). I changed `null_check()` for array.
>> 
>> These 2 intrinsics were added by [JDK-8309130](https://bugs.openjdk.org/browse/JDK-8309130) in JDK 22.
>> 
>> Testing tier1-6, hs-stress, hs-xcomp
>
> Vladimir Kozlov has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Move common checks into shared method

Marked as reviewed by chagedorn (Reviewer).

src/hotspot/share/opto/library_call.cpp line 5494:

> 5492: // Common checks for array sorting intrinsics arguments.
> 5493: // Returns `true` if checks passed.
> 5494: bool LibraryCallKit::check_array_sort_arguments(Node* elementType, Node* obj, BasicType* bt) {

Thanks for doing the update, looks good! Just one small detail: You could use a reference here instead of a pointer. Then you can pass `bt` in and modify it directly.

-------------

PR Review: https://git.openjdk.org/jdk/pull/19918#pullrequestreview-2147467577
PR Review Comment: https://git.openjdk.org/jdk/pull/19918#discussion_r1658411420


More information about the hotspot-compiler-dev mailing list