v8/test/mjsunit/random-bit-correlations.js
Tobias Tebbi d8f8a7e210 Reland "[flags] warn about contradictory flags"
This is a reland of b8f9166664
Difference to previous CL: Additional functionality to specify
incompatible flags based on GN variables and extra-flags, used
to fix the issues that came up on the waterfall.

This also changes the rules regarding repeated flags: While
explicitly repeated flags are allowed for boolean values as long
as they are identical, repeated flags or explicit flags in the
presence of an active implication are disallowed for non-boolean
flags. The latter simplifies specifying conflict rules in
variants.py. Otherwise a rule like

INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG = {
  "--gc-interval=*": ["--gc-interval=*"],
}

wouldn't work because specifying the same GC interval twice
wouldn't actually count as a conflict. This was an issue with
test/mjsunit/wasm/gc-buffer.js, which specifies
--gc-interval=500 exactly like the extra flag by the stress bot.

Also, this now expands contradictory flags checking to d8 flags
for consistency.

Original change's description:
> [flags] warn about contradictory flags
>
> Design Doc: https://docs.google.com/document/d/1lkvu8crkK7Ei39qjkPCFijpNyxWXsOktG9GB-7K34jM/
>
> Bug: v8:10577
> Change-Id: Ib9cfdffa401c48c895bf31caed5ee03545beddab
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2154792
> Reviewed-by: Clemens Backes <clemensb@chromium.org>
> Reviewed-by: Michael Achenbach <machenbach@chromium.org>
> Reviewed-by: Georg Neis <neis@chromium.org>
> Reviewed-by: Tamer Tas <tmrts@chromium.org>
> Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#68168}

Bug: v8:10577
Change-Id: I268e590ee18a535b13dee14eeb15ddd0a9ee8341
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2235115
Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
Reviewed-by: Tamer Tas <tmrts@chromium.org>
Reviewed-by: Clemens Backes <clemensb@chromium.org>
Reviewed-by: Georg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68989}
2020-07-22 12:22:03 +00:00

78 lines
3.2 KiB
JavaScript

// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Overwrite the random seed provided by the test runner to make this test less
// flaky.
// The flags are processed left to right. --no-abort-on-contradictory-flags
// disables the checking for conflicts, then we process --random-seed=20 to
// overwrite the value the test runner already set before. Then we re-enable
// --abort-on-contradictory-flags to make sure that the processing of other
// flags and flag implications, which happens later, still produces errors.
// Flags: --no-abort-on-contradictory-flags --random-seed=20 --abort-on-contradictory-flags
// Flags: --nostress-opt --noalways-opt --predictable
(function() {
var kHistory = 2;
var kRepeats = 100;
var history = new Uint32Array(kHistory);
function random() {
return (Math.random() * Math.pow(2, 32)) >>> 0;
}
function ChiSquared(m, n) {
var ys_minus_np1 = (m - n / 2.0);
var chi_squared_1 = ys_minus_np1 * ys_minus_np1 * 2.0 / n;
var ys_minus_np2 = ((n - m) - n / 2.0);
var chi_squared_2 = ys_minus_np2 * ys_minus_np2 * 2.0 / n;
return chi_squared_1 + chi_squared_2;
}
for (var predictor_bit = -2; predictor_bit < 32; predictor_bit++) {
// The predicted bit is one of the bits from the PRNG.
for (var random_bit = 0; random_bit < 32; random_bit++) {
for (var ago = 0; ago < kHistory; ago++) {
// We don't want to check whether each bit predicts itself.
if (ago == 0 && predictor_bit == random_bit) continue;
// Enter the new random value into the history
for (var i = ago; i >= 0; i--) {
history[i] = random();
}
// Find out how many of the bits are the same as the prediction bit.
var m = 0;
for (var i = 0; i < kRepeats; i++) {
for (var j = ago - 1; j >= 0; j--) history[j + 1] = history[j];
history[0] = random();
var predicted;
if (predictor_bit >= 0) {
predicted = (history[ago] >> predictor_bit) & 1;
} else {
predicted = predictor_bit == -2 ? 0 : 1;
}
var bit = (history[0] >> random_bit) & 1;
if (bit == predicted) m++;
}
// Chi squared analysis for k = 2 (2, states: same/not-same) and one
// degree of freedom (k - 1).
var chi_squared = ChiSquared(m, kRepeats);
if (chi_squared > 24) {
var percent = Math.floor(m * 100.0 / kRepeats);
if (predictor_bit < 0) {
var bit_value = predictor_bit == -2 ? 0 : 1;
print(`Bit ${random_bit} is ${bit_value} ${percent}% of the time`);
} else {
print(`Bit ${random_bit} is the same as bit ${predictor_bit} ` +
`${ago} ago ${percent}% of the time`);
}
}
// For 1 degree of freedom this corresponds to 1 in a million. We are
// running ~8000 tests, so that would be surprising.
assertTrue(chi_squared <= 24);
// If the predictor bit is a fixed 0 or 1 then it makes no sense to
// repeat the test with a different age.
if (predictor_bit < 0) break;
}
}
}
})();