Commit a55608d8 authored by Tobias Tebbi's avatar Tobias Tebbi Committed by Commit Bot

Reland "[csa] disable selected bounds checks for remaining regressions"

This is a reland of c3148664

Original change's description:
> [csa] disable selected bounds checks for remaining regressions
>
> Bug: chromium:932919
> TBR: jarin@chromium.org
> Change-Id: Id1125dcd2978f790af4cf00125bcbb94741d0bf8
> Reviewed-on: https://chromium-review.googlesource.com/c/1480387
> Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
> Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
> Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> Reviewed-by: Leszek Swirski <leszeks@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#59773}

Bug: chromium:932919
Change-Id: Ifb115ded2ff272abae4fba557ef669eee8e3c687
TBR: tebbi@chromium.org
Reviewed-on: https://chromium-review.googlesource.com/c/1481746Reviewed-by: 's avatarSathya Gunasekaran <gsathya@chromium.org>
Commit-Queue: Sathya Gunasekaran <gsathya@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59781}
parent f1b21a10
This diff is collapsed.
...@@ -1925,9 +1925,9 @@ void RegExpBuiltinsAssembler::RegExpPrototypeMatchBody(Node* const context, ...@@ -1925,9 +1925,9 @@ void RegExpBuiltinsAssembler::RegExpPrototypeMatchBody(Node* const context,
RegExpPrototypeExecBodyWithoutResult(CAST(context), CAST(regexp), RegExpPrototypeExecBodyWithoutResult(CAST(context), CAST(regexp),
string, &if_didnotmatch, true); string, &if_didnotmatch, true);
Node* const match_from = LoadFixedArrayElement( Node* const match_from = UnsafeLoadFixedArrayElement(
match_indices, RegExpMatchInfo::kFirstCaptureIndex); match_indices, RegExpMatchInfo::kFirstCaptureIndex);
Node* const match_to = LoadFixedArrayElement( Node* const match_to = UnsafeLoadFixedArrayElement(
match_indices, RegExpMatchInfo::kFirstCaptureIndex + 1); match_indices, RegExpMatchInfo::kFirstCaptureIndex + 1);
var_match.Bind(CallBuiltin(Builtins::kSubString, context, string, var_match.Bind(CallBuiltin(Builtins::kSubString, context, string,
...@@ -2403,7 +2403,7 @@ void RegExpBuiltinsAssembler::RegExpPrototypeSplitBody(Node* const context, ...@@ -2403,7 +2403,7 @@ void RegExpBuiltinsAssembler::RegExpPrototypeSplitBody(Node* const context,
length, allocation_site, mode); length, allocation_site, mode);
TNode<FixedArray> fixed_array = CAST(LoadElements(result)); TNode<FixedArray> fixed_array = CAST(LoadElements(result));
StoreFixedArrayElement(fixed_array, 0, string); UnsafeStoreFixedArrayElement(fixed_array, 0, string);
Return(result); Return(result);
} }
...@@ -2456,7 +2456,7 @@ void RegExpBuiltinsAssembler::RegExpPrototypeSplitBody(Node* const context, ...@@ -2456,7 +2456,7 @@ void RegExpBuiltinsAssembler::RegExpPrototypeSplitBody(Node* const context,
} }
TNode<FixedArray> match_indices = CAST(match_indices_ho); TNode<FixedArray> match_indices = CAST(match_indices_ho);
TNode<Smi> const match_from = CAST(LoadFixedArrayElement( TNode<Smi> const match_from = CAST(UnsafeLoadFixedArrayElement(
match_indices, RegExpMatchInfo::kFirstCaptureIndex)); match_indices, RegExpMatchInfo::kFirstCaptureIndex));
// We're done if the match starts beyond the string. // We're done if the match starts beyond the string.
...@@ -2466,7 +2466,7 @@ void RegExpBuiltinsAssembler::RegExpPrototypeSplitBody(Node* const context, ...@@ -2466,7 +2466,7 @@ void RegExpBuiltinsAssembler::RegExpPrototypeSplitBody(Node* const context,
BIND(&next); BIND(&next);
} }
TNode<Smi> const match_to = CAST(LoadFixedArrayElement( TNode<Smi> const match_to = CAST(UnsafeLoadFixedArrayElement(
match_indices, RegExpMatchInfo::kFirstCaptureIndex + 1)); match_indices, RegExpMatchInfo::kFirstCaptureIndex + 1));
// Advance index and continue if the match is empty. // Advance index and continue if the match is empty.
......
...@@ -27,7 +27,7 @@ void GrowableFixedArray::Push(TNode<Object> const value) { ...@@ -27,7 +27,7 @@ void GrowableFixedArray::Push(TNode<Object> const value) {
BIND(&store); BIND(&store);
{ {
TNode<FixedArray> const array = var_array_.value(); TNode<FixedArray> const array = var_array_.value();
StoreFixedArrayElement(array, length, value); UnsafeStoreFixedArrayElement(array, length, value);
var_length_ = IntPtrAdd(length, IntPtrConstant(1)); var_length_ = IntPtrAdd(length, IntPtrConstant(1));
} }
......
...@@ -6742,7 +6742,7 @@ TNode<String> CodeStubAssembler::StringFromSingleCharCode(TNode<Int32T> code) { ...@@ -6742,7 +6742,7 @@ TNode<String> CodeStubAssembler::StringFromSingleCharCode(TNode<Int32T> code) {
// cache already. // cache already.
Label if_entryisundefined(this, Label::kDeferred), Label if_entryisundefined(this, Label::kDeferred),
if_entryisnotundefined(this); if_entryisnotundefined(this);
Node* entry = LoadFixedArrayElement(cache, code_index); Node* entry = UnsafeLoadFixedArrayElement(cache, code_index);
Branch(IsUndefined(entry), &if_entryisundefined, &if_entryisnotundefined); Branch(IsUndefined(entry), &if_entryisundefined, &if_entryisnotundefined);
BIND(&if_entryisundefined); BIND(&if_entryisundefined);
...@@ -8414,7 +8414,8 @@ void CodeStubAssembler::NameDictionaryLookup( ...@@ -8414,7 +8414,8 @@ void CodeStubAssembler::NameDictionaryLookup(
TNode<IntPtrT> index = EntryToIndex<Dictionary>(entry); TNode<IntPtrT> index = EntryToIndex<Dictionary>(entry);
*var_name_index = index; *var_name_index = index;
TNode<HeapObject> current = CAST(LoadFixedArrayElement(dictionary, index)); TNode<HeapObject> current =
CAST(UnsafeLoadFixedArrayElement(dictionary, index));
GotoIf(WordEqual(current, undefined), if_not_found); GotoIf(WordEqual(current, undefined), if_not_found);
current = LoadName<Dictionary>(current); current = LoadName<Dictionary>(current);
GotoIf(WordEqual(current, unique_name), if_found); GotoIf(WordEqual(current, unique_name), if_found);
...@@ -8525,7 +8526,7 @@ void CodeStubAssembler::NumberDictionaryLookup( ...@@ -8525,7 +8526,7 @@ void CodeStubAssembler::NumberDictionaryLookup(
TNode<IntPtrT> entry = var_entry->value(); TNode<IntPtrT> entry = var_entry->value();
TNode<IntPtrT> index = EntryToIndex<NumberDictionary>(entry); TNode<IntPtrT> index = EntryToIndex<NumberDictionary>(entry);
Node* current = LoadFixedArrayElement(dictionary, index); Node* current = UnsafeLoadFixedArrayElement(dictionary, index);
GotoIf(WordEqual(current, undefined), if_not_found); GotoIf(WordEqual(current, undefined), if_not_found);
Label next_probe(this); Label next_probe(this);
{ {
...@@ -9613,7 +9614,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map, ...@@ -9613,7 +9614,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map,
GotoIfNot(UintPtrLessThan(intptr_index, length), &if_oob); GotoIfNot(UintPtrLessThan(intptr_index, length), &if_oob);
TNode<Object> element = LoadFixedArrayElement(elements, intptr_index); TNode<Object> element = UnsafeLoadFixedArrayElement(elements, intptr_index);
TNode<Oddball> the_hole = TheHoleConstant(); TNode<Oddball> the_hole = TheHoleConstant();
Branch(WordEqual(element, the_hole), if_not_found, if_found); Branch(WordEqual(element, the_hole), if_not_found, if_found);
} }
......
...@@ -1027,11 +1027,20 @@ class V8_EXPORT_PRIVATE CodeStubAssembler ...@@ -1027,11 +1027,20 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
CheckBounds::kDebugOnly); CheckBounds::kDebugOnly);
} }
TNode<Object> LoadFixedArrayElement(TNode<FixedArray> object, TNode<Object> LoadFixedArrayElement(
TNode<IntPtrT> index, TNode<FixedArray> object, TNode<IntPtrT> index,
LoadSensitivity needs_poisoning) { LoadSensitivity needs_poisoning,
CheckBounds check_bounds = CheckBounds::kAlways) {
return LoadFixedArrayElement(object, index, 0, INTPTR_PARAMETERS, return LoadFixedArrayElement(object, index, 0, INTPTR_PARAMETERS,
needs_poisoning); needs_poisoning, check_bounds);
}
// This doesn't emit a bounds-check. As part of the security-performance
// tradeoff, only use it if it is performance critical.
TNode<Object> UnsafeLoadFixedArrayElement(TNode<FixedArray> object,
TNode<IntPtrT> index,
LoadSensitivity needs_poisoning) {
return LoadFixedArrayElement(object, index, needs_poisoning,
CheckBounds::kDebugOnly);
} }
TNode<Object> LoadFixedArrayElement( TNode<Object> LoadFixedArrayElement(
...@@ -2613,7 +2622,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler ...@@ -2613,7 +2622,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
template <class Dictionary> template <class Dictionary>
TNode<Smi> GetCapacity(TNode<Dictionary> dictionary) { TNode<Smi> GetCapacity(TNode<Dictionary> dictionary) {
return CAST(LoadFixedArrayElement(dictionary, Dictionary::kCapacityIndex)); return CAST(
UnsafeLoadFixedArrayElement(dictionary, Dictionary::kCapacityIndex));
} }
template <class Dictionary> template <class Dictionary>
......
...@@ -1796,13 +1796,14 @@ void AccessorAssembler::EmitElementLoad( ...@@ -1796,13 +1796,14 @@ void AccessorAssembler::EmitElementLoad(
BIND(&if_fast_packed); BIND(&if_fast_packed);
{ {
Comment("fast packed elements"); Comment("fast packed elements");
exit_point->Return(LoadFixedArrayElement(CAST(elements), intptr_index)); exit_point->Return(
UnsafeLoadFixedArrayElement(CAST(elements), intptr_index));
} }
BIND(&if_fast_holey); BIND(&if_fast_holey);
{ {
Comment("fast holey elements"); Comment("fast holey elements");
Node* element = LoadFixedArrayElement(CAST(elements), intptr_index); Node* element = UnsafeLoadFixedArrayElement(CAST(elements), intptr_index);
GotoIf(WordEqual(element, TheHoleConstant()), if_hole); GotoIf(WordEqual(element, TheHoleConstant()), if_hole);
exit_point->Return(element); exit_point->Return(element);
} }
......
...@@ -648,8 +648,8 @@ Node* InterpreterAssembler::BytecodeOperandIntrinsicId(int operand_index) { ...@@ -648,8 +648,8 @@ Node* InterpreterAssembler::BytecodeOperandIntrinsicId(int operand_index) {
Node* InterpreterAssembler::LoadConstantPoolEntry(Node* index) { Node* InterpreterAssembler::LoadConstantPoolEntry(Node* index) {
TNode<FixedArray> constant_pool = CAST(LoadObjectField( TNode<FixedArray> constant_pool = CAST(LoadObjectField(
BytecodeArrayTaggedPointer(), BytecodeArray::kConstantPoolOffset)); BytecodeArrayTaggedPointer(), BytecodeArray::kConstantPoolOffset));
return LoadFixedArrayElement(constant_pool, UncheckedCast<IntPtrT>(index), return UnsafeLoadFixedArrayElement(
LoadSensitivity::kCritical); constant_pool, UncheckedCast<IntPtrT>(index), LoadSensitivity::kCritical);
} }
Node* InterpreterAssembler::LoadAndUntagConstantPoolEntry(Node* index) { Node* InterpreterAssembler::LoadAndUntagConstantPoolEntry(Node* index) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment