blob: 206df46f52e2d5b542afe730d8373f1072bde079 [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 -off:inline
// Run locally with -trace:memop -trace:bailout to help find bugs
let testCases = [
function() {
return {
start: 0,
end: 100,
test: function testBasic(a) {
for(let i = 0; i < 100; i++) {
a[i] = 0;
}
}
};
},
function() {
return {
start: 5,
end: 101,
test: function testReverse(a) {
for(let i = 100; i >= 5; i--) {
a[i] = 0;
}
}
};
},
function() {
let results = [];
return {
runner: function testMultipleMemset(arrayGen) {
let a = arrayGen(), b = arrayGen(), c = arrayGen();
for(let i = 0; i < 10; i++) {
a[i] = b[i] = c[i] = 0;
}
results.push([a, b, c]);
},
check: function() {
let base = results[0];
for(let i = 1; i < results.length; ++i) {
for(let j = 0; j < 3; ++j) {
compareResult(base[j], results[i][j], 0, 10);
}
}
}
};
},
function() {
return {
start: 4,
end: 30,
test: function testUnroll(a) {
for(let i = 4; i < 30;) {
a[i] = 0;
i++;
a[i] = 0;
i++;
}
}
};
},
function() {
return {
start: 8,
end: 10,
test: function testMissingValues(a) {
for(let i = 8; i < 10; i++) {
a[i] = 0;
}
}
};
},
function() {
return {
start: 0,
end: 6,
test: function testOverwrite(a) {
a[5] = 3;
for(let i = 0; i < 6; i++) {
a[i] = 0;
}
}
};
},
function() {
return {
start: 10,
end: 50,
test: function testNegativeConstant(a) {
for(let i = 10; i < 50; i++) {
a[i] = -1;
}
}
};
},
function() {
return {
start: -50,
end: 10,
test: function testNegativeStartIndex(a) {
for(let i = -50; i < 10; i++) {
a[i] = -3;
}
}
};
}
];
let arrayGenerators = [
// the one for the interpreter
function() {
return new Array(10);
},
function() {
return new Array(10);
},
function() {
return [];
}
// causes bailouts right now: BailOut: function: testMultipleMemset ( (#1.2), #3) offset: #0036 Opcode: BailOnNotArray Kind: BailOutOnNotNativeArray
// function() {return [1, 2, 3, 4, 5, 6, 7]; }
];
for(let testCase of testCases) {
let results = [];
let testInfo = testCase();
for(let gen of arrayGenerators) {
if(testInfo.runner) {
let result = testInfo.runner(gen);
results.push(result);
} else {
let newArray = gen();
testInfo.test(newArray);
results.push(newArray);
}
}
if(testInfo.check) {
testInfo.check(results);
} else {
let base = results[0]; // result from the interpreter
for(let i = 1; i < results.length; ++i) {
compareResult(base, results[i], testInfo.start, testInfo.end);
}
}
}
let passed = true;
function compareResult(a, b, start, end) {
for(let i = start; i < end; i++) {
if(a[i] !== b[i]) {
print(`${i}: ${a[i]} !== ${b[i]}`);
passed = false;
return false;
}
}
return true;
}
if(passed) {
print("PASSED");
} else {
print("FAILED");
}