RFR: 8347459: C2: missing transformation for chain of shifts/multiplications by constants [v4]
Damon Fenacci
dfenacci at openjdk.org
Wed Feb 26 16:36:58 UTC 2025
On Tue, 25 Feb 2025 12:59:21 GMT, Marc Chevalier <duke at openjdk.org> wrote:
>> This collapses double shift lefts by constants in a single constant: (x << con1) << con2 => x << (con1 + con2). Care must be taken in the case con1 + con2 is bigger than the number of bits in the integer type. In this case, we must simplify to 0.
>>
>> Moreover, the simplification logic of the sign extension trick had to be improved. For instance, we use `(x << 16) >> 16` to convert a 32 bits into a 16 bits integer, with sign extension. When storing this into a 16-bit field, this can be simplified into simple `x`. But in the case where `x` is itself a left-shift expression, say `y << 3`, this PR makes the IR looks like `(y << 19) >> 16` instead of the old `((y << 3) << 16) >> 16`. The former logic didn't handle the case where the left and the right shift have different magnitude. In this PR, I generalize this simplification to cases where the left shift has a larger magnitude than the right shift. This improvement was needed not to miss vectorization opportunities: without the simplification, we have a left shift and a right shift instead of a single left shift, which confuses the type inference.
>>
>> This also works for multiplications by powers of 2 since they are already translated into shifts.
>>
>> Thanks,
>> Marc
>
> Marc Chevalier has updated the pull request incrementally with one additional commit since the last revision:
>
> comment
Cool improvement @marc-chevalier! Thanks a lot!
test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java line 255:
> 253: res[0] = (short) (a[0] << 3);
> 254: return res;
> 255: }
In the comment of method `StoreNode::Ideal_sign_extended_input` you mention shifting left by more than 24. Do you think it would be possible to have a test for that case too (shifting left by more than 16 in this case I guess)?
-------------
PR Review: https://git.openjdk.org/jdk/pull/23728#pullrequestreview-2645128722
PR Review Comment: https://git.openjdk.org/jdk/pull/23728#discussion_r1971942835
More information about the hotspot-compiler-dev
mailing list