)]}'
{
  "commit": "5ceedc614663fd4096e4acc0055a2cbb0bf534c8",
  "tree": "69547a5b7f16a4fe8dde29eedfafd2897d47c826",
  "parents": [
    "df4d249cc5542cbb5331e8745a96b44fc7d65853"
  ],
  "author": {
    "name": "Vitaly Goldshteyn",
    "email": "goldvitaly@google.com",
    "time": "Sat Oct 17 07:29:34 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Wed Oct 21 01:14:45 2026 -0700"
  },
  "message": "Optimize transfer_unprobed_elements_to_next_capacity_fn to reduce binary size.\n\n1. Simplify TryFindNewIndexWithoutProbing:\n   - Take `hash` directly and compute `h1 \u003d H1(hash)` internally.\n   - Replace `index_diff \u003d old_index - h1; in_floating_group_index \u003d index_diff \u0026 (Group::kWidth - 1); index_diff -\u003d in_floating_group_index; if ((index_diff \u0026 old_capacity) \u003d\u003d 0)` with `index_diff \u003d (old_index - h1) \u0026 old_capacity; if (index_diff \u003c Group::kWidth)`.\n   - Previously, LLVM reassociated `((index_diff - (index_diff \u0026 15)) \u0026 old_capacity) \u003d\u003d 0` into `((old_index - h1) \u0026 (old_capacity \u0026 ~15)) \u003d\u003d 0`, hoisting `old_capacity \u0026 ~15` into an extra loop-invariant register across the entire loop and exhausting all GPRs around `new_g.MaskNonFull()`.\n   - Using `(old_index - h1) \u0026 old_capacity \u003c Group::kWidth` reuses `old_capacity` directly, avoids an extra `\u0026 15` mask when computing `(h1 + index_diff) \u0026 new_capacity`, and frees a loop-invariant register.\n\n2. Pass `old_capacity` to transfer_unprobed_elements_to_next_capacity_fn and align parameters with GrowToNextCapacity:\n   - Eliminates decoding `common.capacity()` in every template instantiation of `transfer_unprobed_elements_to_next_capacity_fn`.\n   - Passing `old_capacity` (used in 4 places across both outer and inner loops) allows `new_capacity \u003d NextCapacity(old_capacity)` (only used in `and` masks) to be spilled to the stack as a memory operand when register pressure is high (e.g., `std::string`).\n\n3. Pass `hash` instead of `(h2, h1)` to `encode_probed_element`:\n   - Avoids keeping `H2(hash)` live across `TryFindNewIndexWithoutProbing` and into the cold `encode_probed_element` path; `H2(hash)` is now computed only when storing to `new_ctrl[new_index]`.\n   - Reduces argument setup instructions at the `encode_probed_element` call site (`old_index` is already in `%rdx`, the 3rd argument register).\n   - Allows the 8-byte and 16-byte `ProbedItem` encoder lambdas to pack `(source_offset \u003c\u003c 7) | H2(hash)` with a single `shldq $0x7, %rsi, %rdx` instruction.\n\nPiperOrigin-RevId: 1001466539\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "374ab9ba4a3db74fd7fc7a7fc701c0f235428c49",
      "old_mode": 33188,
      "old_path": "absl/container/internal/raw_hash_set.cc",
      "new_id": "ecf438d9ca4f7aa369d716d1d3ef1fa270149be0",
      "new_mode": 33188,
      "new_path": "absl/container/internal/raw_hash_set.cc"
    },
    {
      "type": "modify",
      "old_id": "ad7965243686e1f38d9b4a3df1bd5a866986129f",
      "old_mode": 33188,
      "old_path": "absl/container/internal/raw_hash_set.h",
      "new_id": "497078cce7206acada19f216e6545af330babbea",
      "new_mode": 33188,
      "new_path": "absl/container/internal/raw_hash_set.h"
    }
  ]
}
