зеркало из https://github.com/mozilla/gecko-dev.git
Bug 991457 - Don't DCE MLoadElement if it needs a hole check. r=h4writer
This commit is contained in:
Родитель
f22f8639ec
Коммит
70cd64ce28
|
@ -0,0 +1,64 @@
|
|||
function test() {
|
||||
this.init();
|
||||
for (var i=0; i<10; i++) {
|
||||
delete this.blocks[10][9];
|
||||
this.collapse_blocks();
|
||||
}
|
||||
this.look_for_holes();
|
||||
}
|
||||
test.prototype.init = function() {
|
||||
this.blocks = new Array(20);
|
||||
for (var x=0; x<this.blocks.length; x++) {
|
||||
this.blocks[x] = new Array(10);
|
||||
for (var y=0; y<this.blocks[x].length; y++) {
|
||||
this.blocks[x][y] = {};
|
||||
}
|
||||
}
|
||||
}
|
||||
test.prototype.move_block = function(x,y,x1,y1) {
|
||||
this.blocks[x][y] = this.blocks[x1][y1];
|
||||
if (this.blocks[x][y])
|
||||
delete this.blocks[x1][y1];
|
||||
}
|
||||
test.prototype.collapse_blocks = function() {
|
||||
var didSomething=0;
|
||||
do {
|
||||
didSomething=0;
|
||||
for (var x=0; x<this.blocks.length; x++)
|
||||
for (var y=1; y<this.blocks[x].length; y++) {
|
||||
if (!this.blocks[x][y] && this.blocks[x][y-1]) {
|
||||
this.move_block(x,y,x,y-1);
|
||||
didSomething=1;
|
||||
}
|
||||
}
|
||||
} while (didSomething);
|
||||
|
||||
do {
|
||||
didSomething = 0;
|
||||
for (var x=0; x<this.blocks.length-1; x++) {
|
||||
if (!this.blocks[x][9] && this.blocks[x+1][9]) {
|
||||
for (var y=0; y<this.blocks[x].length; y++)
|
||||
this.move_block(x,y,x+1,y);
|
||||
didSomething = 1;
|
||||
}
|
||||
}
|
||||
} while (didSomething);
|
||||
}
|
||||
test.prototype.look_for_holes = function() {
|
||||
var was_empty = false;
|
||||
var n_empty = 0;
|
||||
for (var x=0; x<this.blocks.length; x++) {
|
||||
var empty = true;
|
||||
for (var y=0; y<this.blocks[x].length; y++) {
|
||||
if (this.blocks[x][y]) {
|
||||
empty = false;
|
||||
n_empty++;
|
||||
}
|
||||
}
|
||||
if (was_empty)
|
||||
assertEq(empty, true);
|
||||
was_empty = empty;
|
||||
}
|
||||
assertEq(n_empty, 190);
|
||||
}
|
||||
new test();
|
|
@ -5846,6 +5846,12 @@ class MLoadElement
|
|||
needsHoleCheck_(needsHoleCheck),
|
||||
loadDoubles_(loadDoubles)
|
||||
{
|
||||
if (needsHoleCheck) {
|
||||
// Uses may be optimized away based on this instruction's result
|
||||
// type. This means it's invalid to DCE this instruction, as we
|
||||
// have to invalidate when we read a hole.
|
||||
setGuard();
|
||||
}
|
||||
setResultType(MIRType_Value);
|
||||
setMovable();
|
||||
JS_ASSERT(elements->type() == MIRType_Elements);
|
||||
|
|
Загрузка…
Ссылка в новой задаче