| Index: src/compiler/type-hint-analyzer.cc
|
| diff --git a/src/compiler/type-hint-analyzer.cc b/src/compiler/type-hint-analyzer.cc
|
| index e86f94ab9f531e973437940a878e2bc723190594..42c4627b67bf50c3fbabd1837c13c9b1afef0ed9 100644
|
| --- a/src/compiler/type-hint-analyzer.cc
|
| +++ b/src/compiler/type-hint-analyzer.cc
|
| @@ -5,6 +5,7 @@
|
| #include "src/compiler/type-hint-analyzer.h"
|
|
|
| #include "src/assembler.h"
|
| +#include "src/code-stubs.h"
|
| #include "src/compiler/type-hints.h"
|
| #include "src/ic/ic-state.h"
|
|
|
| @@ -41,6 +42,32 @@ bool TypeHintAnalysis::GetBinaryOperationHints(
|
| }
|
|
|
|
|
| +bool TypeHintAnalysis::GetToBooleanHints(TypeFeedbackId id,
|
| + ToBooleanHints* hints) const {
|
| + auto i = infos_.find(id);
|
| + if (i == infos_.end()) return false;
|
| + Handle<Code> code = i->second;
|
| + DCHECK_EQ(Code::TO_BOOLEAN_IC, code->kind());
|
| + ToBooleanStub stub(code->GetIsolate(), code->extra_ic_state());
|
| +// TODO(bmeurer): Replace ToBooleanStub::Types with ToBooleanHints.
|
| +#define ASSERT_COMPATIBLE(NAME, Name) \
|
| + STATIC_ASSERT(1 << ToBooleanStub::NAME == \
|
| + static_cast<int>(ToBooleanHint::k##Name))
|
| + ASSERT_COMPATIBLE(UNDEFINED, Undefined);
|
| + ASSERT_COMPATIBLE(BOOLEAN, Boolean);
|
| + ASSERT_COMPATIBLE(NULL_TYPE, Null);
|
| + ASSERT_COMPATIBLE(SMI, SmallInteger);
|
| + ASSERT_COMPATIBLE(SPEC_OBJECT, Receiver);
|
| + ASSERT_COMPATIBLE(STRING, String);
|
| + ASSERT_COMPATIBLE(SYMBOL, Symbol);
|
| + ASSERT_COMPATIBLE(HEAP_NUMBER, HeapNumber);
|
| + ASSERT_COMPATIBLE(SIMD_VALUE, SimdValue);
|
| +#undef ASSERT_COMPATIBLE
|
| + *hints = ToBooleanHints(stub.types().ToIntegral());
|
| + return true;
|
| +}
|
| +
|
| +
|
| TypeHintAnalysis* TypeHintAnalyzer::Analyze(Handle<Code> code) {
|
| DisallowHeapAllocation no_gc;
|
| TypeHintAnalysis::Infos infos(zone());
|
| @@ -51,13 +78,13 @@ TypeHintAnalysis* TypeHintAnalyzer::Analyze(Handle<Code> code) {
|
| Address target_address = rinfo->target_address();
|
| Code* target = Code::GetCodeFromTargetAddress(target_address);
|
| switch (target->kind()) {
|
| - case Code::BINARY_OP_IC: {
|
| + case Code::BINARY_OP_IC:
|
| + case Code::TO_BOOLEAN_IC: {
|
| // Add this feedback to the {infos}.
|
| TypeFeedbackId id(static_cast<unsigned>(rinfo->data()));
|
| infos.insert(std::make_pair(id, handle(target, isolate)));
|
| break;
|
| }
|
| -
|
| default:
|
| // Ignore the remaining code objects.
|
| break;
|
|
|