RFR: 8346664: C2: Optimize mask check with constant offset [v17]
Emanuel Peter
epeter at openjdk.org
Wed Feb 5 08:19:20 UTC 2025
On Wed, 5 Feb 2025 08:02:21 GMT, Emanuel Peter <epeter at openjdk.org> wrote:
>> Matthias Ernst has updated the pull request incrementally with one additional commit since the last revision:
>>
>> jlong, not long
>
> src/hotspot/share/opto/mulnode.cpp line 2102:
>
>> 2100: // (AndL (ConL (_ << #N)) #M)
>> 2101: // The M and N values must satisfy ((-1 << N) & M) == 0.
>> 2102: static bool AndIL_is_zero_element_under_mask(const PhaseGVN* phase, const Node* expr, const Node* mask, BasicType bt) {
>
> Suggestion:
>
> // Checks whether expr is neutral element (zero) under mask. We have:
> // (AndX expr mask)
> // The X in AndX must be I or L, depending on bt.
> //
> // We split the bits of expr into MSB and LSB, where LSB represents
> // all trailing zeros of expr:
> // MSB LSB
> // xxxxxx 0000000000
> //
> // We check if the mask has no one bits in the corresponding higher
> // bits, i.e. if the number of trailing zeros is larger or equal to the
> // bit width of the expr, i.e. if the number of leading zeros for mask
> // is greater or equal to the number of bits in MSB:
> // 000000 00000yyyyy -> (AndX expr mask) = 0 -> return true
> // 0000yy yyyyyyyyyy -> (AndX expr mask) = 0000zz 0000000000 -> return false
> //
> static bool AndIL_is_zero_element_under_mask(const PhaseGVN* phase, const Node* expr, const Node* mask, BasicType bt) {
I would leave any details about `addition` to the use of this function, and any discussion how we find the trailing zeros to `AndIL_min_trailing_zeros`. Otherwise it's a little confusing.
It's nice to have examples, and give the reader an intuition of what you are doing in the logic below.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/22856#discussion_r1942403973
More information about the hotspot-compiler-dev
mailing list