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