summaryrefslogtreecommitdiff
path: root/src/tools/fuzzing.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/fuzzing.h')
-rw-r--r--src/tools/fuzzing.h158
1 files changed, 55 insertions, 103 deletions
diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h
index f4188eb08..9788d9f11 100644
--- a/src/tools/fuzzing.h
+++ b/src/tools/fuzzing.h
@@ -183,8 +183,6 @@ public:
std::cout << "shrink level: " << options.passOptions.shrinkLevel << '\n';
}
- void setAllowNaNs(bool allowNaNs_) { allowNaNs = allowNaNs_; }
-
void setAllowMemory(bool allowMemory_) { allowMemory = allowMemory_; }
void setAllowOOB(bool allowOOB_) { allowOOB = allowOOB_; }
@@ -207,9 +205,6 @@ public:
if (HANG_LIMIT > 0) {
addHangLimitSupport();
}
- if (!allowNaNs) {
- addDeNanSupport();
- }
finalizeTable();
}
@@ -253,11 +248,6 @@ private:
// no hang protection.
static const int HANG_LIMIT = 10;
- // Optionally remove NaNs, which are a source of nondeterminism (which makes
- // cross-VM comparisons harder)
- // TODO: de-NaN SIMD values
- bool allowNaNs = true;
-
// Whether to emit memory operations like loads and stores.
bool allowMemory = true;
@@ -499,34 +489,6 @@ private:
builder.makeConst(Literal(int32_t(1))))));
}
- void addDeNanSupport() {
- auto add = [&](Name name, Type type, Literal literal, BinaryOp op) {
- auto* func = new Function;
- func->name = name;
- func->sig = Signature(type, type);
- func->body = builder.makeIf(
- builder.makeBinary(
- op, builder.makeLocalGet(0, type), builder.makeLocalGet(0, type)),
- builder.makeLocalGet(0, type),
- builder.makeConst(literal));
- wasm.addFunction(func);
- };
- add("deNan32", Type::f32, Literal(float(0)), EqFloat32);
- add("deNan64", Type::f64, Literal(double(0)), EqFloat64);
- }
-
- Expression* makeDeNanOp(Expression* expr) {
- if (allowNaNs) {
- return expr;
- }
- if (expr->type == Type::f32) {
- return builder.makeCall("deNan32", {expr}, Type::f32);
- } else if (expr->type == Type::f64) {
- return builder.makeCall("deNan64", {expr}, Type::f64);
- }
- return expr; // unreachable etc. is fine
- }
-
// function generation state
Function* func = nullptr;
@@ -1538,7 +1500,7 @@ private:
return store;
}
- Literal makeArbitraryLiteral(Type type) {
+ Literal makeLiteral(Type type) {
if (type == Type::v128) {
// generate each lane individually for random lane interpretation
switch (upTo(6)) {
@@ -1767,14 +1729,6 @@ private:
WASM_UNREACHABLE("invalide value");
}
- Literal makeLiteral(Type type) {
- auto ret = makeArbitraryLiteral(type);
- if (!allowNaNs && ret.isNaN()) {
- ret = Literal::makeFromInt32(0, type);
- }
- return ret;
- }
-
Expression* makeConst(Type type) {
if (type.isRef()) {
assert(wasm.features.hasReferenceTypes());
@@ -1814,8 +1768,7 @@ private:
assert(!type.isMulti());
if (type == Type::unreachable) {
if (auto* unary = makeUnary(getSingleConcreteType())->dynCast<Unary>()) {
- return makeDeNanOp(
- builder.makeUnary(unary->op, make(Type::unreachable)));
+ return builder.makeUnary(unary->op, make(Type::unreachable));
}
// give up
return makeTrivial(type);
@@ -1923,50 +1876,50 @@ private:
case Type::f32: {
switch (upTo(4)) {
case 0:
- return makeDeNanOp(buildUnary({pick(NegFloat32,
- AbsFloat32,
- CeilFloat32,
- FloorFloat32,
- TruncFloat32,
- NearestFloat32,
- SqrtFloat32),
- make(Type::f32)}));
+ return buildUnary({pick(NegFloat32,
+ AbsFloat32,
+ CeilFloat32,
+ FloorFloat32,
+ TruncFloat32,
+ NearestFloat32,
+ SqrtFloat32),
+ make(Type::f32)});
case 1:
- return makeDeNanOp(buildUnary({pick(ConvertUInt32ToFloat32,
- ConvertSInt32ToFloat32,
- ReinterpretInt32),
- make(Type::i32)}));
+ return buildUnary({pick(ConvertUInt32ToFloat32,
+ ConvertSInt32ToFloat32,
+ ReinterpretInt32),
+ make(Type::i32)});
case 2:
- return makeDeNanOp(
- buildUnary({pick(ConvertUInt64ToFloat32, ConvertSInt64ToFloat32),
- make(Type::i64)}));
+ return buildUnary(
+ {pick(ConvertUInt64ToFloat32, ConvertSInt64ToFloat32),
+ make(Type::i64)});
case 3:
- return makeDeNanOp(buildUnary({DemoteFloat64, make(Type::f64)}));
+ return buildUnary({DemoteFloat64, make(Type::f64)});
}
WASM_UNREACHABLE("invalid value");
}
case Type::f64: {
switch (upTo(4)) {
case 0:
- return makeDeNanOp(buildUnary({pick(NegFloat64,
- AbsFloat64,
- CeilFloat64,
- FloorFloat64,
- TruncFloat64,
- NearestFloat64,
- SqrtFloat64),
- make(Type::f64)}));
+ return buildUnary({pick(NegFloat64,
+ AbsFloat64,
+ CeilFloat64,
+ FloorFloat64,
+ TruncFloat64,
+ NearestFloat64,
+ SqrtFloat64),
+ make(Type::f64)});
case 1:
- return makeDeNanOp(
- buildUnary({pick(ConvertUInt32ToFloat64, ConvertSInt32ToFloat64),
- make(Type::i32)}));
+ return buildUnary(
+ {pick(ConvertUInt32ToFloat64, ConvertSInt32ToFloat64),
+ make(Type::i32)});
case 2:
- return makeDeNanOp(buildUnary({pick(ConvertUInt64ToFloat64,
- ConvertSInt64ToFloat64,
- ReinterpretInt64),
- make(Type::i64)}));
+ return buildUnary({pick(ConvertUInt64ToFloat64,
+ ConvertSInt64ToFloat64,
+ ReinterpretInt64),
+ make(Type::i64)});
case 3:
- return makeDeNanOp(buildUnary({PromoteFloat32, make(Type::f32)}));
+ return buildUnary({PromoteFloat32, make(Type::f32)});
}
WASM_UNREACHABLE("invalid value");
}
@@ -2035,8 +1988,8 @@ private:
if (type == Type::unreachable) {
if (auto* binary =
makeBinary(getSingleConcreteType())->dynCast<Binary>()) {
- return makeDeNanOp(buildBinary(
- {binary->op, make(Type::unreachable), make(Type::unreachable)}));
+ return buildBinary(
+ {binary->op, make(Type::unreachable), make(Type::unreachable)});
}
// give up
return makeTrivial(type);
@@ -2131,26 +2084,26 @@ private:
make(Type::i64)});
}
case Type::f32: {
- return makeDeNanOp(buildBinary({pick(AddFloat32,
- SubFloat32,
- MulFloat32,
- DivFloat32,
- CopySignFloat32,
- MinFloat32,
- MaxFloat32),
- make(Type::f32),
- make(Type::f32)}));
+ return buildBinary({pick(AddFloat32,
+ SubFloat32,
+ MulFloat32,
+ DivFloat32,
+ CopySignFloat32,
+ MinFloat32,
+ MaxFloat32),
+ make(Type::f32),
+ make(Type::f32)});
}
case Type::f64: {
- return makeDeNanOp(buildBinary({pick(AddFloat64,
- SubFloat64,
- MulFloat64,
- DivFloat64,
- CopySignFloat64,
- MinFloat64,
- MaxFloat64),
- make(Type::f64),
- make(Type::f64)}));
+ return buildBinary({pick(AddFloat64,
+ SubFloat64,
+ MulFloat64,
+ DivFloat64,
+ CopySignFloat64,
+ MinFloat64,
+ MaxFloat64),
+ make(Type::f64),
+ make(Type::f64)});
}
case Type::v128: {
assert(wasm.features.hasSIMD());
@@ -2270,8 +2223,7 @@ private:
Expression* makeSelect(Type type) {
Type subType1 = getSubType(type);
Type subType2 = getSubType(type);
- return makeDeNanOp(
- buildSelect({make(Type::i32), make(subType1), make(subType2)}, type));
+ return buildSelect({make(Type::i32), make(subType1), make(subType2)}, type);
}
Expression* makeSwitch(Type type) {