summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/execution-results.h28
-rw-r--r--test/lit/exec/no-compare-refs.wast22
2 files changed, 32 insertions, 18 deletions
diff --git a/src/tools/execution-results.h b/src/tools/execution-results.h
index 723ddffda..925c9b6d8 100644
--- a/src/tools/execution-results.h
+++ b/src/tools/execution-results.h
@@ -143,25 +143,17 @@ struct ExecutionResults {
}
bool areEqual(Literal a, Literal b) {
- // We allow nulls to have different types (as they compare equal regardless)
- // but anything else must have an identical type.
- // We cannot do this in nominal typing, however, as different modules will
- // have different types in general. We could perhaps compare the entire
- // graph structurally TODO
- if (getTypeSystem() != TypeSystem::Nominal) {
- if (a.type != b.type && !(a.isNull() && b.isNull())) {
- std::cout << "types not identical! " << a << " != " << b << '\n';
- return false;
- }
- }
if (a.type.isRef()) {
- // Don't compare references - only their types. There are several issues
- // here that we can't fully handle, see
- // https://github.com/WebAssembly/binaryen/issues/3378, but the core issue
- // is that we are comparing results between two separate wasm modules (and
- // a separate instance of each) - we can't really identify an identical
- // reference between such things. We can only compare things structurally,
- // for which we compare the types.
+ // Don't compare references. There are several issues here that we can't
+ // fully handle, see https://github.com/WebAssembly/binaryen/issues/3378,
+ // but the core issue is that since we optimize assuming a closed world,
+ // the types and structure of GC data can arbitrarily change after
+ // optimizations, even in ways that are externally visible from outside
+ // the module.
+ //
+ // TODO: Once we support optimizing under some form of open-world
+ // assumption, we should be able to check that the types and/or structure
+ // of GC data passed out of the module does not change.
return true;
}
if (a != b) {
diff --git a/test/lit/exec/no-compare-refs.wast b/test/lit/exec/no-compare-refs.wast
new file mode 100644
index 000000000..bb9766a31
--- /dev/null
+++ b/test/lit/exec/no-compare-refs.wast
@@ -0,0 +1,22 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --output=fuzz-exec and should not be edited.
+
+;; RUN: wasm-opt %s --hybrid -all --signature-pruning --fuzz-exec -q -o /dev/null 2>&1 | filecheck %s
+
+(module
+ (type $f (func (param i32)))
+
+ (func $no-use-param (type $f) (param i32)
+ (unreachable)
+ )
+
+ ;; The type of the reference this function returns will change as a result of
+ ;; signature pruning. The fuzzer should not complain about this.
+ ;; CHECK: [fuzz-exec] calling return-ref
+ ;; CHECK-NEXT: [fuzz-exec] note result: return-ref => funcref
+ (func "return-ref" (result funcref)
+ (ref.func $no-use-param)
+ )
+)
+;; CHECK: [fuzz-exec] calling return-ref
+;; CHECK-NEXT: [fuzz-exec] note result: return-ref => funcref
+;; CHECK-NEXT: [fuzz-exec] comparing return-ref