Skip to content

perf(allocator): mark ReplaceWith panic path cold#24515

Merged
graphite-app[bot] merged 1 commit into
mainfrom
codex/cold-replace-with-panic-path
Jul 17, 2026
Merged

perf(allocator): mark ReplaceWith panic path cold#24515
graphite-app[bot] merged 1 commit into
mainfrom
codex/cold-replace-with-panic-path

Conversation

@camc314

@camc314 camc314 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Mark ReplaceWith's write_dummy helper as #[cold].

The helper is only reached while unwinding from a panic in a replacer closure. Telling the optimizer that this path is cold may encourage it to place it in the "cold" section of the binary.

@camc314
camc314 requested a review from overlookmotel as a code owner July 14, 2026 15:30
Copilot AI review requested due to automatic review settings July 14, 2026 15:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions github-actions Bot added the A-allocator Area - Allocator label Jul 14, 2026
@camc314 camc314 changed the title perf(allocator): mark ReplaceWith panic path cold perf(allocator): mark ReplaceWith panic path cold Jul 14, 2026
@codspeed-hq

codspeed-hq Bot commented Jul 14, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 62 untouched benchmarks
⏩ 9 skipped benchmarks1


Comparing codex/cold-replace-with-panic-path (64d70f7) with main (ca4a4a7)

Open in CodSpeed

Footnotes

  1. 9 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@overlookmotel

Copy link
Copy Markdown
Member

I don't think this makes any difference. #[inline(never)] is already present, for this exact reason.

And, as far as I know, #[cold] primarily affects branch layout. But in this case, there's no branch to hint - write_dummy is called from drop unconditionally.

But why ReplaceWith seems to have had a small negative perf effect in transformer (at least according to Codspeed) is a mystery to me, so I may well be wrong.

What is Mr Codex telling you?

@overlookmotel

overlookmotel commented Jul 14, 2026

Copy link
Copy Markdown
Member

Oh actually, I'm pretty sure this cannot account for the perf drop. Our benchmarks are built with panic = "abort", so all the drop guard code is deleted by compiler anyway. Whether it's marked #[cold] or not is irrelevant to the perf change - it must be, because that code isn't there at all in the assembly.

Whether it's a good idea regardless, I don't fully know. I don't think so. But I imagine you have info that contradicts my assumptions, which motivated this PR. I'd like to know what it is!

@camc314

camc314 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

Whether it's a good idea regardless, I don't fully know. I don't think so. But I imagine you have info that contradicts my assumptions, which motivated this PR. I'd like to know what it is!

See my msg in Gchat for the actual replace with perf problem.

This was unrelated that i noticed, from my (admittedly limited understanding)

For cold:

Place it in a separate “cold” section of the binary.
  • Optimize for smaller code rather than speed.
  • Assume branches leading to it are unlikely.
  • Improve instruction-cache locality for the hot path.

whereas inline never just discourages inlining.

But, both of these are just suggestions to the compiler!

@overlookmotel overlookmotel added the 0-merge Merge with Graphite Merge Queue label Jul 15, 2026

overlookmotel commented Jul 15, 2026

Copy link
Copy Markdown
Member

Merge activity

  • Jul 15, 3:38 PM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Jul 15, 3:38 PM UTC: overlookmotel added this pull request to the Graphite merge queue.
  • Jul 15, 3:44 PM UTC: The Graphite merge queue couldn't merge this PR because it was not satisfying all requirements (Failed CI: 'Test NAPI Compiler').
  • Jul 17, 7:07 AM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Jul 17, 7:07 AM UTC: overlookmotel added this pull request to the Graphite merge queue.
  • Jul 17, 7:12 AM UTC: Merged by the Graphite merge queue.

graphite-app Bot pushed a commit that referenced this pull request Jul 15, 2026
## Summary

Mark ReplaceWith's write_dummy helper as cold.

The helper is only reached while unwinding from a panic in a replacer closure. Telling the optimizer that this path is cold helps keep its allocator and dummy-construction code out of hot code layout and improves inlining decisions in unwind builds.
@graphite-app
graphite-app Bot force-pushed the codex/cold-replace-with-panic-path branch from 64d70f7 to 7ca9575 Compare July 15, 2026 15:39
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Jul 15, 2026
@overlookmotel overlookmotel added the 0-merge Merge with Graphite Merge Queue label Jul 17, 2026
## Summary

Mark ReplaceWith's write_dummy helper as cold.

The helper is only reached while unwinding from a panic in a replacer closure. Telling the optimizer that this path is cold helps keep its allocator and dummy-construction code out of hot code layout and improves inlining decisions in unwind builds.
@graphite-app
graphite-app Bot force-pushed the codex/cold-replace-with-panic-path branch from 7ca9575 to c35d8ab Compare July 17, 2026 07:08
@overlookmotel

Copy link
Copy Markdown
Member

I updated PR description to reflect the salient change that adding #[cold] actually makes (or at least what we think it does based on our incomplete knowledge).

