| Index: runtime/vm/flow_graph_compiler.cc
|
| ===================================================================
|
| --- runtime/vm/flow_graph_compiler.cc (revision 15478)
|
| +++ runtime/vm/flow_graph_compiler.cc (working copy)
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "vm/flow_graph_compiler.h"
|
|
|
| +#include "vm/cha.h"
|
| #include "vm/dart_entry.h"
|
| #include "vm/debugger.h"
|
| #include "vm/deopt_instructions.h"
|
| @@ -28,6 +29,7 @@
|
| DECLARE_FLAG(bool, propagate_ic_data);
|
| DECLARE_FLAG(bool, report_usage_count);
|
| DECLARE_FLAG(int, optimization_counter_threshold);
|
| +DECLARE_FLAG(bool, use_cha);
|
|
|
| void CompilerDeoptInfo::BuildReturnAddress(DeoptInfoBuilder* builder,
|
| const Function& function,
|
| @@ -1004,4 +1006,28 @@
|
| }
|
| }
|
|
|
| +
|
| +// Returns true if checking against this type is a direct class id comparison.
|
| +bool FlowGraphCompiler::TypeCheckAsClassEquality(const AbstractType& type) {
|
| + ASSERT(type.IsFinalized() && !type.IsMalformed());
|
| + // Requires CHA, which can be applied in optimized code only,
|
| + if (!FLAG_use_cha || !is_optimizing()) return false;
|
| + if (!type.IsInstantiated()) return false;
|
| + const Class& type_class = Class::Handle(type.type_class());
|
| + // Could be an interface check?
|
| + if (type_class.is_implemented()) return false;
|
| + const intptr_t type_cid = type_class.id();
|
| + if (CHA::HasSubclasses(type_cid)) return false;
|
| + if (type_class.HasTypeArguments()) {
|
| + // Only raw types can be directly compared, thus disregarding type
|
| + // arguments.
|
| + const AbstractTypeArguments& type_arguments =
|
| + AbstractTypeArguments::Handle(type.arguments());
|
| + const bool is_raw_type = type_arguments.IsNull() ||
|
| + type_arguments.IsRaw(type_arguments.Length());
|
| + return is_raw_type;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| } // namespace dart
|
|
|