Skip to content

Commit

Permalink
[interpreter] Remove unused interpreter intrinsics
Browse files Browse the repository at this point in the history
This also removes intrinsics that were just used in tests. It keeps
InlineIncBlockCounter for now because it's a less straightforward.

Change-Id: I77e55d7a746294892d0fd7ab577ebf8eb42f1f08
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2953195
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Reviewed-by: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/master@{#75217}
  • Loading branch information
verwaest authored and V8 LUCI CQ committed Jun 17, 2021
1 parent 11f7e43 commit 863a2d6
Show file tree
Hide file tree
Showing 23 changed files with 41 additions and 446 deletions.
63 changes: 0 additions & 63 deletions src/baseline/baseline-compiler.cc
Expand Up @@ -1274,56 +1274,6 @@ void BaselineCompiler::VisitInvokeIntrinsic() {
}
}

void BaselineCompiler::VisitIntrinsicIsJSReceiver(
interpreter::RegisterList args) {
SelectBooleanConstant(
kInterpreterAccumulatorRegister,
[&](Label* is_true, Label::Distance distance) {
BaselineAssembler::ScratchRegisterScope scratch_scope(&basm_);
__ LoadRegister(kInterpreterAccumulatorRegister, args[0]);

Label is_smi;
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);

// If we ever added more instance types after LAST_JS_RECEIVER_TYPE,
// this would have to become a range check.
STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
__ JumpIfObjectType(Condition::kGreaterThanEqual,
kInterpreterAccumulatorRegister,
FIRST_JS_RECEIVER_TYPE,
scratch_scope.AcquireScratch(), is_true, distance);

__ Bind(&is_smi);
});
}

void BaselineCompiler::VisitIntrinsicIsArray(interpreter::RegisterList args) {
SelectBooleanConstant(
kInterpreterAccumulatorRegister,
[&](Label* is_true, Label::Distance distance) {
BaselineAssembler::ScratchRegisterScope scratch_scope(&basm_);
__ LoadRegister(kInterpreterAccumulatorRegister, args[0]);

Label is_smi;
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);

__ JumpIfObjectType(Condition::kEqual, kInterpreterAccumulatorRegister,
JS_ARRAY_TYPE, scratch_scope.AcquireScratch(),
is_true, distance);

__ Bind(&is_smi);
});
}

void BaselineCompiler::VisitIntrinsicIsSmi(interpreter::RegisterList args) {
SelectBooleanConstant(
kInterpreterAccumulatorRegister,
[&](Label* is_true, Label::Distance distance) {
__ LoadRegister(kInterpreterAccumulatorRegister, args[0]);
__ JumpIfSmi(kInterpreterAccumulatorRegister, is_true, distance);
});
}

