Skip to content

Commit f606a73

Browse files
committed
Revert "Dict dispatch improvement"
This reverts commit 780aac9.
1 parent 2204e8f commit f606a73

File tree

1 file changed

+11
-23
lines changed

1 file changed

+11
-23
lines changed

rpython/jit/codewriter/genextension.py

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -171,41 +171,29 @@ def _analyze_pc_transitions(self, code_and_spec_per_pc):
171171
def _generate_dict_dispatch(self, code_and_spec_per_pc, allconsts, pc_transitions):
172172
"""
173173
Generate dictionary-based dispatch for O(1) PC lookup.
174-
Uses a dense index mapping for better branch prediction.
174+
This is more efficient for functions with many PC values.
175175
176-
Maps sparse PC values to dense indices (0, 1, 2, ...) and uses
177-
the index for dispatch. The dictionary lookup is O(1).
176+
For large functions, we use a true dictionary-based dispatch where
177+
each PC handler is a closure that updates pc and continues.
178178
"""
179-
# Build the dispatch cases with dense indices
179+
# Build the dispatch cases
180180
dispatch_cases = []
181-
pc_to_idx = {}
182-
for idx, (pc, (code, spec)) in enumerate(sorted(code_and_spec_per_pc.iteritems())):
181+
for pc, (code, spec) in sorted(code_and_spec_per_pc.iteritems()):
183182
allconsts.update(spec.constant_registers)
184183
case_lines = []
185184
case_lines.append("self.pc = %s" % (self.pc_to_nextpc[spec.orig_pc], ))
186185
for line in str(py.code.Source(code).indent('')).splitlines():
187186
case_lines.append(line)
188-
dispatch_cases.append((idx, pc, case_lines, spec))
189-
pc_to_idx[pc] = idx
190-
191-
# Generate PC to index mapping as a dictionary lookup
192-
# This is O(1) dictionary lookup followed by O(1) index dispatch
193-
self.code.append("_pc_to_idx = {%s}" % ", ".join(
194-
"%s: %s" % (pc, idx) for pc, idx in sorted(pc_to_idx.items())))
195-
self.code.append("_idx = _pc_to_idx.get(pc, -1)")
187+
dispatch_cases.append((pc, case_lines, spec))
196188

197-
# Generate dispatch using dense indices for better branch prediction
198-
prefix = ""
199-
for idx, pc, case_lines, spec in dispatch_cases:
200-
self.code.append("%sif _idx == %s: # pc=%s %s %s" % (prefix, idx, pc, spec.insn, spec.constant_registers))
189+
# Generate the dispatch code - still use if/elif but with optimized ordering
190+
# based on trace prediction (most likely targets first)
191+
for pc, case_lines, spec in dispatch_cases:
192+
self.code.append("if pc == %s: # %s %s" % (pc, spec.insn, spec.constant_registers))
201193
for line in case_lines:
202194
self.code.append(" " + line)
203-
# Update index for next iteration using the dictionary
204-
next_pc_line = " _idx = _pc_to_idx.get(pc, -1)"
205-
self.code.append(next_pc_line)
206-
prefix = "el"
207195

208-
self.code.append("else: assert 0, 'unreachable pc=%d' % pc")
196+
self.code.append("assert 0 # unreachable")
209197

210198
def _generate_threaded_dispatch(self, code_and_spec_per_pc, allconsts, pc_transitions):
211199
"""

0 commit comments

Comments
 (0)