@graphite-app
graphite-app Bot merged commit c35d8ab into main Jul 17, 2026
35 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Jul 17, 2026
@graphite-app
graphite-app Bot deleted the codex/cold-replace-with-panic-path branch July 17, 2026 07:12
camc314 added a commit that referenced this pull request Jul 21, 2026
### 💥 BREAKING CHANGES

- 54cc121 ast: [**BREAKING**] Split `MetaProperty` into `ImportMeta` and
`NewTarget` (#24557) (camc314)

### 🚀 Features

- 4c71560 parser: More friendly error for spread element in dynamic
imports (#24705) (sapphi-red)
- 7b045cd minfier: Drop last break from last switch case (#24673)
(Armano)
- 7d3c178 minifier: Remove unreachable recursive functions (#24125)
(Dunqing)
- 94f99b3 ast: Allow `NONE` to be passed to AST builder methods where
`Option<ArenaVec>` is expected (#24629) (overlookmotel)
- 77230c5 ast: Accept arrays for `ArenaVec` params of AST builder
methods (#24621) (overlookmotel)
- f08b152 allocator: Implement `FromIn` for array to `Vec` conversion
(#24620) (overlookmotel)
- 2338c13 track-memory-allocations: Track heap deallocs, alloc bytes,
and peak growth (#24619) (Boshen)
- 7aa4739 syntax,transformer: Move JSX entity decoder to `oxc_syntax`
(#24617) (camc314)
- 2b097c4 str: Export `Str` as `ArenaStr` (#24604) (overlookmotel)
- 3acf4c1 minifier: Expand switch optimiation to remove empty cases
(#24520) (Armano)
- 129b759 parser: Improve diagnostics for unparenthesized LHS on
exponential expr (#24569) (camc314)
- 4d0c601 minifier: Fold arithmetic over undefined and null operands
(#24485) (Dunqing)
- 91541dd minifier: Drop empty switch statements  (#24527) (Armano)
- d05224d ast_visit: Generate VisitJs visitor that skips TypeScript
type-space (#24499) (Boshen)
- 3d22307 parser: Add `ParseOptions::enable_ident_hashes` (#24491)
(Boshen)

### 🐛 Bug Fixes

- 64c2241 minifier: Align class heritage removal with assumptions
(#24533) (Dunqing)
- 48b59f4 parser: Span ambient generator diagnostics (#24711) (camc314)
- e750a82 ecmascript: Fix false negative for may_have_side_effects on
dynamic property access (#24709) (sapphi-red)
- f145d73 minifier: Guard reordered identifier reads (#24698) (Dunqing)
- a2ef382 isolated-declarations: Reject `window.Symbol` as global symbol
reference (#24689) (camc314)
- b1bcf72 minifier: Invalidate facts for redeclared bindings (#24658)
(Dunqing)
- 921b834 minifier: Don't treat a conditionally-assigned var as
write-once (#24650) (Dunqing)
- 061af1f minifier: Avoid stale pure function summaries (#24636)
(Dunqing)
- 40c2f43 allocator: `Vec::from_array_in` do not allocate zero-length
array (#24628) (overlookmotel)
- 70994ae codegen: Preserve comments before expression operands (#24510)
(Dunqing)
- 7b4baff parser: Reject new import member access (#23459) (camc314)
- 128b385 minifier: Clippy warning with no-debug-assertions (#24547)
(camc314)
- 8421feb parser: Use first `as` span for imported name (#24537)
(leaysgur)
- c517aa0 parser: Reject invalid accessor assertions (#24504) (camc314)

### ⚡ Performance

- 884d9eb parser: Pre-size cover-grammar assignment target buffers
(#24683) (Boshen)
- d3f07a0 diagnostics: Box OxcDiagnosticInner to reduce binary size
(#24665) (Boshen)
- bcc9de0 parser: Defer diagnostic creation until parse exit (#24663)
(Boshen)
- c35d8ab allocator: Mark `ReplaceWith` panic path cold (#24515)
(camc314)
- ba65790 semantic, allocator: Branchless `clone_in` for semantic IDs
(#24564) (overlookmotel)
- 747feec parser: Build AST nodes with the AST builder instead of
cloning (#24540) (Boshen)
- ba35a0d react_compiler: Use IndexVec for dense id-keyed maps (#24549)
(Boshen)
- b685062 react_compiler: Keep small hot-path collections inline
(#24514) (Marius Schulz)
- a149e95 transformer: Outline rare expression exits (#24512) (camc314)
- 7808a6e react_compiler: Make aliasing effects cheap to intern and
clone (#24506) (Marius Schulz)
- 3a36f2a react_compiler: Store AbstractValue reasons as a u16 bitmask
(#24480) (Boshen)
- 1c96753 react_compiler: Use FxHashMap for the lookup-only aliasing
node map (#24490) (Boshen)

Co-authored-by: Cameron <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-allocator Area - Allocator

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants