diff --git a/src/EGraphs/saturation.jl b/src/EGraphs/saturation.jl index 299dd8c8..5020ff32 100644 --- a/src/EGraphs/saturation.jl +++ b/src/EGraphs/saturation.jl @@ -144,14 +144,12 @@ end Instantiate argument for dynamic rule application in e-graph """ function instantiate_actual_param!(bindings, g::EGraph, i) + const_hash = v_pair_last(bindings[i]) + const_hash == 0 || return get_constant(g, const_hash) + ecid = v_pair_first(bindings[i]) - literal_position = reinterpret(Int, v_pair_last(bindings[i])) ecid <= 0 && error("unbound pattern variable") eclass = g[ecid] - if literal_position > 0 - @assert !v_isexpr(eclass[literal_position]) - return get_constant(g, v_head(eclass[literal_position])) - end return eclass end diff --git a/src/ematch_compiler.jl b/src/ematch_compiler.jl index 6225f9a1..e06290e3 100644 --- a/src/ematch_compiler.jl +++ b/src/ematch_compiler.jl @@ -326,7 +326,17 @@ end function yield_expr(patvar_to_addr, direction) push_exprs = [ - :(push!(ematch_buffer, v_pair($(Symbol(:σ, addr)), reinterpret(UInt64, $(Symbol(:enode_idx, addr)) - 1)))) for + quote + id = $(Symbol(:σ, addr)) + eclass = g[id] + node_idx = $(Symbol(:enode_idx, addr)) - 1 + if node_idx == 0 + push!(ematch_buffer, v_pair(id, reinterpret(UInt64, 0))) + else + n = eclass.nodes[node_idx] + push!(ematch_buffer, v_pair(id, v_head(n))) + end + end for addr in patvar_to_addr ] quote