From db1017a36a9f99a43c93f57091c387472896382c Mon Sep 17 00:00:00 2001 From: Tim Besard Date: Fri, 25 Sep 2026 15:05:33 +0200 Subject: [PATCH 1/2] CI: test on released Julia 1.13 and assert builds of master Julia 1.13 has been released, so test on it instead of the 1.13 nightly, and run the back-end tests on it. Also re-enable testing against assert builds of Julia master, which are available again from the julia-ci pipeline, to catch issues with the upcoming 1.14 early. Co-Authored-By: Claude Opus 5.5 --- .buildkite/downstream.yml | 10 +++++----- .github/workflows/GetAsserts.yml | 4 ++-- .github/workflows/Test.yml | 2 +- .github/workflows/TestAsserts.yml | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.buildkite/downstream.yml b/.buildkite/downstream.yml index f0a928c2..e635ca5e 100644 --- a/.buildkite/downstream.yml +++ b/.buildkite/downstream.yml @@ -8,7 +8,7 @@ steps: - label: "CUDA.jl" plugins: - JuliaCI/julia#v1: - version: "1.12" + version: "1.13" - JuliaCI/julia-coverage#v1: codecov: true command: | @@ -42,7 +42,7 @@ steps: - label: "oneAPI.jl" plugins: - JuliaCI/julia#v1: - version: "1.12" + version: "1.13" - JuliaCI/julia-coverage#v1: codecov: true command: | @@ -75,7 +75,7 @@ steps: - label: "AMDGPU.jl" plugins: - JuliaCI/julia#v1: - version: "1.12" + version: "1.13" - JuliaCI/julia-coverage#v1: codecov: true command: | @@ -104,7 +104,7 @@ steps: - label: "Metal.jl" plugins: - JuliaCI/julia#v1: - version: "1.12" + version: "1.13" - JuliaCI/julia-coverage#v1: codecov: true command: | @@ -144,7 +144,7 @@ steps: - label: "OpenCL.jl" plugins: - JuliaCI/julia#v1: - version: "1.12" + version: "1.13" - JuliaCI/julia-coverage#v1: codecov: true command: | diff --git a/.github/workflows/GetAsserts.yml b/.github/workflows/GetAsserts.yml index d06fead8..40bcf88b 100644 --- a/.github/workflows/GetAsserts.yml +++ b/.github/workflows/GetAsserts.yml @@ -26,8 +26,8 @@ jobs: strategy: fail-fast: false matrix: - # NOTE: 'master' is currently disabled; keep in sync with TestAsserts - version: ['1.12', '1.13'] + # keep in sync with TestAsserts + version: ['1.12', '1.13', 'master'] build: ['x86_64-linux-gnuassert'] steps: # Only checks out the base branch (never PR code) diff --git a/.github/workflows/Test.yml b/.github/workflows/Test.yml index 8c74b012..d109d59c 100644 --- a/.github/workflows/Test.yml +++ b/.github/workflows/Test.yml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - version: ['1.10', '1.11', '1.12', '1.13-nightly', 'nightly'] + version: ['1.10', '1.11', '1.12', '1.13', 'nightly'] os: [ubuntu-24.04, ubuntu-24.04-arm, macOS-15, windows-2025] llvm_args: [''] include: diff --git a/.github/workflows/TestAsserts.yml b/.github/workflows/TestAsserts.yml index 129e50bd..857a2a0e 100644 --- a/.github/workflows/TestAsserts.yml +++ b/.github/workflows/TestAsserts.yml @@ -32,7 +32,7 @@ jobs: with: script: | // Keep in sync with the matrix below - const versions = ['1.12', '1.13']; + const versions = ['1.12', '1.13', 'master']; await Promise.all(versions.map(version => github.rest.checks.create({ owner: context.repo.owner, @@ -55,7 +55,7 @@ jobs: strategy: fail-fast: false matrix: - version: ['1.12', '1.13'] + version: ['1.12', '1.13', 'master'] steps: - name: Download Julia build uses: actions/download-artifact@v8 @@ -97,7 +97,7 @@ jobs: with: script: | // Keep in sync with the matrix above - const versions = ['1.12', '1.13']; + const versions = ['1.12', '1.13', 'master']; const jobs = await github.paginate(github.rest.actions.listJobsForWorkflowRunAttempt, { owner: context.repo.owner, repo: context.repo.repo, @@ -136,7 +136,7 @@ jobs: with: script: | // Keep in sync with the matrix above - const versions = ['1.12', '1.13']; + const versions = ['1.12', '1.13', 'master']; await Promise.all(versions.map(version => github.rest.checks.create({ owner: context.repo.owner, From 03a8d3d860e982940a304299f26a7197d596aea0 Mon Sep 17 00:00:00 2001 From: Tim Besard Date: Fri, 25 Sep 2026 15:26:35 +0200 Subject: [PATCH 2/2] Remove the field-aware write barriers of Julia 1.14 JuliaLang/julia#62737 replaced `julia.write_barrier` with `julia.object_write_barrier` and `julia.field_write_barrier.p11/.p13`. Only the former was removed by GPULowerGCFrame, so the new intrinsics survived into device code whenever an object was stored into a field, e.g. when constructing a LazyString in an error path. Co-Authored-By: Claude Opus 5.5 --- src/optim.jl | 9 ++++++--- test/ptx.jl | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/optim.jl b/src/optim.jl index 3c1d6408..3b01e23d 100644 --- a/src/optim.jl +++ b/src/optim.jl @@ -571,9 +571,12 @@ function (self::LowerGCFrame)(fun::LLVM.Function) @compiler_assert isempty(uses(alloc_obj)) self.job end - # we don't care about write barriers - if haskey(functions(mod), "julia.write_barrier") - barrier = functions(mod)["julia.write_barrier"] + # we don't care about write barriers. Julia 1.14 replaced `julia.write_barrier` with + # object and field-aware variants, the latter specialized on the slot address space. + for name in ("julia.write_barrier", "julia.object_write_barrier", + "julia.field_write_barrier.p11", "julia.field_write_barrier.p13") + haskey(functions(mod), name) || continue + barrier = functions(mod)[name] for use in uses(barrier) call = user(use)::LLVM.CallInst diff --git a/test/ptx.jl b/test/ptx.jl index 6f018708..7140d631 100644 --- a/test/ptx.jl +++ b/test/ptx.jl @@ -481,6 +481,25 @@ end @check_not "gpu_gc_pool_alloc" PTX.code_native(mod.ref_kernel, Tuple{Ptr{Int64}, Int}) end + + # storing a heap object into a field of another one emits a write barrier + # (split into object and field-aware variants on Julia 1.14) + mod = @eval module $(gensym()) + mutable struct Outer + x::Any + end + + function store_field(outer, inner) + outer.x = inner + nothing + end + end + + @test @filecheck begin + @check_label "define void @{{(julia|j)_store_field_[0-9]+}}" + @check_not "write_barrier" + PTX.code_llvm(mod.store_field, Tuple{mod.Outer, Base.RefValue{Int}}) + end end @testset "float boxes" begin