Skip to content

Codegen introspection misleading foratomic_max! #59645

@jakobnissen

Description

@jakobnissen

On 1.12-rc2

julia> @code_llvm debuginfo=:none Threads.atomic_max!(Threads.Atomic{Int}(0), 1)
; Function Signature: atomic_max!(Base.Threads.Atomic{Int64}, Int64)
define i64 @"julia_atomic_max!_3804"(ptr noundef nonnull align 8 dereferenceable(8) %"x::Atomic", i64 signext %"v::Int64") #0 {
top:
  %rv.i = atomicrmw max ptr %"x::Atomic", i64 %"v::Int64" acq_rel, align 8
  ret i64 %rv.i
}

On master:

julia> @code_llvm debuginfo=:none Threads.atomic_max!(Threads.Atomic{Int}(0), 1)
; Function Signature: atomic_max!(Base.Threads.Atomic{Int64}, Int64)
define i64 @"julia_atomic_max!_1385"(ptr noundef nonnull align 8 dereferenceable(8) %"x::Atomic", i64 signext %"v::Int64") local_unnamed_addr #0 {
top:
  %0 = load atomic i64, ptr %"x::Atomic" unordered, align 8
  br label %atomicrmw.start

atomicrmw.start:                                  ; preds = %atomicrmw.start, %top
  %loaded = phi i64 [ %0, %top ], [ %newloaded, %atomicrmw.start ]
  %1 = call fastcc i64 @j_max_1387(i64 signext %loaded, i64 signext %"v::Int64")
  %2 = cmpxchg ptr %"x::Atomic", i64 %loaded, i64 %1 acq_rel monotonic, align 8
  %success = extractvalue { i64, i1 } %2, 1
  %newloaded = extractvalue { i64, i1 } %2, 0
  br i1 %success, label %atomicrmw.end, label %atomicrmw.start

atomicrmw.end:                                    ; preds = %atomicrmw.start
  ret i64 %newloaded
}

The generated native (x86-64) code is also worse.
Possibly caused by #57010

Metadata

Metadata

Assignees

No one assigned

    Labels

    observabilitymetrics, timing, understandability, reflection, logging, ...

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions