Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
291 commits
Select commit Hold shift + click to select a range
70ab2e0
format
kripken Jul 1, 2025
cbf01f6
hunt known bugs
kripken Jul 1, 2025
3630e4a
hunt known bugs
kripken Jul 1, 2025
305bbe6
fix
kripken Jul 1, 2025
0b3b4d4
fix
kripken Jul 1, 2025
0838d52
nicer
kripken Jul 1, 2025
5a64e67
fix
kripken Jul 1, 2025
5b54e6d
test
kripken Jul 1, 2025
4933339
fix
kripken Jul 2, 2025
6d69bff
work
kripken Jul 2, 2025
525ad6b
work
kripken Jul 2, 2025
f3f56e9
work
kripken Jul 2, 2025
03c092f
work
kripken Jul 2, 2025
44baed3
wokr
kripken Jul 2, 2025
c437559
format
kripken Jul 2, 2025
41d167c
comments
kripken Jul 2, 2025
ec88368
[Branch Hinting] Add useful passes to generate, test, and fuzz branch…
kripken Jul 2, 2025
848dadf
passes
kripken Jul 2, 2025
88aefa6
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 2, 2025
28cd629
comments
kripken Jul 2, 2025
cd5d8b0
comments
kripken Jul 2, 2025
ca6b924
comments
kripken Jul 2, 2025
c15ecb7
comments
kripken Jul 2, 2025
39ef586
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 2, 2025
96cfbab
fix
kripken Jul 2, 2025
c18203d
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 2, 2025
03e91b7
fix
kripken Jul 2, 2025
a792a0d
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 2, 2025
9b2209a
note
kripken Jul 2, 2025
92167a1
feedback
kripken Jul 2, 2025
835bfcf
feedback
kripken Jul 2, 2025
cb950fe
feedback
kripken Jul 2, 2025
e3a7d21
feedback
kripken Jul 2, 2025
facedf9
feedback
kripken Jul 2, 2025
fab9d07
feedback
kripken Jul 2, 2025
aabd6bc
feedback
kripken Jul 2, 2025
a27c9a4
feedback
kripken Jul 2, 2025
91ffaf8
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 2, 2025
57fa279
fix compiler error
kripken Jul 2, 2025
613c532
fix duplicate name
kripken Jul 2, 2025
a41c792
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 2, 2025
baa4d2b
fix compiler error
kripken Jul 2, 2025
8d3ff02
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 2, 2025
ba38cf8
update help
kripken Jul 2, 2025
8b26628
format
kripken Jul 2, 2025
7112a58
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 2, 2025
d954ace
todo
kripken Jul 2, 2025
574217c
todo
kripken Jul 3, 2025
69be0a4
fix
kripken Jul 7, 2025
355817e
fix
kripken Jul 7, 2025
bffe435
remove TWICE
kripken Jul 7, 2025
9ff748b
simplify tests
kripken Jul 7, 2025
870f4a9
fix compilation error
kripken Jul 7, 2025
b7da0e0
test updates
kripken Jul 7, 2025
ce42321
Add a todo for BrOn
kripken Jul 7, 2025
4edb1bc
oops
kripken Jul 7, 2025
46f2ec8
Update test/lit/passes/instrument-branch-hints.wast
kripken Jul 7, 2025
e351a5f
remove fuzz restriction
kripken Jul 7, 2025
c004620
Merge remote-tracking branch 'myself/bh-passes' into bh-passes
kripken Jul 7, 2025
53ceff4
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 7, 2025
f8a5e23
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 7, 2025
dd3a518
fix
kripken Jul 7, 2025
bd211f8
add d8 side of import, so the fuzzer does not error
kripken Jul 7, 2025
3a4f270
Revert "remove fuzz restriction"
kripken Jul 7, 2025
edb08a2
Revert "add d8 side of import, so the fuzzer does not error"
kripken Jul 7, 2025
36d60e6
note
kripken Jul 7, 2025
3e5a796
Merge remote-tracking branch 'myself/bh-passes' into rubbh
kripken Jul 7, 2025
107bb24
work
kripken Jul 7, 2025
d82fbf6
fix
kripken Jul 7, 2025
9af9bf6
test
kripken Jul 7, 2025
42c04c5
workaround
kripken Jul 7, 2025
0d6f9c0
finish
kripken Jul 7, 2025
c23fd1c
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 7, 2025
7270c14
work
kripken Jul 7, 2025
ccde12f
sinpl
kripken Jul 7, 2025
16a21b3
fix
kripken Jul 7, 2025
e182b11
fix
kripken Jul 7, 2025
16cdc02
fix
kripken Jul 7, 2025
067c012
FAILTEst
kripken Jul 8, 2025
9a77489
fix
kripken Jul 8, 2025
f569d72
testing
kripken Jul 8, 2025
3343a83
fix
kripken Jul 8, 2025
0b77b6d
fix
kripken Jul 8, 2025
f37441b
bugify
kripken Jul 8, 2025
92fae6c
bettre
kripken Jul 8, 2025
8cc956d
bettre
kripken Jul 8, 2025
d3e8194
comment
kripken Jul 8, 2025
f67680f
fix
kripken Jul 8, 2025
6ca3ef5
format
kripken Jul 8, 2025
98713c8
undo
kripken Jul 8, 2025
b91c3d8
UNDO.but maybe will need to redo
kripken Jul 8, 2025
27eed9e
add
kripken Jul 8, 2025
708f4f3
add
kripken Jul 8, 2025
484de96
hint
kripken Jul 8, 2025
b15f27a
work
kripken Jul 8, 2025
d1ec1a1
BUG
kripken Jul 8, 2025
c3ef41f
docs
kripken Jul 8, 2025
2aacfa3
more
kripken Jul 8, 2025
189216a
more
kripken Jul 8, 2025
b15c678
more
kripken Jul 8, 2025
dd6e04c
try
kripken Jul 8, 2025
35fd9ab
Merge remote-tracking branch 'myself/BINARYEN_TRUST_GIVEN_WASM' into …
kripken Jul 9, 2025
4e99909
work
kripken Jul 9, 2025
32845b8
start
kripken Jul 9, 2025
4277a05
finish
kripken Jul 9, 2025
05764b8
fix
kripken Jul 9, 2025
620daeb
fix
kripken Jul 9, 2025
aa6ad0e
clean
kripken Jul 9, 2025
8d7bcbe
Merge remote-tracking branch 'myself/fuzz.branch.hints' into rubbh
kripken Jul 9, 2025
c001d31
clean
kripken Jul 9, 2025
d907ef7
Merge remote-tracking branch 'myself/fuzz.branch.hints' into rubbh
kripken Jul 9, 2025
1db1fa5
mark them as test passes
kripken Jul 9, 2025
877d9e6
format
kripken Jul 9, 2025
d6341e9
Merge remote-tracking branch 'myself/fuzz.branch.hints' into rubbh
kripken Jul 9, 2025
9d4fa56
new
kripken Jul 9, 2025
50049e0
bettr
kripken Jul 9, 2025
7565b4f
work
kripken Jul 9, 2025
5a42c80
work
kripken Jul 9, 2025
c5796cf
work
kripken Jul 9, 2025
89cbb26
work
kripken Jul 9, 2025
2fc5c0c
work
kripken Jul 9, 2025
7f1cadd
work
kripken Jul 9, 2025
1646e8f
work
kripken Jul 9, 2025
45fd130
work
kripken Jul 9, 2025
001f7f4
work
kripken Jul 9, 2025
81220a7
simpl
kripken Jul 9, 2025
c06f1da
work
kripken Jul 9, 2025
9779b78
work
kripken Jul 9, 2025
1ac54bb
fix
kripken Jul 9, 2025
8aada23
moar
kripken Jul 9, 2025
0215cbc
moar
kripken Jul 9, 2025
0cbbf5a
properly apply OR
kripken Jul 9, 2025
76632f1
properly apply OR
kripken Jul 9, 2025
126eb88
format
kripken Jul 9, 2025
ed5a58b
format
kripken Jul 9, 2025
a633e50
Update src/ir/branch-hints.h
kripken Jul 9, 2025
07fe5a0
work
kripken Jul 9, 2025
158f5b0
work
kripken Jul 9, 2025
5092f67
fix
kripken Jul 9, 2025
5b968f4
more
kripken Jul 9, 2025
c0d4dc5
fix
kripken Jul 9, 2025
a1e2fe2
fix
kripken Jul 9, 2025
e450d9b
fix
kripken Jul 9, 2025
a321e25
fix
kripken Jul 9, 2025
e3ef933
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 9, 2025
dfaca1e
fix
kripken Jul 10, 2025
9a69c34
format
kripken Jul 10, 2025
9c88757
test
kripken Jul 10, 2025
39308c5
redundant
kripken Jul 10, 2025
2618dff
Merge remote-tracking branch 'myself/name.fix' into rubbh
kripken Jul 10, 2025
02c1a63
fixen
kripken Jul 10, 2025
a62b75d
fix
kripken Jul 10, 2025
a56ea28
fix
kripken Jul 10, 2025
a1e74c0
work
kripken Jul 11, 2025
69c1711
oops
kripken Jul 11, 2025
0b309b7
go
kripken Jul 11, 2025
2ec5cef
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 11, 2025
5a136b6
fix
kripken Jul 11, 2025
0ef4f28
Merge remote-tracking branch 'myself/bh.vac' into rubbh
kripken Jul 11, 2025
ceb5c77
fix
kripken Jul 11, 2025
e2f012c
Merge remote-tracking branch 'myself/bh.vac' into rubbh
kripken Jul 11, 2025
c445457
start
kripken Jul 11, 2025
e907c37
work
kripken Jul 11, 2025
91b7827
fix
kripken Jul 11, 2025
c59cf8b
finx
kripken Jul 11, 2025
314ce63
almost
kripken Jul 11, 2025
76b7f23
fix
kripken Jul 11, 2025
ead7cd3
Merge remote-tracking branch 'myself/bh.inp' into rubbh
kripken Jul 11, 2025
79e2e44
start
kripken Jul 11, 2025
b922ff4
work
kripken Jul 11, 2025
8c85ba5
Merge branch 'bh.inp' into dupe.bh
kripken Jul 11, 2025
f6de78b
work
kripken Jul 11, 2025
bceb296
fix
kripken Jul 11, 2025
950aa1a
fix
kripken Jul 11, 2025
cc654de
fix
kripken Jul 11, 2025
cd3054d
Merge remote-tracking branch 'myself/dupe.bh' into rubbh
kripken Jul 11, 2025
b839354
Merge remote-tracking branch 'origin/main' into dupe.bh
kripken Jul 11, 2025
c369a8d
Merge remote-tracking branch 'myself/dupe.bh' into rubbh
kripken Jul 11, 2025
ca3777a
format
kripken Jul 11, 2025
5bc6e91
Merge remote-tracking branch 'myself/dupe.bh' into rubbh
kripken Jul 11, 2025
5dfec1b
Update src/ir/metadata.cpp
kripken Jul 11, 2025
8d6802a
feedback
kripken Jul 11, 2025
14f1ab0
Merge remote-tracking branch 'myself/dupe.bh' into dupe.bh
kripken Jul 11, 2025
77e4a7e
format
kripken Jul 11, 2025
73946de
fix
kripken Jul 11, 2025
556c0ea
fix
kripken Jul 11, 2025
affa675
Merge remote-tracking branch 'myself/dupe.bh' into rubbh
kripken Jul 11, 2025
2d9eba5
avoid compiler warning on unset values
kripken Jul 11, 2025
75e648e
Merge remote-tracking branch 'myself/dupe.bh' into rubbh
kripken Jul 11, 2025
0721d8c
magic workaround for gcc compiler error
kripken Jul 11, 2025
6ba51d5
Merge remote-tracking branch 'myself/dupe.bh' into rubbh
kripken Jul 11, 2025
d194819
yikes
kripken Jul 14, 2025
354cc01
fix
kripken Jul 14, 2025
4af21ca
work
kripken Jul 14, 2025
b5be8c2
when all else fails, disable the gcc warning
kripken Jul 14, 2025
64289e3
Merge remote-tracking branch 'myself/dupe.bh' into rubbh
kripken Jul 14, 2025
3462bf1
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 14, 2025
0c72662
undo
kripken Jul 14, 2025
3ce8e24
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 14, 2025
f916538
work
kripken Jul 15, 2025
fd3fa16
oh no
kripken Jul 15, 2025
3c204a5
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 16, 2025
2414f80
fix
kripken Jul 16, 2025
8943062
work
kripken Jul 16, 2025
6f56435
work
kripken Jul 16, 2025
4c11c77
Merge remote-tracking branch 'myself/debuginfo.nah' into rubbh
kripken Jul 16, 2025
d43226b
work
kripken Jul 16, 2025
cf96c46
work
kripken Jul 16, 2025
bd402b4
fix
kripken Jul 16, 2025
8914861
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 16, 2025
75af49f
format
kripken Jul 16, 2025
b67f2d4
todo
kripken Jul 17, 2025
58f81db
unyolo
kripken Jul 21, 2025
b06e4bd
update test
kripken Jul 21, 2025
397845c
Merge remote-tracking branch 'myself/revert' into rubbh
kripken Jul 21, 2025
c451512
Merge remote-tracking branch 'origin/main' into revert
kripken Jul 21, 2025
e3df6f0
Merge remote-tracking branch 'myself/revert' into rubbh
kripken Jul 21, 2025
0e06b4c
undo
kripken Jul 21, 2025
9736c14
undo
kripken Jul 21, 2025
7516b88
fix
kripken Jul 21, 2025
b6c1ed5
format
kripken Jul 21, 2025
01e73a8
fix
kripken Jul 21, 2025
5d59a8a
fix
kripken Jul 22, 2025
534abe5
fix
kripken Jul 22, 2025
4fb0ce5
Merge remote-tracking branch 'origin/main' into rubbh
kripken Jul 22, 2025
ddffdfe
comments
kripken Jul 22, 2025
acc70b7
feedback
kripken Jul 22, 2025
0a5083f
rename
kripken Jul 22, 2025
8b56402
feedback: less self
kripken Jul 22, 2025
f40a98c
format
kripken Jul 22, 2025
7c07e56
finalize
kripken Jul 22, 2025
17b3bea
typo
kripken Jul 22, 2025
28ce0f2
text
kripken Jul 22, 2025
0df8724
test
kripken Jul 22, 2025
d968f99
test
kripken Jul 22, 2025
71b07e1
test
kripken Jul 22, 2025
1d41ea4
test
kripken Jul 22, 2025
c487b02
test
kripken Jul 22, 2025
84a7a73
Merge remote-tracking branch 'myself/rubbh' into fuzz.branch.hints
kripken Jul 22, 2025
e37bc45
comment
kripken Jul 22, 2025
9c42c26
feedback: extra test
kripken Jul 22, 2025
d9da805
add MergeBlocks
kripken Jul 22, 2025
51b7ca7
Merge remote-tracking branch 'origin/main' into fuzz.branch.hints
kripken Jul 23, 2025
e66dafe
inhibit reordering in optimize-instructions
kripken Jul 23, 2025
6eaea5c
fix d8 fuzzer by adding js version of log-branch
kripken Jul 23, 2025
91f3c0e
Another select in RUBR
kripken Jul 24, 2025
7f90562
Another.
kripken Jul 24, 2025
7216dc8
Another.
kripken Jul 24, 2025
71a220e
skip monomorphization too
kripken Jul 24, 2025
1a394d7
skip SimplifyGlobals
kripken Jul 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions scripts/fuzz_opt.py
Original file line number Diff line number Diff line change
Expand Up @@ -1844,6 +1844,111 @@ def get_relevant_lines(wat):
compare(get_relevant_lines(original), get_relevant_lines(processed), 'Preserve')


# Test that we preserve branch hints properly. The invariant that we test here
# is that, given correct branch hints (that is, the input wasm's branch hints
# are always correct: a branch is taken iff the hint is that it is taken), then
# the optimizer does not end up with incorrect branch hints. It is fine if the
# optimizer removes some hints (it may remove entire chunks of code in DCE, for
# example, and it may find ways to simplify code so fewer things execute), but
# it should not emit a branch hint that is wrong - if it is not certain, it
# should remove the branch hint.
class BranchHintPreservation(TestCaseHandler):
frequency = 0.1

def handle(self, wasm):
# Generate an instrumented wasm.
instrumented = wasm + '.inst.wasm'
run([
in_bin('wasm-opt'),
wasm,
'-o', instrumented,
# Add random branch hints (so we have something to work with).
'--randomize-branch-hints',
# Instrument them with logging.
'--instrument-branch-hints',
'-g',
] + FEATURE_OPTS)

# Collect the logging.
out = run_bynterp(instrumented, ['--fuzz-exec-before', '-all'])

# Process the output. We look at the lines like this:
#
# [LoggingExternalInterface log-branch 1 0 0]
#
# where the three integers are: ID, predicted, actual.
all_ids = set()
bad_ids = set()
LEI_LOG_BRANCH = '[LoggingExternalInterface log-branch'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this would be a clearer name. I took a break in the middle of reviewing and when I came back and read the code below, I had no idea what LEI stood for :)

