| Index: runtime/vm/intermediate_language.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language.cc (revision 29797)
|
| +++ runtime/vm/intermediate_language.cc (working copy)
|
| @@ -24,16 +24,12 @@
|
|
|
| namespace dart {
|
|
|
| -DEFINE_FLAG(int, max_equality_polymorphic_checks, 32,
|
| - "Maximum number of polymorphic checks in equality operator,"
|
| - " otherwise use megamorphic dispatch.");
|
| DEFINE_FLAG(bool, new_identity_spec, true,
|
| "Use new identity check rules for numbers.");
|
| DEFINE_FLAG(bool, propagate_ic_data, true,
|
| "Propagate IC data from unoptimized to optimized IC calls.");
|
| DECLARE_FLAG(bool, enable_type_checks);
|
| DECLARE_FLAG(bool, eliminate_type_checks);
|
| -DECLARE_FLAG(int, max_polymorphic_checks);
|
| DECLARE_FLAG(bool, trace_optimization);
|
| DECLARE_FLAG(bool, trace_constant_propagation);
|
| DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
|
| @@ -170,6 +166,7 @@
|
| (result_cid() == other_op->result_cid());
|
| }
|
|
|
| +
|
| bool BinarySmiOpInstr::AttributesEqual(Instruction* other) const {
|
| BinarySmiOpInstr* other_op = other->AsBinarySmiOp();
|
| ASSERT(other_op != NULL);
|
| @@ -1119,21 +1116,6 @@
|
| }
|
|
|
|
|
| -bool EqualityCompareInstr::IsPolymorphic() const {
|
| - return HasICData() &&
|
| - (ic_data()->NumberOfChecks() > 0) &&
|
| - (ic_data()->NumberOfChecks() <= FLAG_max_polymorphic_checks);
|
| -}
|
| -
|
| -
|
| -bool EqualityCompareInstr::IsCheckedStrictEqual() const {
|
| - if (!HasICData()) return false;
|
| - return ic_data()->AllTargetsHaveSameOwner(kInstanceCid) &&
|
| - (unary_ic_data_->NumberOfChecks() <=
|
| - FLAG_max_equality_polymorphic_checks);
|
| -}
|
| -
|
| -
|
| bool BinarySmiOpInstr::CanDeoptimize() const {
|
| if (FLAG_throw_on_javascript_int_overflow && (Smi::kBits > 32)) {
|
| // If Smi's are bigger than 32-bits, then the instruction could deoptimize
|
| @@ -1542,9 +1524,9 @@
|
|
|
| Definition* BooleanNegateInstr::Canonicalize(FlowGraph* flow_graph) {
|
| Definition* defn = value()->definition();
|
| - if (defn->IsComparison() &&
|
| - (value()->Type()->ToCid() == kBoolCid) &&
|
| - defn->HasOnlyUse(value())) {
|
| + if (defn->IsComparison() && defn->HasOnlyUse(value())) {
|
| + // Comparisons always have a bool result.
|
| + ASSERT(value()->Type()->ToCid() == kBoolCid);
|
| defn->AsComparison()->NegateComparison();
|
| return defn;
|
| }
|
| @@ -1613,7 +1595,7 @@
|
| (other->Type()->ToCid() == kBoolCid)) {
|
| return other_defn;
|
| }
|
| - // Handle e !== true
|
| + // Handle e !== true.
|
| if ((kind == Token::kNE_STRICT) &&
|
| (constant.raw() == Bool::True().raw()) &&
|
| other_defn->IsComparison() &&
|
| @@ -1622,6 +1604,7 @@
|
| *negated = true;
|
| return other_defn;
|
| }
|
| + // Handle e === false.
|
| if ((kind == Token::kEQ_STRICT) &&
|
| (constant.raw() == Bool::False().raw()) &&
|
| other_defn->IsComparison() &&
|
| @@ -1666,6 +1649,9 @@
|
| }
|
| RemoveEnvironment();
|
| flow_graph->CopyDeoptTarget(this, comp);
|
| + // Unlink environment from the comparison since it is copied to the
|
| + // branch instruction.
|
| + comp->RemoveEnvironment();
|
|
|
| comp->RemoveFromGraph();
|
| SetComparison(comp);
|
|
|