optimize ICF refinement and COMDAT handling

Cache immutable section and relocation metadata before color refinement,
then reuse generated-tagged concurrent tables.

Parallelize grouping and fold marking.

Include associative COMDAT descendants in contribution hashes and
canonicalize relocation targets to selected COMDAT leaders.
This commit is contained in:
Nikita Smith
2026-07-27 14:47:19 -07:00
committed by Ryan Fleury
parent abfea7c33a
commit b84d32d9fb
6 changed files with 659 additions and 263 deletions
+17 -1
View File
@@ -34,6 +34,23 @@ void_list_push(Arena *arena, VoidList *list, void *v)
return n;
}
internal void
u32_list_push_node(U32List *list, U32Node *n)
{
SLLQueuePush(list->first, list->last, n);
list->count += 1;
}
internal U32Node *
u32_list_push(Arena *arena, U32List *list, U32 data)
{
U32Node *n = push_array(arena, U32Node, 1);
n->next = 0;
n->data = data;
u32_list_push_node(list, n);
return n;
}
internal void
u64_list_push_node(U64List *list, U64Node *n)
{
@@ -264,4 +281,3 @@ s64_array_from_list(Arena *arena, S64List *list)
for EachNode(n, S64Node, list->first) { result.v[result.count++] = n->v; }
return result;
}
+4 -1
View File
@@ -9,6 +9,7 @@ typedef struct U64Node { U64 data; struct U64Node *next; } U64Node;
typedef struct S64Node { S64 v; struct S64Node *next; } S64Node;
typedef struct VoidList { U64 count; VoidNode *first, *last; } VoidList;
typedef struct U32List { U64 count; U32Node *first, *last; } U32List;
typedef struct U64List { U64 count; U64Node *first, *last; } U64List;
typedef struct S64List { U64 count; S64Node *first, *last; } S64List;
@@ -20,6 +21,9 @@ internal U64 void_list_count_nodes (VoidNode *head);
internal void void_node_concat (VoidNode **head, VoidNode *node);
internal void void_node_concat_atomic(VoidNode **head, VoidNode *node);
internal void u32_list_push_node (U32List *list, U32Node *n);
internal U32Node * u32_list_push (Arena *arena, U32List *list, U32 v);
internal void u64_list_push_node (U64List *list, U64Node *n);
internal U64Node * u64_list_push (Arena *arena, U64List *list, U64 v);
internal void u64_list_concat_in_place(U64List *list, U64List *to_concat);
@@ -44,4 +48,3 @@ internal void s64_list_push_node (S64List *list, S64Node *n);
internal S64Node * s64_list_push (Arena *arena, S64List *list, S64 v);
internal void s64_list_concat_in_place(S64List *list, S64List *to_concat);
internal S64Array s64_array_from_list (Arena *arena, S64List *list);