RFR: 8324655: Identify integer minimum and maximum patterns created with if statements [v2]

Emanuel Peter epeter at openjdk.org
Wed Feb 7 09:25:53 UTC 2024


On Fri, 26 Jan 2024 16:05:45 GMT, Jasmine Karthikeyan <jkarthikeyan at openjdk.org> wrote:

>> Hi all, I've created this patch which aims to convert common integer mininum and maximum patterns created using if statements into Min and Max nodes. These patterns are usually in the form of `a > b ? a : b` and similar, as well as patterns such as `if (a > b) b = a;`. While this transform doesn't generally improve code generation it's own, it simplifies control flow and creates new opportunities for vectorization.
>> 
>> I've created a benchmark for the PR, and I've attached some data from my (Zen 3) machine:
>> 
>>                                                 Baseline                     Patch            Improvement
>> Benchmark                   Mode   Cnt  Score      Error  Units    Score       Error  Units
>> IfMinMax.testReductionInt   avgt   15  500.307 ±  16.687  ns/op    509.383 ±  32.645  ns/op   (no change)*
>> IfMinMax.testReductionLong  avgt   15  493.184 ±  17.596  ns/op    513.587 ±  28.339  ns/op   (no change)*
>> IfMinMax.testSingleInt      avgt   15    3.588 ±   0.540  ns/op      2.965 ±   1.380  ns/op   (no change)
>> IfMinMax.testSingleLong     avgt   15    3.673 ±   0.128  ns/op      3.506 ±   0.590  ns/op   (no change)
>> IfMinMax.testVectorInt      avgt   15  340.425 ±  13.123  ns/op     59.689 ±   7.509  ns/op   + 5.7x
>> IfMinMax.testVectorLong     avgt   15  326.420 ±  15.554  ns/op    117.190 ±   5.622  ns/op   + 2.8x
>> 
>> 
>> * After writing this benchmark I discovered that the compiler doesn't seem to create some simple min/max reductions, even when using Math.min/max() directly. Is this known or should I create a followup RFE for this?
>> 
>> The patch passes tier 1-3 testing on linux x64. Reviews or comments would be appreciated!
>
> Jasmine Karthikeyan has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Don't transform highly predictable branches

Yes, you would certainly run into this:
[JDK-8307516](https://bugs.openjdk.org/browse/JDK-8307516): C2 SuperWord: reconsider Reduction heuristic for UnorderedReduction

I'll get to it eventually, hopefully in the next few months.

Feel free to make this change (hack), and see if that would get you the desired results:

diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp
index dd3f1d10dee..781458f4fd9 100644
--- a/src/hotspot/share/opto/superword.cpp
+++ b/src/hotspot/share/opto/superword.cpp
@@ -1987,7 +1987,7 @@ bool SuperWord::profitable(Node_List* p) {
   if (is_marked_reduction(p0)) {
     Node* second_in = p0->in(2);
     Node_List* second_pk = my_pack(second_in);
- if ((second_pk == nullptr) || (_num_work_vecs == _num_reductions)) {
+ if (second_pk == nullptr) {
       // Unmark reduction if no parent pack or if not enough work
       // to cover reduction expansion overhead
       _loop_reductions.remove(p0->_idx);

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

PR Comment: https://git.openjdk.org/jdk/pull/17574#issuecomment-1931612799


More information about the hotspot-compiler-dev mailing list