Skip to content

Adapt to dynamic side metadata address#299

Open
qinsoon wants to merge 8 commits intommtk:masterfrom
qinsoon:dynamic-side-metadata-address
Open

Adapt to dynamic side metadata address#299
qinsoon wants to merge 8 commits intommtk:masterfrom
qinsoon:dynamic-side-metadata-address

Conversation

@qinsoon
Copy link
Copy Markdown
Member

@qinsoon qinsoon commented Mar 1, 2026

No description provided.

@qinsoon
Copy link
Copy Markdown
Member Author

qinsoon commented Mar 2, 2026

julia-version
JULIA_REPO=qinsoon/julia
JULIA_REF=no-const-side-metadata-address

@qinsoon
Copy link
Copy Markdown
Member Author

qinsoon commented Apr 7, 2026

Tried with 3 benchmarks from Julia's GCBenchmarks (tree_mutable, tree_immutable and a ported gcbench). This PR slows down the total time by roughly 1%.

I tried a few optimizations for the write barrier fastpath. However, I didn't observe any speed up.

  1. Generate a load for the side metadata base address only when we are generating images; otherwise for JIT, we simply emit the address as a constant.
  2. Use LLVM's invariant load (assuming the loaded address is always the same)
Value *metadata_base_ptr;
if (jl_generating_output()) {
    F.getParent()->getOrInsertGlobal("MMTK_SIDE_LOG_BIT_BASE_ADDRESS", i8_ptr_ty);
    auto metadata_base_global = F.getParent()->getNamedGlobal("MMTK_SIDE_LOG_BIT_BASE_ADDRESS");
    assert(metadata_base_global != nullptr);
    auto metadata_base_load = builder.CreateAlignedLoad(
        i8_ptr_ty, metadata_base_global, Align(sizeof(void *)), "mmtk_side_log_bit_base");
    metadata_base_load->setMetadata(llvm::LLVMContext::MD_tbaa, get_tbaa_const(F.getContext()));
    metadata_base_load->setMetadata(llvm::LLVMContext::MD_invariant_load,
                                    llvm::MDNode::get(F.getContext(), {}));
    metadata_base_ptr = builder.CreateAlignedLoad(
        i8_ptr_ty,
        metadata_base_global,
        Align(sizeof(void *)),
        "mmtk_side_log_bit_base");
} else {
    intptr_t metadata_base_address = reinterpret_cast<intptr_t>(MMTK_SIDE_LOG_BIT_BASE_ADDRESS);
    auto metadata_base_val = ConstantInt::get(intptr_ty, metadata_base_address);
    metadata_base_ptr = ConstantExpr::getIntToPtr(metadata_base_val, PointerType::get(i8_ty, 0));
}

@mmtkgc-bot mmtkgc-bot enabled auto-merge (squash) April 16, 2026 05:46
@qinsoon qinsoon disabled auto-merge April 17, 2026 00:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants