Skip to content

Commit a8abe60

Browse files
maleadtclaude
andcommitted
Fix three token ordering memory model bugs.
1. ACQUIRE_TOKEN_KEY was updated for all atomics instead of only acquire/acq_rel-ordered ones, over-constraining relaxed atomics. 2. has_acquire effect was set unconditionally for all atomics in compute_block_memory_effects!, causing unnecessary token carries. 3. ALIAS_UNIVERSE was treated as overlapping with nothing instead of everything, potentially missing token dependencies for unknown aliases. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 96c06e0 commit a8abe60

1 file changed

Lines changed: 14 additions & 7 deletions

File tree

src/compiler/codegen/passes/token_order.jl

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,12 @@ function compute_block_memory_effects!(block::Block, alias_result::Dict{Any, Ali
9393
mem_effect == MEM_NONE && continue
9494
alias_set = get_alias_set_for_operand(alias_result, first(operands))
9595
effects.effects[alias_set] = max(get(effects.effects, alias_set, MEM_NONE), mem_effect)
96-
# Track acquire ordering for atomics
96+
# Track acquire ordering for acquire/acq_rel atomics only
9797
if is_atomic_intrinsic(resolved_func)
98-
effects = MemoryEffects(effects.effects, true)
98+
mo = extract_memory_order(resolved_func, operands)
99+
if has_acquire_order(mo)
100+
effects = MemoryEffects(effects.effects, true)
101+
end
99102
end
100103
end
101104
end
@@ -129,8 +132,8 @@ function collect_join_tokens_ir(token_key::TokenKey, token_map::Dict{TokenKey, A
129132
should_join = other_key.role == LAST_OP
130133
end
131134
if other_key.role == token_key.role
132-
alias_overlap = !(other_key.alias_set isa AliasUniverse) &&
133-
!(token_key.alias_set isa AliasUniverse) &&
135+
alias_overlap = (other_key.alias_set isa AliasUniverse) ||
136+
(token_key.alias_set isa AliasUniverse) ||
134137
!isempty(intersect(other_key.alias_set, token_key.alias_set))
135138
should_join = should_join || alias_overlap
136139
end
@@ -155,10 +158,14 @@ end
155158

156159
function has_release_order(memory_order)
157160
memory_order === nothing && return false
158-
# MemoryOrder enum: Release=3, AcqRel=4
159161
return memory_order === MemoryOrder.Release || memory_order === MemoryOrder.AcqRel
160162
end
161163

164+
function has_acquire_order(memory_order)
165+
memory_order === nothing && return false
166+
return memory_order === MemoryOrder.Acquire || memory_order === MemoryOrder.AcqRel
167+
end
168+
162169
"""
163170
extract_memory_order(resolved_func, operands) -> Union{MemoryOrder.T, Nothing}
164171
@@ -304,8 +311,8 @@ function transform_statement!(sci::StructuredIRCode, block::Block, ssa_idx::Int,
304311
token_map[last_op_key(alias_set)] = result_token
305312
token_map[last_store_key(alias_set)] = result_token
306313

307-
# Atomics with acquire semantics update the ACQUIRE token
308-
if is_atomic_intrinsic(resolved_func)
314+
# Only acquire/acq_rel atomics update the ACQUIRE token
315+
if is_atomic_intrinsic(resolved_func) && has_acquire_order(memory_order)
309316
token_map[ACQUIRE_TOKEN_KEY] = result_token
310317
end
311318
end

0 commit comments

Comments
 (0)