On 7/9/2026 8:57 AM, Richard Sandiford wrote:
> r17-629-g582adc3c97b1e0 shrank cselib_val::hash to 30 bits in order
> to free up two bits for new flags. However, I hadn't realised that
> cselib_hash_rtx uses zero as an error return and so requires the hash
> to be nonzero. In the PR, trimming the hash to 30 bits had the effect
> of dropping the only nonzero bits, leading cselib_lookup_1 to fail even
> when the "create" parameter was true.
>
> Rather than fight against the system, it seemed better to restore the
> hash to 32 bits and get the space another way: by moving the uid field
> from cselib_val to the u2 field of the VALUE rtx. This slightly
> complicates some uses and slightly simplifies others.
>
> There is currently a 1:1 mapping between VALUEs and cselib_vals.
> The only time val_rtx is set is in new_cselib_val:
>
> e->val_rtx = (rtx_def*) value_pool.allocate ();
>
> and the only times CSELIB_VAL_PTR is set are in new_cselib_val:
>
> CSELIB_VAL_PTR (e->val_rtx) = e;
>
> and discard_useless_values:
>
> CSELIB_VAL_PTR (v->val_rtx) = NULL;
>
> If in future we allowed multiple VALUEs to point to the same cselib_val
> (e.g. for canonical_cselib_val), we would need to copy CSELIB_VAL_UID at
> the same time as copying CSELIB_VAL_PTR.
>
> Bootstrapped & regression-tested on x86_&4-linux-gnu, powerpc64le-linux-gnu
> and aarch64-linux-gnu. OK to install?
>
> Richard
>
>
> gcc/
> PR debug/126169
> * rtl.h (rtx_def::u2): Add value_uid to the union.
> (CSELIB_VAL_UID): New macro.
> * cselib.h (cselib_val::HASH_MASK): Delete.
> (cselib_val::hash): Restore to a full int.
> (cselib_val::uid): Delete.
> (canonical_cselib_val): Use CSELIB_VAL_UID instead of cselib_val::uid.
> * alias.cc (refs_newer_value_p): Likewise.
> * dse.cc (canon_address): Likewise.
> * print-rtl.cc (rtx_writer::print_rtx_operand_code_0): Likewise.
> * var-tracking.cc (dv_uid, canon_value_cmp): Likewise.
> (variable_post_merge_new_vals): Likewise.
> * cselib.cc (new_elt_loc_list, new_cselib_val): Likewise.
> (cselib_lookup): Likewise.
> (cselib_find_slot): Remove use of cselib_val::HASH_MASK.
> ---
>
OK
jeff