RFR: 8343685: C2 SuperWord: refactor VPointer with MemPointer [v4]

Vladimir Kozlov kvn at openjdk.org
Wed Jan 15 06:43:24 UTC 2025


On Tue, 14 Jan 2025 08:08:58 GMT, Emanuel Peter <epeter at openjdk.org> wrote:

>> Hmm, that is tricky here:
>> 
>> // We use two comparisons, because a subtraction could underflow.
>> #define RETURN_CMP_VALUE_IF_NOT_EQUAL(a, b) \
>>   if (a < b) { return -1; }                 \
>>   if (a > b) { return  1; }
>> 
>> The macro only returns if we get a non-equal case. But it does not return when the values are equal.
>> 
>> This is helpful in code where there are repeated comparisons, and we want to only return once we have a non-equal.
>> 
>> Example:
>> 
>>   RETURN_CMP_VALUE_IF_NOT_EQUAL(a_con, b_con);
>> 
>>   RETURN_CMP_VALUE_IF_NOT_EQUAL(a->original_index(), b->original_index());
>> 
>> We first compare the `con`, but if they are the same we do not return but compare the `original_index`.
>> 
>> It simplifies the code. But I suppose I can refactor it now, especially because I use the macro less often. Before refactoring it was something like:
>> 
>> -// To be in the same group, two VPointers must be the same,
>> -// except for the offset.
>> -int VPointer::cmp_for_sort_by_group(const VPointer** p1, const VPointer** p2) {
>> -  const VPointer* a = *p1;
>> -  const VPointer* b = *p2;
>> -
>> -  RETURN_CMP_VALUE_IF_NOT_EQUAL(a->base()->_idx,     b->base()->_idx);
>> -  RETURN_CMP_VALUE_IF_NOT_EQUAL(a->mem()->Opcode(),  b->mem()->Opcode());
>> -  RETURN_CMP_VALUE_IF_NOT_EQUAL(a->scale_in_bytes(), b->scale_in_bytes());
>> -
>> -  int a_inva_idx = a->invar() == nullptr ? 0 : a->invar()->_idx;
>> -  int b_inva_idx = b->invar() == nullptr ? 0 : b->invar()->_idx;
>> -  RETURN_CMP_VALUE_IF_NOT_EQUAL(a_inva_idx,          b_inva_idx);
>> -
>> -  return 0; // equal
>> -}
>
> Ok, this is my solution now:
> 
> +
> +    // We use two comparisons, because a subtraction could underflow.
> +    template <typename T>
> +    static int cmp_code(T a, T b) {
> +      if (a < b) { return -1; }
> +      if (a > b) { return  1; }
> +      return 0;
> +    }
> 
> 
> And use it like this:
> 
> +  int c_con = cmp_code(a_con, b_con);
> +  if (c_con != 0) { return c_con; }
> 
> Instead of
> `RETURN_CMP_VALUE_IF_NOT_EQUAL(a_con, b_con);`

Yes, it is better. We see when we return from method clear now.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/21926#discussion_r1916010403


More information about the hotspot-compiler-dev mailing list