[Torque] Do Witness Rechecks() at loop starts

Since these Recheck() calls are usually combined with a bailout,
doing them at the end of loops means we have to increment one or
more bailout variables, which is hard to understand.

Change-Id: I595ea592f31762da5abd85bfa7556eb39e3c9430
Reviewed-on: https://chromium-review.googlesource.com/c/1478694
Reviewed-by: Tobias Tebbi <tebbi@chromium.org>
Commit-Queue: Michael Stanton <mvstanton@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59727}
This commit is contained in:
Mike Stanton 2019-02-20 11:23:44 +01:00 committed by Commit Bot
parent 723b16b018
commit 26a2aee384
5 changed files with 10 additions and 5 deletions

View File

@ -92,6 +92,8 @@ namespace array {
// Build a fast loop over the smi array.
for (; k < len; k++) {
fastO.Recheck() otherwise goto Bailout(k);
// Ensure that we haven't walked beyond a possibly updated length.
if (k >= fastO.Get().length) goto Bailout(k);
@ -105,7 +107,6 @@ namespace array {
}
}
label FoundHole {}
fastO.Recheck() otherwise goto Bailout(k + 1);
}
return True;
}

View File

@ -107,6 +107,8 @@ namespace array_filter {
// Build a fast loop over the smi array.
for (; k < len; k++) {
fastO.Recheck() otherwise goto Bailout(k, to);
// Ensure that we haven't walked beyond a possibly updated length.
if (k >= fastO.Get().length) goto Bailout(k, to);
const value: Object = LoadElementNoHole<FixedArrayType>(fastO.Get(), k)
@ -128,7 +130,6 @@ namespace array_filter {
}
to = to + 1;
}
fastO.Recheck() otherwise goto Bailout(k + 1, to);
}
}

View File

@ -77,12 +77,13 @@ namespace array_foreach {
// Build a fast loop over the smi array.
for (; k < len; k++) {
fastO.Recheck() otherwise goto Bailout(k);
// Ensure that we haven't walked beyond a possibly updated length.
if (k >= fastO.Get().length) goto Bailout(k);
const value: Object = LoadElementNoHole<FixedArrayType>(fastO.Get(), k)
otherwise continue;
Call(context, callbackfn, thisArg, value, k, fastO.Get());
fastO.Recheck() otherwise goto Bailout(k + 1);
}
}

View File

@ -191,6 +191,8 @@ namespace array_map {
// Build a fast loop over the smi array.
// 7. Repeat, while k < len.
for (; k < len; k++) {
fastO.Recheck() otherwise goto Bailout(v, k);
// Ensure that we haven't walked beyond a possibly updated length.
if (k >= fastO.Get().length) goto Bailout(v, k);
@ -200,7 +202,6 @@ namespace array_map {
const result: Object =
Call(context, callbackfn, thisArg, value, k, fastO.Get());
v.StoreResult(k, result);
fastO.Recheck() otherwise goto Bailout(v, k + 1);
}
label FoundHole {
// Our output array must necessarily be holey because of holes in

View File

@ -92,6 +92,8 @@ namespace array {
// Build a fast loop over the smi array.
for (; k < len; k++) {
fastO.Recheck() otherwise goto Bailout(k);
// Ensure that we haven't walked beyond a possibly updated length.
if (k >= fastO.Get().length) goto Bailout(k);
@ -105,7 +107,6 @@ namespace array {
}
}
label FoundHole {}
fastO.Recheck() otherwise goto Bailout(k + 1);
}
return False;
}