blob: 24956104563b57fb487d4811c18e180d6c9a9659 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
// Compares the value set by interpreter with the jitted code
// need to run with -mic:1 -off:simplejit -off:jitloopbody
// Run locally with -trace:memop -trace:bailout to help find bugs
let size = 200;
let testError = Symbol();
let src = new Array(size);
for(let i = 0; i < size; ++i) {
src[i] = i;
}
function crashBug1(a, b) {
// This should obivously not trigger a memset
for(let i = 0; i < size; ++i) {
let c = [b[i]];
c[i] = 9;
}
try {
for(let i = 0; i < size; ++i) {
let c = b[i] && undefined;
c[i] = 9;
}
return testError;
} catch(e) {
// If everything goes well the above should throw
}
}
function test2(a) {
let c = new Array(size);
for(let i = 0; i < size; ++i) {
a[i] = src[i];
c[i] = a[i];
}
}
function invalidMemset(a, b) {
// if a and b are the same, a[i]=0 will get hoisted and the result will be incorrect
for(let i = 0; i < size; ++i) {
b[i] = i;
a[i] = 0;
}
}
function memopOrder(a, b) {
// In case of aliasing, these 2 memset must remains in this order
// Check the order of memopOrder
for(let i = 0; i < size; ++i) {
b[i] = 4;
a[i] = 5;
}
}
function memsetUnroll(a, b) {
// Check the order of memopOrder
for(let i = 0; i < size; ++i) {
b[i] = 4;
a[i] = 5;
++i;
a[i] = 5;
b[i] = 4;
}
}
function invalidMemcopy(a, b) {
for(let i = 0; i < size; ++i) {
b[i] = i;
a[i] = b[i];
}
}
function copySetMix1(a, b) {
for(let i = 0; i < size; ++i) {
b[i] = 5;
a[i] = b[i];
}
}
function copySetMix2(a, b) {
for(let i = 0; i < size; ++i) {
a[i] = b[i];
b[i] = 5;
}
}
function copySetMix3(a, b) {
for(let i = 0; i < size; ++i) {
b[i] = a[i];
b[i] = 5;
}
}
function copySetMix4(a, b) {
for(let i = 0; i < size; ++i) {
a[i] = 5;
a[i] = b[i];
}
}
function test(fn) {
let name = fn.name;
let interpretArray = new Array(size);
interpretArray.fill(1);
fn(interpretArray, interpretArray);
let jitArray = new Array(size);
jitArray.fill(1);
let r = fn(jitArray, jitArray);
if(r === testError) {
print(`Error: ${name} had an internal error`);
return false;
}
return compare(interpretArray, jitArray, name);
}
function compare(a, b, name) {
for(let i = 0; i < size; ++i) {
if(a[i] !== b[i]) {
print(`Error: ${name} interpret[${i}] (${a[i]}) !== jit[${i}] (${b[i]})`);
return false;
}
}
return true;
}
let tests = [
crashBug1, // fix then reactivate
test2,
memsetUnroll,
memopOrder,
invalidMemset,
invalidMemcopy,
copySetMix1,
copySetMix2,
copySetMix3,
copySetMix4
];
let passed = true;
for(let testFn of tests) {
passed &= test(testFn);
}
if(passed) {
print("PASSED");
} else {
print("FAILED");
}