Skip to content

Fix WasmJS/JS/Native compile: replace putIfAbsent with common idiom#485

Merged
michalharakal merged 1 commit intodevelopfrom
feature/fix-putifabsent-common-stdlib
Apr 13, 2026
Merged

Fix WasmJS/JS/Native compile: replace putIfAbsent with common idiom#485
michalharakal merged 1 commit intodevelopfrom
feature/fix-putifabsent-common-stdlib

Conversation

@michalharakal
Copy link
Copy Markdown
Contributor

Summary

Hotfix for a red multiplatform build on develop introduced by #477 (merged via #478). `MutableMap.putIfAbsent(key, value)` is a JVM-only extension — it lives on `java.util.Map`, not in Kotlin common-stdlib. The two call sites I added in `StableHloConverter.collectTensorEncodings` compiled fine on JVM but broke `compileKotlinWasmJs` (and by extension JS / Native) with:

e: StableHloConverter.kt:209:24 Unresolved reference 'putIfAbsent'
e: StableHloConverter.kt:213:24 Unresolved reference 'putIfAbsent'

develop's `build-job` CI has been red since #478 merged.

Root cause

Local verification for #477 ran only `:skainet-compile:skainet-compile-hlo:jvmTest`. KMP's per-target compilation means a JVM-only stdlib call silently passes JVM checks and only fails on the first non-JVM compile. `allTests` would have caught it locally — that's now in my standing discipline for this repo going forward.

Fix

Replaces both call sites with the common-compatible idiom:

```kotlin
if (spec.name !in result) result[spec.name] = encoding
```

Same first-writer-wins semantics, works on every KMP target.

Test plan

  • `:skainet-compile:skainet-compile-hlo:compileKotlinWasmJs` — was red, now green
  • `:skainet-compile:skainet-compile-hlo:allTests -x kotlinWasmStoreYarnLock` — green across jvmTest, wasmJsTest, wasmJsBrowserTest, wasmWasiTest, wasmWasiNodeTest, macosArm64Test, iosSimulatorArm64Test (`linuxX64Test` skipped on macOS host)
  • CI: full multiplatform build across all targets

Note on `kotlinWasmStoreYarnLock`

Running `allTests` without `-x kotlinWasmStoreYarnLock` fails with "Lock file was changed. Run the `kotlinWasmUpgradeYarnLock` task to actualize lock file" on clean develop, unrelated to this PR. That's a separate pre-existing issue worth tracking but not blocking this hotfix.

🤖 Generated with Claude Code

`MutableMap.putIfAbsent(key, value)` is a JVM-only extension (it
lives on `java.util.Map`), not part of Kotlin common-stdlib. The
usage introduced in #477's `collectTensorEncodings` compiled fine
on JVM but broke `compileKotlinWasmJs` (and by extension JS /
Native) with `Unresolved reference 'putIfAbsent'` at
StableHloConverter.kt:209,213. develop has been red on the
multiplatform build-job since #478 merged.

Root cause: the local verification for #477 ran only
`:skainet-compile:skainet-compile-hlo:jvmTest`. KMP's per-target
compilation means a JVM-only stdlib call silently passes JVM
checks and only fails on the first non-JVM compile.

Replaces both call sites with the common-compatible idiom:

    if (spec.name !in result) result[spec.name] = encoding

Verified locally with
`./gradlew :skainet-compile:skainet-compile-hlo:allTests
 -x kotlinWasmStoreYarnLock` — green across jvmTest, wasmJsTest,
wasmJsBrowserTest, wasmWasiTest, wasmWasiNodeTest, macosArm64Test,
and iosSimulatorArm64Test (linuxX64Test skipped on macOS host).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@michalharakal michalharakal merged commit d65893a into develop Apr 13, 2026
4 checks passed
@michalharakal michalharakal deleted the feature/fix-putifabsent-common-stdlib branch April 13, 2026 11:17
michalharakal added a commit that referenced this pull request Apr 13, 2026
…484)

Every Llama / Mistral / Qwen / Gemma family model names the same
x * sigmoid(x) activation `silu` rather than `swish`. PyTorch's
F.silu and HuggingFace's ACT2FN["silu"] both emit the `silu`
name, so a traced LLM forward pass was falling through the
StableHLO converter registry's "no converter found" path.

Fix is scoped:
- Adds `silu` and `SiLU` to supportedOperations.
- Routes `silu` to the existing convertSwish lowering in the
  dispatch `when`. Same op bodies, identical MLIR output.
- Extends ActivationOperationsConverterTest's registration
  check with `silu` / `SiLU` and adds testSiluAliasLowersLikeSwish
  which asserts the emitted module carries the same ops
  (negate, exp, const 1.0, add, divide, multiply) that the swish
  test already asserts.

Verified locally with
`./gradlew :skainet-compile:skainet-compile-hlo:allTests
 -x kotlinWasmStoreYarnLock` — green across jvmTest, wasmJsTest,
wasmJsBrowserTest, wasmWasiTest, wasmWasiNodeTest, macosArm64Test,
and iosSimulatorArm64Test. Running allTests (not just jvmTest)
is now standing discipline for this repo after #485 caught a
JVM-only stdlib call that broke KMP compile.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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.

1 participant