void BaselineCompiler::VisitIntrinsicCopyDataProperties(
interpreter::RegisterList args) {
CallBuiltin<Builtin::kCopyDataProperties>(args);
Expand All @@ -1334,19 +1284,6 @@ void BaselineCompiler::VisitIntrinsicCreateIterResultObject(
CallBuiltin<Builtin::kCreateIterResultObject>(args);
}

void BaselineCompiler::VisitIntrinsicHasProperty(
interpreter::RegisterList args) {
CallBuiltin<Builtin::kHasProperty>(args);
}

void BaselineCompiler::VisitIntrinsicToLength(interpreter::RegisterList args) {
CallBuiltin<Builtin::kToLength>(args);
}

void BaselineCompiler::VisitIntrinsicToObject(interpreter::RegisterList args) {
CallBuiltin<Builtin::kToObject>(args);
}

void BaselineCompiler::VisitIntrinsicCall(interpreter::RegisterList args) {
// First argument register contains the function target.
__ LoadRegister(kJavaScriptCallTargetRegister, args.first_register());
Expand Down
14 changes: 0 additions & 14 deletions src/compiler/js-intrinsic-lowering.cc
Expand Up @@ -74,16 +74,6 @@ Reduction JSIntrinsicLowering::Reduce(Node* node) {
return ReduceAsyncGeneratorYield(node);
case Runtime::kInlineGeneratorGetResumeMode:
return ReduceGeneratorGetResumeMode(node);
case Runtime::kInlineIsArray:
return ReduceIsInstanceType(node, JS_ARRAY_TYPE);
case Runtime::kInlineIsJSReceiver:
return ReduceIsJSReceiver(node);
case Runtime::kInlineIsSmi:
return ReduceIsSmi(node);
case Runtime::kInlineToLength:
return ReduceToLength(node);
case Runtime::kInlineToObject:
return ReduceToObject(node);
case Runtime::kInlineCall:
return ReduceCall(node);
case Runtime::kInlineIncBlockCounter:
Expand Down Expand Up @@ -272,10 +262,6 @@ Reduction JSIntrinsicLowering::ReduceIsJSReceiver(Node* node) {
}


Reduction JSIntrinsicLowering::ReduceIsSmi(Node* node) {
return Change(node, simplified()->ObjectIsSmi());
}

Reduction JSIntrinsicLowering::ReduceTurbofanStaticAssert(Node* node) {
if (FLAG_always_opt) {
// Ignore static asserts, as we most likely won't have enough information
Expand Down
1 change: 0 additions & 1 deletion src/compiler/js-intrinsic-lowering.h
Expand Up @@ -57,7 +57,6 @@ class V8_EXPORT_PRIVATE JSIntrinsicLowering final
Reduction ReduceGeneratorGetResumeMode(Node* node);
Reduction ReduceIsInstanceType(Node* node, InstanceType instance_type);
Reduction ReduceIsJSReceiver(Node* node);
Reduction ReduceIsSmi(Node* node);
Reduction ReduceIsBeingInterpreted(Node* node);
Reduction ReduceTurbofanStaticAssert(Node* node);
Reduction ReduceVerifyType(Node* node);
Expand Down
4 changes: 0 additions & 4 deletions src/compiler/linkage.cc
Expand Up @@ -260,10 +260,6 @@ bool Linkage::NeedsFrameStateInput(Runtime::FunctionId function) {
case Runtime::kInlineGeneratorClose:
case Runtime::kInlineGeneratorGetResumeMode:
case Runtime::kInlineCreateJSGeneratorObject:
case Runtime::kInlineIsArray:
case Runtime::kInlineIsJSReceiver:
case Runtime::kInlineIsRegExp:
case Runtime::kInlineIsSmi:
return false;

default:
Expand Down
13 changes: 0 additions & 13 deletions src/compiler/typer.cc
Expand Up @@ -1825,21 +1825,8 @@ Type Typer::Visitor::TypeJSCallWithSpread(Node* node) {

Type Typer::Visitor::TypeJSCallRuntime(Node* node) {
switch (CallRuntimeParametersOf(node->op()).id()) {
case Runtime::kInlineIsJSReceiver:
return TypeUnaryOp(node, ObjectIsReceiver);
case Runtime::kInlineIsSmi:
return TypeUnaryOp(node, ObjectIsSmi);
case Runtime::kInlineIsArray:
case Runtime::kInlineIsRegExp:
return Type::Boolean();
case Runtime::kInlineCreateIterResultObject:
return Type::OtherObject();
case Runtime::kInlineToLength:
return TypeUnaryOp(node, ToLength);
case Runtime::kInlineToNumber:
return TypeUnaryOp(node, ToNumber);
case Runtime::kInlineToObject:
return TypeUnaryOp(node, ToObject);
case Runtime::kHasInPrototypeChain:
return Type::Boolean();
default:
Expand Down
1 change: 0 additions & 1 deletion src/debug/debug-evaluate.cc
Expand Up @@ -396,7 +396,6 @@ bool IntrinsicHasNoSideEffect(Runtime::FunctionId id) {
// Intrinsics with inline versions have to be allowlisted here a second time.
#define INLINE_INTRINSIC_ALLOWLIST(V) \
V(Call) \
V(IsJSReceiver) \
V(AsyncFunctionEnter) \
V(AsyncFunctionReject) \
V(AsyncFunctionResolve)
Expand Down
45 changes: 0 additions & 45 deletions src/interpreter/interpreter-intrinsics-generator.cc
Expand Up @@ -166,32 +166,6 @@ TNode<Object> IntrinsicsGenerator::IntrinsicAsBuiltinCall(
}
}

TNode<Object> IntrinsicsGenerator::IsJSReceiver(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
int arg_count) {
TNode<Object> input = __ LoadRegisterFromRegisterList(args, 0);
TNode<Oddball> result = __ Select<Oddball>(
__ TaggedIsSmi(input), [=] { return __ FalseConstant(); },
[=] {
return __ SelectBooleanConstant(__ IsJSReceiver(__ CAST(input)));
});
return result;
}

TNode<Object> IntrinsicsGenerator::IsArray(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
int arg_count) {
TNode<Object> input = __ LoadRegisterFromRegisterList(args, 0);
return IsInstanceType(input, JS_ARRAY_TYPE);
}

TNode<Object> IntrinsicsGenerator::IsSmi(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
int arg_count) {
TNode<Object> input = __ LoadRegisterFromRegisterList(args, 0);
return __ SelectBooleanConstant(__ TaggedIsSmi(input));
}

TNode<Object> IntrinsicsGenerator::CopyDataProperties(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
int arg_count) {
Expand All @@ -206,25 +180,6 @@ TNode<Object> IntrinsicsGenerator::CreateIterResultObject(
arg_count);
}

TNode<Object> IntrinsicsGenerator::HasProperty(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
int arg_count) {
return IntrinsicAsBuiltinCall(args, context, Builtin::kHasProperty,
arg_count);
}

TNode<Object> IntrinsicsGenerator::ToLength(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
int arg_count) {
return IntrinsicAsBuiltinCall(args, context, Builtin::kToLength, arg_count);
}

TNode<Object> IntrinsicsGenerator::ToObject(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
int arg_count) {
return IntrinsicAsBuiltinCall(args, context, Builtin::kToObject, arg_count);
}

TNode<Object> IntrinsicsGenerator::Call(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
int arg_count) {
Expand Down
44 changes: 19 additions & 25 deletions src/interpreter/interpreter-intrinsics.h
Expand Up @@ -13,31 +13,25 @@ namespace interpreter {

// List of supported intrisics, with upper case name, lower case name and
// expected number of arguments (-1 denoting argument count is variable).
#define INTRINSICS_LIST(V) \
V(AsyncFunctionAwaitCaught, async_function_await_caught, 2) \
V(AsyncFunctionAwaitUncaught, async_function_await_uncaught, 2) \
V(AsyncFunctionEnter, async_function_enter, 2) \
V(AsyncFunctionReject, async_function_reject, 3) \
V(AsyncFunctionResolve, async_function_resolve, 3) \
V(AsyncGeneratorAwaitCaught, async_generator_await_caught, 2) \
V(AsyncGeneratorAwaitUncaught, async_generator_await_uncaught, 2) \
V(AsyncGeneratorReject, async_generator_reject, 2) \
V(AsyncGeneratorResolve, async_generator_resolve, 3) \
V(AsyncGeneratorYield, async_generator_yield, 3) \
V(CreateJSGeneratorObject, create_js_generator_object, 2) \
V(GeneratorGetResumeMode, generator_get_resume_mode, 1) \
V(GeneratorClose, generator_close, 1) \
V(GetImportMetaObject, get_import_meta_object, 0) \
V(Call, call, -1) \
V(CopyDataProperties, copy_data_properties, 2) \
V(CreateIterResultObject, create_iter_result_object, 2) \
V(CreateAsyncFromSyncIterator, create_async_from_sync_iterator, 1) \
V(HasProperty, has_property, 2) \
V(IsArray, is_array, 1) \
V(IsJSReceiver, is_js_receiver, 1) \
V(IsSmi, is_smi, 1) \
V(ToLength, to_length, 1) \
V(ToObject, to_object, 1)
#define INTRINSICS_LIST(V) \
V(AsyncFunctionAwaitCaught, async_function_await_caught, 2) \
V(AsyncFunctionAwaitUncaught, async_function_await_uncaught, 2) \
V(AsyncFunctionEnter, async_function_enter, 2) \
V(AsyncFunctionReject, async_function_reject, 3) \
V(AsyncFunctionResolve, async_function_resolve, 3) \
V(AsyncGeneratorAwaitCaught, async_generator_await_caught, 2) \
V(AsyncGeneratorAwaitUncaught, async_generator_await_uncaught, 2) \
V(AsyncGeneratorReject, async_generator_reject, 2) \
V(AsyncGeneratorResolve, async_generator_resolve, 3) \
V(AsyncGeneratorYield, async_generator_yield, 3) \
V(CreateJSGeneratorObject, create_js_generator_object, 2) \
V(GeneratorGetResumeMode, generator_get_resume_mode, 1) \
V(GeneratorClose, generator_close, 1) \
V(GetImportMetaObject, get_import_meta_object, 0) \
V(Call, call, -1) \
V(CopyDataProperties, copy_data_properties, 2) \
V(CreateIterResultObject, create_iter_result_object, 2) \
V(CreateAsyncFromSyncIterator, create_async_from_sync_iterator, 1)

class IntrinsicsHelper {
public:
Expand Down
16 changes: 8 additions & 8 deletions src/runtime/runtime.h
Expand Up @@ -46,7 +46,7 @@ namespace internal {
F(ArrayIsArray, 1, 1) \
F(ArraySpeciesConstructor, 1, 1) \
F(GrowArrayElements, 2, 1) \
I(IsArray, 1, 1) \
F(IsArray, 1, 1) \
F(NewArray, -1 /* >= 3 */, 1) \
F(NormalizeElements, 1, 1) \
F(TransitionElementsKind, 2, 1) \
Expand Down Expand Up @@ -276,7 +276,7 @@ namespace internal {
F(ArrayBufferMaxByteLength, 0, 1) \
F(GetHoleNaNLower, 0, 1) \
F(GetHoleNaNUpper, 0, 1) \
I(IsSmi, 1, 1) \
F(IsSmi, 1, 1) \
F(MaxSmi, 0, 1) \
F(NumberToStringSlow, 1, 1) \
F(StringParseFloat, 1, 1) \
Expand Down Expand Up @@ -308,9 +308,9 @@ namespace internal {
F(GetProperty, -1 /* [2, 3] */, 1) \
F(HasFastPackedElements, 1, 1) \
F(HasInPrototypeChain, 2, 1) \
I(HasProperty, 2, 1) \
F(HasProperty, 2, 1) \
F(InternalSetPrototype, 2, 1) \
I(IsJSReceiver, 1, 1) \
F(IsJSReceiver, 1, 1) \
F(JSReceiverPreventExtensionsDontThrow, 1, 1) \
F(JSReceiverPreventExtensionsThrow, 1, 1) \
F(JSReceiverGetPrototypeOf, 1, 1) \
Expand Down Expand Up @@ -338,11 +338,11 @@ namespace internal {
F(ShrinkNameDictionary, 1, 1) \
F(ShrinkSwissNameDictionary, 1, 1) \
F(ToFastProperties, 1, 1) \
I(ToLength, 1, 1) \
F(ToLength, 1, 1) \
F(ToName, 1, 1) \
I(ToNumber, 1, 1) \
F(ToNumber, 1, 1) \
F(ToNumeric, 1, 1) \
I(ToObject, 1, 1) \
F(ToObject, 1, 1) \
F(ToString, 1, 1) \
F(TryMigrateInstance, 1, 1) \
F(SwissTableAdd, 4, 1) \
Expand Down Expand Up @@ -397,7 +397,7 @@ namespace internal {
F(SetPropertyWithReceiver, 4, 1)

#define FOR_EACH_INTRINSIC_REGEXP(F, I) \
I(IsRegExp, 1, 1) \
F(IsRegExp, 1, 1) \
F(RegExpBuildIndices, 3, 1) \
F(RegExpExec, 4, 1) \
F(RegExpExecTreatMatchAtEndAsFailure, 4, 1) \
Expand Down
21 changes: 0 additions & 21 deletions test/cctest/compiler/test-run-bytecode-graph-builder.cc
Expand Up @@ -633,27 +633,6 @@ TEST(BytecodeGraphBuilderCallRuntime) {
}
}

TEST(BytecodeGraphBuilderInvokeIntrinsic) {
HandleAndZoneScope scope;
Isolate* isolate = scope.main_isolate();
Factory* factory = isolate->factory();

ExpectedSnippet<1> snippets[] = {
{"function f(arg0) { return %_IsJSReceiver(arg0); }\nf()",
{factory->false_value(), factory->NewNumberFromInt(1)}},
{"function f(arg0) { return %_IsArray(arg0) }\nf(undefined)",
{factory->true_value(), BytecodeGraphTester::NewObject("[1, 2, 3]")}},
};

for (size_t i = 0; i < arraysize(snippets); i++) {
BytecodeGraphTester tester(isolate, snippets[i].code_snippet);
auto callable = tester.GetCallable<Handle<Object>>();
Handle<Object> return_value =
callable(snippets[i].parameter(0)).ToHandleChecked();
CHECK(return_value->SameValue(*snippets[i].return_value()));
}
}

void TestBytecodeGraphBuilderGlobals(size_t shard) {
HandleAndZoneScope scope;
Isolate* isolate = scope.main_isolate();
Expand Down
31 changes: 0 additions & 31 deletions test/cctest/compiler/test-run-intrinsics.cc
Expand Up @@ -20,37 +20,6 @@ TEST(Call) {
T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f"));
}

TEST(IsArray) {
FunctionTester T("(function(a) { return %_IsArray(a); })", flags);

T.CheckFalse(T.NewObject("new Date()"));
T.CheckFalse(T.NewObject("(function() {})"));
T.CheckTrue(T.NewObject("([1])"));
T.CheckFalse(T.NewObject("({})"));
T.CheckFalse(T.NewObject("(/x/)"));
T.CheckFalse(T.undefined());
T.CheckFalse(T.null());
T.CheckFalse(T.Val("x"));
T.CheckFalse(T.Val(1));
}


TEST(IsSmi) {
FunctionTester T("(function(a) { return %_IsSmi(a); })", flags);

T.CheckFalse(T.NewObject("new Date()"));
T.CheckFalse(T.NewObject("(function() {})"));
T.CheckFalse(T.NewObject("([1])"));
T.CheckFalse(T.NewObject("({})"));
T.CheckFalse(T.NewObject("(/x/)"));
T.CheckFalse(T.undefined());
T.CheckTrue(T.Val(1));
T.CheckFalse(T.Val(1.1));
T.CheckFalse(T.Val(-0.0));
T.CheckTrue(T.Val(-2));
T.CheckFalse(T.Val(-2.3));
}

} // namespace compiler
} // namespace internal
} // namespace v8

0 comments on commit 863a2d6

Please sign in to comment.