Suggested change
LEI_LOG_BRANCH = '[LoggingExternalInterface log-branch'
LOG_BRANCH_PREFIX = '[LoggingExternalInterface log-branch'

for line in out.splitlines():
if line.startswith(LEI_LOG_BRANCH):
# (1:-1 strips away the '[', ']' at the edges)
_, _, id_, hint, actual = line[1:-1].split(' ')
all_ids.add(id_)
if hint != actual:
# This hint was misleading.
bad_ids.add(id_)

# If no good ids remain, there is nothing to test (no hints will remain
# later down, after we remove bad ones).
if bad_ids == all_ids:
note_ignored_vm_run('no good ids')
return

# Generate proper hints for testing: A wasm file with 100% valid branch
# hints, and instrumentation to verify that.
de_instrumented = wasm + '.de_inst.wasm'
args = [
in_bin('wasm-opt'),
instrumented,
'-o', de_instrumented,
]
# Remove the bad ids (using the instrumentation to identify them by ID).
if bad_ids:
args += [
'--delete-branch-hints=' + ','.join(bad_ids),
]
args += [
# Remove all prior instrumentation, so it does not confuse us later
# when we log our final hints, and also so it does not inhibit
# optimizations.
'--deinstrument-branch-hints',
'-g',
] + FEATURE_OPTS
run(args)

# Add optimizations to see if things break.
opted = wasm + '.opted.wasm'
args = [
in_bin('wasm-opt'),
de_instrumented,
'-o', opted,
'-g',
] + get_random_opts() + FEATURE_OPTS
run(args)

# Add instrumentation, to see if any branch hints are wrong after
# optimizations. We must do this in a separate invocation from the
# optimizations due to flags like --converge (which would instrument
# multiple times).
final = wasm + '.final.wasm'
args = [
in_bin('wasm-opt'),
opted,
'-o', final,
'--instrument-branch-hints',
'-g',
] + FEATURE_OPTS
run(args)

# No bad hints should pop up after optimizations.
out = run_bynterp(final, ['--fuzz-exec-before', '-all'])
for line in out.splitlines():
if line.startswith(LEI_LOG_BRANCH):
_, _, id_, hint, actual = line[1:-1].split(' ')
assert hint == actual, 'Bad hint after optimizations'


# The global list of all test case handlers
testcase_handlers = [
FuzzExec(),
Expand All @@ -1859,6 +1964,7 @@ def get_relevant_lines(wat):
ClusterFuzz(),
Two(),
PreserveImportsExports(),
BranchHintPreservation(),
]


Expand Down
Loading
Loading