Index: runtime/vm/intermediate_language.cc |
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc |
index 20362bd71e3b98bfdac05cec95cedfb245b2ce7e..49126f9b6e7a7f8f578880ca69436b41cbcadcf5 100644 |
--- a/runtime/vm/intermediate_language.cc |
+++ b/runtime/vm/intermediate_language.cc |
@@ -29,12 +29,18 @@ |
namespace dart { |
-DEFINE_FLAG(bool, propagate_ic_data, true, |
- "Propagate IC data from unoptimized to optimized IC calls."); |
-DEFINE_FLAG(bool, two_args_smi_icd, true, |
- "Generate special IC stubs for two args Smi operations"); |
-DEFINE_FLAG(bool, unbox_numeric_fields, !USING_DBC, |
- "Support unboxed double and float32x4 fields."); |
+DEFINE_FLAG(bool, |
+ propagate_ic_data, |
+ true, |
+ "Propagate IC data from unoptimized to optimized IC calls."); |
+DEFINE_FLAG(bool, |
+ two_args_smi_icd, |
+ true, |
+ "Generate special IC stubs for two args Smi operations"); |
+DEFINE_FLAG(bool, |
+ unbox_numeric_fields, |
+ !USING_DBC, |
+ "Support unboxed double and float32x4 fields."); |
DECLARE_FLAG(bool, eliminate_type_checks); |
DECLARE_FLAG(bool, support_externalizable_strings); |
@@ -55,8 +61,7 @@ Definition::Definition(intptr_t deopt_id) |
ssa_temp_index_(-1), |
input_use_list_(NULL), |
env_use_list_(NULL), |
- constant_value_(NULL) { |
-} |
+ constant_value_(NULL) {} |
// A value in the constant propagation lattice. |
@@ -190,8 +195,7 @@ static bool AreAllChecksImmutable(const ICData& checks) { |
const intptr_t len = checks.NumberOfChecks(); |
for (intptr_t i = 0; i < len; i++) { |
if (checks.IsUsedAt(i)) { |
- if (Field::IsExternalizableCid( |
- checks.GetReceiverClassIdAt(i))) { |
+ if (Field::IsExternalizableCid(checks.GetReceiverClassIdAt(i))) { |
return false; |
} |
} |
@@ -202,15 +206,15 @@ static bool AreAllChecksImmutable(const ICData& checks) { |
EffectSet CheckClassInstr::Dependencies() const { |
// Externalization of strings via the API can change the class-id. |
- return !AreAllChecksImmutable(unary_checks()) ? |
- EffectSet::Externalization() : EffectSet::None(); |
+ return !AreAllChecksImmutable(unary_checks()) ? EffectSet::Externalization() |
+ : EffectSet::None(); |
} |
EffectSet CheckClassIdInstr::Dependencies() const { |
// Externalization of strings via the API can change the class-id. |
- return Field::IsExternalizableCid(cid_) ? |
- EffectSet::Externalization() : EffectSet::None(); |
+ return Field::IsExternalizableCid(cid_) ? EffectSet::Externalization() |
+ : EffectSet::None(); |
} |
@@ -277,16 +281,14 @@ bool CheckClassInstr::IsDenseMask(intptr_t mask) { |
bool LoadFieldInstr::IsUnboxedLoad() const { |
- return FLAG_unbox_numeric_fields |
- && (field() != NULL) |
- && FlowGraphCompiler::IsUnboxedField(*field()); |
+ return FLAG_unbox_numeric_fields && (field() != NULL) && |
+ FlowGraphCompiler::IsUnboxedField(*field()); |
} |
bool LoadFieldInstr::IsPotentialUnboxedLoad() const { |
- return FLAG_unbox_numeric_fields |
- && (field() != NULL) |
- && FlowGraphCompiler::IsPotentialUnboxedField(*field()); |
+ return FLAG_unbox_numeric_fields && (field() != NULL) && |
+ FlowGraphCompiler::IsPotentialUnboxedField(*field()); |
} |
@@ -309,21 +311,19 @@ Representation LoadFieldInstr::representation() const { |
bool StoreInstanceFieldInstr::IsUnboxedStore() const { |
- return FLAG_unbox_numeric_fields |
- && !field().IsNull() |
- && FlowGraphCompiler::IsUnboxedField(field()); |
+ return FLAG_unbox_numeric_fields && !field().IsNull() && |
+ FlowGraphCompiler::IsUnboxedField(field()); |
} |
bool StoreInstanceFieldInstr::IsPotentialUnboxedStore() const { |
- return FLAG_unbox_numeric_fields |
- && !field().IsNull() |
- && FlowGraphCompiler::IsPotentialUnboxedField(field()); |
+ return FLAG_unbox_numeric_fields && !field().IsNull() && |
+ FlowGraphCompiler::IsPotentialUnboxedField(field()); |
} |
Representation StoreInstanceFieldInstr::RequiredInputRepresentation( |
- intptr_t index) const { |
+ intptr_t index) const { |
ASSERT((index == 0) || (index == 1)); |
if ((index == 1) && IsUnboxedStore()) { |
const intptr_t cid = field().UnboxedFieldCid(); |
@@ -365,7 +365,7 @@ bool StrictCompareInstr::AttributesEqual(Instruction* other) const { |
StrictCompareInstr* other_op = other->AsStrictCompare(); |
ASSERT(other_op != NULL); |
return ComparisonInstr::AttributesEqual(other) && |
- (needs_number_check() == other_op->needs_number_check()); |
+ (needs_number_check() == other_op->needs_number_check()); |
} |
@@ -373,7 +373,7 @@ bool MathMinMaxInstr::AttributesEqual(Instruction* other) const { |
MathMinMaxInstr* other_op = other->AsMathMinMax(); |
ASSERT(other_op != NULL); |
return (op_kind() == other_op->op_kind()) && |
- (result_cid() == other_op->result_cid()); |
+ (result_cid() == other_op->result_cid()); |
} |
@@ -381,8 +381,8 @@ bool BinaryIntegerOpInstr::AttributesEqual(Instruction* other) const { |
ASSERT(other->tag() == tag()); |
BinaryIntegerOpInstr* other_op = other->AsBinaryIntegerOp(); |
return (op_kind() == other_op->op_kind()) && |
- (can_overflow() == other_op->can_overflow()) && |
- (is_truncating() == other_op->is_truncating()); |
+ (can_overflow() == other_op->can_overflow()) && |
+ (is_truncating() == other_op->is_truncating()); |
} |
@@ -396,10 +396,10 @@ bool LoadFieldInstr::AttributesEqual(Instruction* other) const { |
ASSERT(other_load != NULL); |
if (field() != NULL) { |
return (other_load->field() != NULL) && |
- (field()->raw() == other_load->field()->raw()); |
+ (field()->raw() == other_load->field()->raw()); |
} |
return (other_load->field() == NULL) && |
- (offset_in_bytes() == other_load->offset_in_bytes()); |
+ (offset_in_bytes() == other_load->offset_in_bytes()); |
} |
@@ -417,7 +417,8 @@ Instruction* InitStaticFieldInstr::Canonicalize(FlowGraph* flow_graph) { |
EffectSet LoadStaticFieldInstr::Dependencies() const { |
return (StaticField().is_final() && !FLAG_fields_may_be_reset) |
- ? EffectSet::None() : EffectSet::All(); |
+ ? EffectSet::None() |
+ : EffectSet::All(); |
} |
@@ -439,8 +440,7 @@ const Field& LoadStaticFieldInstr::StaticField() const { |
ConstantInstr::ConstantInstr(const Object& value, TokenPosition token_pos) |
- : value_(value), |
- token_pos_(token_pos) { |
+ : value_(value), token_pos_(token_pos) { |
// Check that the value is not an incorrect Integer representation. |
ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoSmi()); |
ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoInt64()); |
@@ -502,8 +502,7 @@ GraphEntryInstr::GraphEntryInstr(const ParsedFunction& parsed_function, |
osr_id_(osr_id), |
entry_count_(0), |
spill_slot_count_(0), |
- fixed_slot_count_(0) { |
-} |
+ fixed_slot_count_(0) {} |
ConstantInstr* GraphEntryInstr::constant_null() { |
@@ -535,9 +534,9 @@ bool GraphEntryInstr::IsCompiledForOsr() const { |
// ==== Support for visiting flow graphs. |
#define DEFINE_ACCEPT(ShortName) \ |
-void ShortName##Instr::Accept(FlowGraphVisitor* visitor) { \ |
- visitor->Visit##ShortName(this); \ |
-} |
+ void ShortName##Instr::Accept(FlowGraphVisitor* visitor) { \ |
+ visitor->Visit##ShortName(this); \ |
+ } |
FOR_EACH_INSTRUCTION(DEFINE_ACCEPT) |
@@ -622,7 +621,8 @@ BlockEntryInstr* Instruction::GetBlock() { |
// instruction. |
ASSERT(previous() != NULL); |
Instruction* result = previous(); |
- while (!result->IsBlockEntry()) result = result->previous(); |
+ while (!result->IsBlockEntry()) |
+ result = result->previous(); |
return result->AsBlockEntry(); |
} |
@@ -654,8 +654,7 @@ void FlowGraphVisitor::VisitBlocks() { |
bool Value::NeedsStoreBuffer() { |
- if (Type()->IsNull() || |
- (Type()->ToNullableCid() == kSmiCid) || |
+ if (Type()->IsNull() || (Type()->ToNullableCid() == kSmiCid) || |
(Type()->ToNullableCid() == kBoolCid)) { |
return false; |
} |
@@ -794,12 +793,10 @@ void Instruction::InheritDeoptTargetAfter(FlowGraph* flow_graph, |
Definition* result) { |
ASSERT(call->env() != NULL); |
deopt_id_ = Thread::ToDeoptAfter(call->deopt_id_); |
- call->env()->DeepCopyAfterTo(flow_graph->zone(), |
- this, |
- call->ArgumentCount(), |
- flow_graph->constant_dead(), |
- result != NULL ? result |
- : flow_graph->constant_dead()); |
+ call->env()->DeepCopyAfterTo( |
+ flow_graph->zone(), this, call->ArgumentCount(), |
+ flow_graph->constant_dead(), |
+ result != NULL ? result : flow_graph->constant_dead()); |
env()->set_deopt_id(deopt_id_); |
} |
@@ -923,10 +920,9 @@ static bool IsMarked(BlockEntryInstr* block, |
// Base class implementation used for JoinEntry and TargetEntry. |
-bool BlockEntryInstr::DiscoverBlock( |
- BlockEntryInstr* predecessor, |
- GrowableArray<BlockEntryInstr*>* preorder, |
- GrowableArray<intptr_t>* parent) { |
+bool BlockEntryInstr::DiscoverBlock(BlockEntryInstr* predecessor, |
+ GrowableArray<BlockEntryInstr*>* preorder, |
+ GrowableArray<intptr_t>* parent) { |
// If this block has a predecessor (i.e., is not the graph entry) we can |
// assume the preorder array is non-empty. |
ASSERT((predecessor == NULL) || !preorder->is_empty()); |
@@ -1011,9 +1007,7 @@ bool BlockEntryInstr::PruneUnreachable(GraphEntryInstr* graph_entry, |
// Recursively search the successors. |
for (intptr_t i = instr->SuccessorCount() - 1; i >= 0; --i) { |
- if (instr->SuccessorAt(i)->PruneUnreachable(graph_entry, |
- instr, |
- osr_id, |
+ if (instr->SuccessorAt(i)->PruneUnreachable(graph_entry, instr, osr_id, |
block_marks)) { |
return true; |
} |
@@ -1096,8 +1090,7 @@ void BlockEntryInstr::ReplaceAsPredecessorWith(BlockEntryInstr* new_block) { |
Value* pred_use = phi->InputAt(old_index); |
// Move uses between old and new. |
intptr_t step = (old_index < new_index) ? 1 : -1; |
- for (intptr_t use_idx = old_index; |
- use_idx != new_index; |
+ for (intptr_t use_idx = old_index; use_idx != new_index; |
use_idx += step) { |
phi->SetInputAt(use_idx, phi->InputAt(use_idx + step)); |
} |
@@ -1116,9 +1109,7 @@ void BlockEntryInstr::ClearAllInstructions() { |
} |
} |
UnuseAllInputs(); |
- for (ForwardInstructionIterator it(this); |
- !it.Done(); |
- it.Advance()) { |
+ for (ForwardInstructionIterator it(this); !it.Done(); it.Advance()) { |
it.Current()->UnuseAllInputs(); |
} |
} |
@@ -1239,24 +1230,22 @@ void Instruction::Goto(JoinEntryInstr* entry) { |
bool UnboxedIntConverterInstr::CanDeoptimize() const { |
- return (to() == kUnboxedInt32) && |
- !is_truncating() && |
- !RangeUtils::Fits(value()->definition()->range(), |
- RangeBoundary::kRangeBoundaryInt32); |
+ return (to() == kUnboxedInt32) && !is_truncating() && |
+ !RangeUtils::Fits(value()->definition()->range(), |
+ RangeBoundary::kRangeBoundaryInt32); |
} |
bool UnboxInt32Instr::CanDeoptimize() const { |
const intptr_t value_cid = value()->Type()->ToCid(); |
if (value_cid == kSmiCid) { |
- return (kSmiBits > 32) && |
- !is_truncating() && |
- !RangeUtils::Fits(value()->definition()->range(), |
- RangeBoundary::kRangeBoundaryInt32); |
+ return (kSmiBits > 32) && !is_truncating() && |
+ !RangeUtils::Fits(value()->definition()->range(), |
+ RangeBoundary::kRangeBoundaryInt32); |
} else if (value_cid == kMintCid) { |
return !is_truncating() && |
- !RangeUtils::Fits(value()->definition()->range(), |
- RangeBoundary::kRangeBoundaryInt32); |
+ !RangeUtils::Fits(value()->definition()->range(), |
+ RangeBoundary::kRangeBoundaryInt32); |
} else if (is_truncating() && value()->definition()->IsBoxInteger()) { |
return false; |
} else if ((kSmiBits < 32) && value()->Type()->IsInt()) { |
@@ -1293,7 +1282,7 @@ bool BinaryInt32OpInstr::CanDeoptimize() const { |
case Token::kSHL: |
return can_overflow() || |
- !RangeUtils::IsPositive(right()->definition()->range()); |
+ !RangeUtils::IsPositive(right()->definition()->range()); |
case Token::kMOD: { |
UNREACHABLE(); |
@@ -1317,7 +1306,7 @@ bool BinarySmiOpInstr::CanDeoptimize() const { |
case Token::kSHL: |
return can_overflow() || |
- !RangeUtils::IsPositive(right()->definition()->range()); |
+ !RangeUtils::IsPositive(right()->definition()->range()); |
case Token::kMOD: { |
Range* right_range = this->right()->definition()->range(); |
@@ -1355,8 +1344,8 @@ static intptr_t RepresentationBits(Representation r) { |
static int64_t RepresentationMask(Representation r) { |
- return static_cast<int64_t>( |
- static_cast<uint64_t>(-1) >> (64 - RepresentationBits(r))); |
+ return static_cast<int64_t>(static_cast<uint64_t>(-1) >> |
+ (64 - RepresentationBits(r))); |
} |
@@ -1403,10 +1392,9 @@ static bool ToIntegerConstant(Value* value, int64_t* result) { |
} |
-static Definition* CanonicalizeCommutativeDoubleArithmetic( |
- Token::Kind op, |
- Value* left, |
- Value* right) { |
+static Definition* CanonicalizeCommutativeDoubleArithmetic(Token::Kind op, |
+ Value* left, |
+ Value* right) { |
int64_t left_value; |
if (!ToIntegerConstant(left, &left_value)) { |
return NULL; |
@@ -1442,9 +1430,7 @@ Definition* DoubleToFloatInstr::Canonicalize(FlowGraph* flow_graph) { |
// Must only be used in Float32 StoreIndexedInstr or FloatToDoubleInstr or |
// Phis introduce by load forwarding. |
ASSERT(env_use_list() == NULL); |
- for (Value* use = input_use_list(); |
- use != NULL; |
- use = use->next_use()) { |
+ for (Value* use = input_use_list(); use != NULL; use = use->next_use()) { |
ASSERT(use->instruction()->IsPhi() || |
use->instruction()->IsFloatToDouble() || |
(use->instruction()->IsStoreIndexed() && |
@@ -1483,10 +1469,9 @@ Definition* BinaryDoubleOpInstr::Canonicalize(FlowGraph* flow_graph) { |
if ((op_kind() == Token::kMUL) && |
(left()->definition() == right()->definition())) { |
- MathUnaryInstr* math_unary = |
- new MathUnaryInstr(MathUnaryInstr::kDoubleSquare, |
- new Value(left()->definition()), |
- DeoptimizationTarget()); |
+ MathUnaryInstr* math_unary = new MathUnaryInstr( |
+ MathUnaryInstr::kDoubleSquare, new Value(left()->definition()), |
+ DeoptimizationTarget()); |
flow_graph->InsertBefore(this, math_unary, env(), FlowGraph::kValue); |
return math_unary; |
} |
@@ -1632,8 +1617,7 @@ RawInteger* UnaryIntegerOpInstr::Evaluate(const Integer& value) const { |
switch (op_kind()) { |
case Token::kNEGATE: |
- result = value.ArithmeticOp(Token::kMUL, |
- Smi::Handle(zone, Smi::New(-1)), |
+ result = value.ArithmeticOp(Token::kMUL, Smi::Handle(zone, Smi::New(-1)), |
Heap::kOld); |
break; |
@@ -1677,7 +1661,7 @@ RawInteger* BinaryIntegerOpInstr::Evaluate(const Integer& left, |
if (right.IsSmi() && right.AsInt64Value() == 0) { |
break; // Will throw. |
} |
- // Fall through. |
+ // Fall through. |
case Token::kADD: |
case Token::kSUB: |
case Token::kMUL: { |
@@ -1687,9 +1671,8 @@ RawInteger* BinaryIntegerOpInstr::Evaluate(const Integer& left, |
case Token::kSHL: |
case Token::kSHR: |
if (left.IsSmi() && right.IsSmi() && (Smi::Cast(right).Value() >= 0)) { |
- result = Smi::Cast(left).ShiftOp(op_kind(), |
- Smi::Cast(right), |
- Heap::kOld); |
+ result = |
+ Smi::Cast(left).ShiftOp(op_kind(), Smi::Cast(right), Heap::kOld); |
} |
break; |
case Token::kBIT_AND: |
@@ -1728,8 +1711,7 @@ Definition* BinaryIntegerOpInstr::CreateConstantResult(FlowGraph* flow_graph, |
const Integer& result) { |
Definition* result_defn = flow_graph->GetConstant(result); |
if (representation() != kTagged) { |
- result_defn = UnboxInstr::Create(representation(), |
- new Value(result_defn), |
+ result_defn = UnboxInstr::Create(representation(), new Value(result_defn), |
GetDeoptId()); |
flow_graph->InsertBefore(this, result_defn, env(), FlowGraph::kValue); |
} |
@@ -1749,11 +1731,9 @@ Definition* CheckedSmiOpInstr::Canonicalize(FlowGraph* flow_graph) { |
case Token::kBIT_AND: |
case Token::kBIT_OR: |
case Token::kBIT_XOR: |
- replacement = |
- new BinarySmiOpInstr(op_kind(), |
- new Value(left()->definition()), |
- new Value(right()->definition()), |
- Thread::kNoDeoptId); |
+ replacement = new BinarySmiOpInstr( |
+ op_kind(), new Value(left()->definition()), |
+ new Value(right()->definition()), Thread::kNoDeoptId); |
default: |
break; |
} |
@@ -1766,8 +1746,8 @@ Definition* CheckedSmiOpInstr::Canonicalize(FlowGraph* flow_graph) { |
} |
-ComparisonInstr* CheckedSmiComparisonInstr::CopyWithNewOperands( |
- Value* left, Value* right) { |
+ComparisonInstr* CheckedSmiComparisonInstr::CopyWithNewOperands(Value* left, |
+ Value* right) { |
UNREACHABLE(); |
return NULL; |
} |
@@ -1778,17 +1758,13 @@ Definition* CheckedSmiComparisonInstr::Canonicalize(FlowGraph* flow_graph) { |
(right()->Type()->ToCid() == kSmiCid)) { |
Definition* replacement = NULL; |
if (Token::IsRelationalOperator(kind())) { |
- replacement = new RelationalOpInstr(token_pos(), kind(), |
- new Value(left()->definition()), |
- new Value(right()->definition()), |
- kSmiCid, |
- Thread::kNoDeoptId); |
+ replacement = new RelationalOpInstr( |
+ token_pos(), kind(), new Value(left()->definition()), |
+ new Value(right()->definition()), kSmiCid, Thread::kNoDeoptId); |
} else if (Token::IsEqualityOperator(kind())) { |
- replacement = new EqualityCompareInstr(token_pos(), kind(), |
- new Value(left()->definition()), |
- new Value(right()->definition()), |
- kSmiCid, |
- Thread::kNoDeoptId); |
+ replacement = new EqualityCompareInstr( |
+ token_pos(), kind(), new Value(left()->definition()), |
+ new Value(right()->definition()), kSmiCid, Thread::kNoDeoptId); |
} |
if (replacement != NULL) { |
flow_graph->InsertBefore(this, replacement, env(), FlowGraph::kValue); |
@@ -1803,20 +1779,17 @@ Definition* BinaryIntegerOpInstr::Canonicalize(FlowGraph* flow_graph) { |
// If both operands are constants evaluate this expression. Might |
// occur due to load forwarding after constant propagation pass |
// have already been run. |
- if (left()->BindsToConstant() && |
- left()->BoundConstant().IsInteger() && |
- right()->BindsToConstant() && |
- right()->BoundConstant().IsInteger()) { |
- const Integer& result = Integer::Handle( |
- Evaluate(Integer::Cast(left()->BoundConstant()), |
- Integer::Cast(right()->BoundConstant()))); |
+ if (left()->BindsToConstant() && left()->BoundConstant().IsInteger() && |
+ right()->BindsToConstant() && right()->BoundConstant().IsInteger()) { |
+ const Integer& result = |
+ Integer::Handle(Evaluate(Integer::Cast(left()->BoundConstant()), |
+ Integer::Cast(right()->BoundConstant()))); |
if (!result.IsNull()) { |
return CreateConstantResult(flow_graph, result); |
} |
} |
- if (left()->BindsToConstant() && |
- !right()->BindsToConstant() && |
+ if (left()->BindsToConstant() && !right()->BindsToConstant() && |
IsCommutative(op_kind())) { |
Value* l = left(); |
Value* r = right(); |
@@ -1854,15 +1827,10 @@ Definition* BinaryIntegerOpInstr::Canonicalize(FlowGraph* flow_graph) { |
} else if (rhs == 2) { |
ConstantInstr* constant_1 = |
flow_graph->GetConstant(Smi::Handle(Smi::New(1))); |
- BinaryIntegerOpInstr* shift = |
- BinaryIntegerOpInstr::Make(representation(), |
- Token::kSHL, |
- left()->CopyWithType(), |
- new Value(constant_1), |
- GetDeoptId(), |
- can_overflow(), |
- is_truncating(), |
- range()); |
+ BinaryIntegerOpInstr* shift = BinaryIntegerOpInstr::Make( |
+ representation(), Token::kSHL, left()->CopyWithType(), |
+ new Value(constant_1), GetDeoptId(), can_overflow(), |
+ is_truncating(), range()); |
if (shift != NULL) { |
flow_graph->InsertBefore(this, shift, env(), FlowGraph::kValue); |
return shift; |
@@ -1893,12 +1861,9 @@ Definition* BinaryIntegerOpInstr::Canonicalize(FlowGraph* flow_graph) { |
if (rhs == 0) { |
return left()->definition(); |
} else if (rhs == range_mask) { |
- UnaryIntegerOpInstr* bit_not = |
- UnaryIntegerOpInstr::Make(representation(), |
- Token::kBIT_NOT, |
- left()->CopyWithType(), |
- GetDeoptId(), |
- range()); |
+ UnaryIntegerOpInstr* bit_not = UnaryIntegerOpInstr::Make( |
+ representation(), Token::kBIT_NOT, left()->CopyWithType(), |
+ GetDeoptId(), range()); |
if (bit_not != NULL) { |
flow_graph->InsertBefore(this, bit_not, env(), FlowGraph::kValue); |
return bit_not; |
@@ -1916,12 +1881,9 @@ Definition* BinaryIntegerOpInstr::Canonicalize(FlowGraph* flow_graph) { |
if (rhs == 1) { |
return left()->definition(); |
} else if (rhs == -1) { |
- UnaryIntegerOpInstr* negation = |
- UnaryIntegerOpInstr::Make(representation(), |
- Token::kNEGATE, |
- left()->CopyWithType(), |
- GetDeoptId(), |
- range()); |
+ UnaryIntegerOpInstr* negation = UnaryIntegerOpInstr::Make( |
+ representation(), Token::kNEGATE, left()->CopyWithType(), |
+ GetDeoptId(), range()); |
if (negation != NULL) { |
flow_graph->InsertBefore(this, negation, env(), FlowGraph::kValue); |
return negation; |
@@ -2095,14 +2057,13 @@ Definition* AssertAssignableInstr::Canonicalize(FlowGraph* flow_graph) { |
ConstantInstr* constant_type_args = |
instantiator_type_arguments()->definition()->AsConstant(); |
- if (constant_type_args != NULL && |
- !constant_type_args->value().IsNull() && |
+ if (constant_type_args != NULL && !constant_type_args->value().IsNull() && |
constant_type_args->value().IsTypeArguments()) { |
const TypeArguments& instantiator_type_args = |
TypeArguments::Cast(constant_type_args->value()); |
Error& bound_error = Error::Handle(); |
- AbstractType& new_dst_type = AbstractType::Handle( |
- dst_type().InstantiateFrom( |
+ AbstractType& new_dst_type = |
+ AbstractType::Handle(dst_type().InstantiateFrom( |
instantiator_type_args, &bound_error, NULL, NULL, Heap::kOld)); |
if (new_dst_type.IsMalformedOrMalbounded() || !bound_error.IsNull()) { |
return this; |
@@ -2113,8 +2074,7 @@ Definition* AssertAssignableInstr::Canonicalize(FlowGraph* flow_graph) { |
new_dst_type = new_dst_type.Canonicalize(); |
set_dst_type(new_dst_type); |
- if (new_dst_type.IsDynamicType() || |
- new_dst_type.IsObjectType() || |
+ if (new_dst_type.IsDynamicType() || new_dst_type.IsObjectType() || |
(FLAG_eliminate_type_checks && |
value()->Type()->IsAssignableTo(new_dst_type))) { |
return value()->definition(); |
@@ -2136,8 +2096,8 @@ LocationSummary* DebugStepCheckInstr::MakeLocationSummary(Zone* zone, |
bool opt) const { |
const intptr_t kNumInputs = 0; |
const intptr_t kNumTemps = 0; |
- LocationSummary* locs = new(zone) LocationSummary( |
- zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
+ LocationSummary* locs = new (zone) |
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
return locs; |
} |
@@ -2218,10 +2178,7 @@ Definition* BoxInt64Instr::Canonicalize(FlowGraph* flow_graph) { |
} |
if (replacement != this) { |
- flow_graph->InsertBefore(this, |
- replacement, |
- NULL, |
- FlowGraph::kValue); |
+ flow_graph->InsertBefore(this, replacement, NULL, FlowGraph::kValue); |
} |
return replacement; |
@@ -2246,7 +2203,8 @@ Definition* UnboxInstr::Canonicalize(FlowGraph* flow_graph) { |
const Object& val = value()->BoundConstant(); |
if (val.IsSmi()) { |
- const Double& double_val = Double::ZoneHandle(flow_graph->zone(), |
+ const Double& double_val = Double::ZoneHandle( |
+ flow_graph->zone(), |
Double::NewCanonical(Smi::Cast(val).AsDoubleValue())); |
uc = new UnboxedConstantInstr(double_val, kUnboxedDouble); |
} else if (val.IsDouble()) { |
@@ -2275,11 +2233,10 @@ Definition* UnboxIntegerInstr::Canonicalize(FlowGraph* flow_graph) { |
return box_defn->value()->definition(); |
} else { |
UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr( |
- from_representation, |
- representation(), |
+ from_representation, representation(), |
box_defn->value()->CopyWithType(), |
- (representation() == kUnboxedInt32) ? |
- GetDeoptId() : Thread::kNoDeoptId); |
+ (representation() == kUnboxedInt32) ? GetDeoptId() |
+ : Thread::kNoDeoptId); |
// TODO(vegorov): marking resulting converter as truncating when |
// unboxing can't deoptimize is a workaround for the missing |
// deoptimization environment when we insert converter after |
@@ -2308,8 +2265,7 @@ Definition* UnboxInt32Instr::Canonicalize(FlowGraph* flow_graph) { |
if ((c != NULL) && c->value().IsSmi()) { |
if (!is_truncating() && (kSmiBits > 32)) { |
// Check that constant fits into 32-bit integer. |
- const int64_t value = |
- static_cast<int64_t>(Smi::Cast(c->value()).Value()); |
+ const int64_t value = static_cast<int64_t>(Smi::Cast(c->value()).Value()); |
if (!Utils::IsInt(32, value)) { |
return this; |
} |
@@ -2339,9 +2295,7 @@ Definition* UnboxedIntConverterInstr::Canonicalize(FlowGraph* flow_graph) { |
} |
UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr( |
- box_defn->from(), |
- representation(), |
- box_defn->value()->CopyWithType(), |
+ box_defn->from(), representation(), box_defn->value()->CopyWithType(), |
(to() == kUnboxedInt32) ? GetDeoptId() : Thread::kNoDeoptId); |
if ((representation() == kUnboxedInt32) && is_truncating()) { |
converter->mark_truncating(); |
@@ -2351,22 +2305,16 @@ Definition* UnboxedIntConverterInstr::Canonicalize(FlowGraph* flow_graph) { |
} |
UnboxInt64Instr* unbox_defn = value()->definition()->AsUnboxInt64(); |
- if (unbox_defn != NULL && |
- (from() == kUnboxedMint) && |
- (to() == kUnboxedInt32) && |
- unbox_defn->HasOnlyInputUse(value())) { |
+ if (unbox_defn != NULL && (from() == kUnboxedMint) && |
+ (to() == kUnboxedInt32) && unbox_defn->HasOnlyInputUse(value())) { |
// TODO(vegorov): there is a duplication of code between UnboxedIntCoverter |
// and code path that unboxes Mint into Int32. We should just schedule |
// these instructions close to each other instead of fusing them. |
Definition* replacement = |
new UnboxInt32Instr(is_truncating() ? UnboxInt32Instr::kTruncate |
: UnboxInt32Instr::kNoTruncation, |
- unbox_defn->value()->CopyWithType(), |
- GetDeoptId()); |
- flow_graph->InsertBefore(this, |
- replacement, |
- env(), |
- FlowGraph::kValue); |
+ unbox_defn->value()->CopyWithType(), GetDeoptId()); |
+ flow_graph->InsertBefore(this, replacement, env(), FlowGraph::kValue); |
return replacement; |
} |
@@ -2376,8 +2324,7 @@ Definition* UnboxedIntConverterInstr::Canonicalize(FlowGraph* flow_graph) { |
Definition* BooleanNegateInstr::Canonicalize(FlowGraph* flow_graph) { |
Definition* defn = value()->definition(); |
- if (defn->IsComparison() && |
- defn->HasOnlyUse(value()) && |
+ if (defn->IsComparison() && defn->HasOnlyUse(value()) && |
defn->Type()->ToCid() == kBoolCid) { |
defn->AsComparison()->NegateComparison(); |
return defn; |
@@ -2387,20 +2334,19 @@ Definition* BooleanNegateInstr::Canonicalize(FlowGraph* flow_graph) { |
static bool MayBeBoxableNumber(intptr_t cid) { |
- return (cid == kDynamicCid) || |
- (cid == kMintCid) || |
- (cid == kBigintCid) || |
+ return (cid == kDynamicCid) || (cid == kMintCid) || (cid == kBigintCid) || |
(cid == kDoubleCid); |
} |
static bool MaybeNumber(CompileType* type) { |
- ASSERT(Type::Handle(Type::Number()).IsMoreSpecificThan( |
- Type::Handle(Type::Number()), NULL, NULL, Heap::kOld)); |
- return type->ToAbstractType()->IsDynamicType() |
- || type->ToAbstractType()->IsObjectType() |
- || type->ToAbstractType()->IsTypeParameter() |
- || type->IsMoreSpecificThan(Type::Handle(Type::Number())); |
+ ASSERT(Type::Handle(Type::Number()) |
+ .IsMoreSpecificThan(Type::Handle(Type::Number()), NULL, NULL, |
+ Heap::kOld)); |
+ return type->ToAbstractType()->IsDynamicType() || |
+ type->ToAbstractType()->IsObjectType() || |
+ type->ToAbstractType()->IsTypeParameter() || |
+ type->IsMoreSpecificThan(Type::Handle(Type::Number())); |
} |
@@ -2414,7 +2360,7 @@ static Definition* CanonicalizeStrictCompare(StrictCompareInstr* compare, |
// is not a subtype of num, no need for number checks. |
if (compare->needs_number_check()) { |
if (!MayBeBoxableNumber(compare->left()->Type()->ToCid()) || |
- !MayBeBoxableNumber(compare->right()->Type()->ToCid())) { |
+ !MayBeBoxableNumber(compare->right()->Type()->ToCid())) { |
compare->set_needs_number_check(false); |
} else if (!MaybeNumber(compare->left()->Type()) || |
!MaybeNumber(compare->right()->Type())) { |
@@ -2438,31 +2384,25 @@ static Definition* CanonicalizeStrictCompare(StrictCompareInstr* compare, |
Definition* other_defn = other->definition(); |
Token::Kind kind = compare->kind(); |
// Handle e === true. |
- if ((kind == Token::kEQ_STRICT) && |
- (constant.raw() == Bool::True().raw()) && |
+ if ((kind == Token::kEQ_STRICT) && (constant.raw() == Bool::True().raw()) && |
can_merge) { |
return other_defn; |
} |
// Handle e !== false. |
- if ((kind == Token::kNE_STRICT) && |
- (constant.raw() == Bool::False().raw()) && |
+ if ((kind == Token::kNE_STRICT) && (constant.raw() == Bool::False().raw()) && |
can_merge) { |
return other_defn; |
} |
// Handle e !== true. |
- if ((kind == Token::kNE_STRICT) && |
- (constant.raw() == Bool::True().raw()) && |
- other_defn->IsComparison() && |
- can_merge && |
+ if ((kind == Token::kNE_STRICT) && (constant.raw() == Bool::True().raw()) && |
+ other_defn->IsComparison() && can_merge && |
other_defn->HasOnlyUse(other)) { |
*negated = true; |
return other_defn; |
} |
// Handle e === false. |
- if ((kind == Token::kEQ_STRICT) && |
- (constant.raw() == Bool::False().raw()) && |
- other_defn->IsComparison() && |
- can_merge && |
+ if ((kind == Token::kEQ_STRICT) && (constant.raw() == Bool::False().raw()) && |
+ other_defn->IsComparison() && can_merge && |
other_defn->HasOnlyUse(other)) { |
*negated = true; |
return other_defn; |
@@ -2472,9 +2412,8 @@ static Definition* CanonicalizeStrictCompare(StrictCompareInstr* compare, |
static bool BindsToGivenConstant(Value* v, intptr_t expected) { |
- return v->BindsToConstant() && |
- v->BoundConstant().IsSmi() && |
- (Smi::Cast(v->BoundConstant()).Value() == expected); |
+ return v->BindsToConstant() && v->BoundConstant().IsSmi() && |
+ (Smi::Cast(v->BoundConstant()).Value() == expected); |
} |
@@ -2491,8 +2430,7 @@ static bool RecognizeTestPattern(Value* left, Value* right, bool* negate) { |
BinarySmiOpInstr* mask_op = left->definition()->AsBinarySmiOp(); |
- if ((mask_op == NULL) || |
- (mask_op->op_kind() != Token::kBIT_AND) || |
+ if ((mask_op == NULL) || (mask_op->op_kind() != Token::kBIT_AND) || |
!mask_op->HasOnlyUse(left)) { |
return false; |
} |
@@ -2521,15 +2459,13 @@ Instruction* BranchInstr::Canonicalize(FlowGraph* flow_graph) { |
// Only handle strict-compares. |
if (comparison()->IsStrictCompare()) { |
bool negated = false; |
- Definition* replacement = |
- CanonicalizeStrictCompare(comparison()->AsStrictCompare(), |
- &negated, /* is_branch = */ true); |
+ Definition* replacement = CanonicalizeStrictCompare( |
+ comparison()->AsStrictCompare(), &negated, /* is_branch = */ true); |
if (replacement == comparison()) { |
return this; |
} |
ComparisonInstr* comp = replacement->AsComparison(); |
- if ((comp == NULL) || |
- comp->CanDeoptimize() || |
+ if ((comp == NULL) || comp->CanDeoptimize() || |
comp->HasUnmatchedInputRepresentations()) { |
return this; |
} |
@@ -2562,12 +2498,10 @@ Instruction* BranchInstr::Canonicalize(FlowGraph* flow_graph) { |
comparison()->operation_cid() == kSmiCid) { |
BinarySmiOpInstr* bit_and = NULL; |
bool negate = false; |
- if (RecognizeTestPattern(comparison()->left(), |
- comparison()->right(), |
+ if (RecognizeTestPattern(comparison()->left(), comparison()->right(), |
&negate)) { |
bit_and = comparison()->left()->definition()->AsBinarySmiOp(); |
- } else if (RecognizeTestPattern(comparison()->right(), |
- comparison()->left(), |
+ } else if (RecognizeTestPattern(comparison()->right(), comparison()->left(), |
&negate)) { |
bit_and = comparison()->right()->definition()->AsBinarySmiOp(); |
} |
@@ -2579,8 +2513,7 @@ Instruction* BranchInstr::Canonicalize(FlowGraph* flow_graph) { |
comparison()->token_pos(), |
negate ? Token::NegateComparison(comparison()->kind()) |
: comparison()->kind(), |
- bit_and->left()->Copy(zone), |
- bit_and->right()->Copy(zone)); |
+ bit_and->left()->Copy(zone), bit_and->right()->Copy(zone)); |
ASSERT(!CanDeoptimize()); |
RemoveEnvironment(); |
flow_graph->CopyDeoptTarget(this, bit_and); |
@@ -2618,8 +2551,7 @@ Instruction* CheckClassInstr::Canonicalize(FlowGraph* flow_graph) { |
Instruction* CheckClassIdInstr::Canonicalize(FlowGraph* flow_graph) { |
if (value()->BindsToConstant()) { |
const Object& constant_value = value()->BoundConstant(); |
- if (constant_value.IsSmi() && |
- Smi::Cast(constant_value).Value() == cid_) { |
+ if (constant_value.IsSmi() && Smi::Cast(constant_value).Value() == cid_) { |
return NULL; |
} |
} |
@@ -2637,8 +2569,8 @@ Definition* TestCidsInstr::Canonicalize(FlowGraph* flow_graph) { |
for (intptr_t i = 0; i < data.length(); i += 2) { |
if (data[i] == cid) { |
return (data[i + 1] == true_result) |
- ? flow_graph->GetConstant(Bool::True()) |
- : flow_graph->GetConstant(Bool::False()); |
+ ? flow_graph->GetConstant(Bool::True()) |
+ : flow_graph->GetConstant(Bool::False()); |
} |
} |
@@ -2689,8 +2621,7 @@ Instruction* GuardFieldLengthInstr::Canonicalize(FlowGraph* flow_graph) { |
LoadFieldInstr::IsFixedLengthArrayCid(call->Type()->ToCid())) { |
length = call->ArgumentAt(1)->AsConstant(); |
} |
- if ((length != NULL) && |
- length->value().IsSmi() && |
+ if ((length != NULL) && length->value().IsSmi() && |
Smi::Cast(length->value()).Value() == expected_length) { |
return NULL; // Expected length matched. |
} |
@@ -2700,7 +2631,7 @@ Instruction* GuardFieldLengthInstr::Canonicalize(FlowGraph* flow_graph) { |
Instruction* CheckSmiInstr::Canonicalize(FlowGraph* flow_graph) { |
- return (value()->Type()->ToCid() == kSmiCid) ? NULL : this; |
+ return (value()->Type()->ToCid() == kSmiCid) ? NULL : this; |
} |
@@ -2742,8 +2673,8 @@ UnboxInstr* UnboxInstr::Create(Representation to, |
intptr_t deopt_id) { |
switch (to) { |
case kUnboxedInt32: |
- return new UnboxInt32Instr( |
- UnboxInt32Instr::kNoTruncation, value, deopt_id); |
+ return new UnboxInt32Instr(UnboxInt32Instr::kNoTruncation, value, |
+ deopt_id); |
case kUnboxedUint32: |
return new UnboxUint32Instr(value, deopt_id); |
@@ -2806,8 +2737,7 @@ LocationSummary* JoinEntryInstr::MakeLocationSummary(Zone* zone, |
void JoinEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ Bind(compiler->GetJumpLabel(this)); |
if (!compiler->is_optimizing()) { |
- compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, |
- GetDeoptId(), |
+ compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(), |
TokenPosition::kNoSource); |
} |
if (HasParallelMove()) { |
@@ -2837,8 +2767,7 @@ void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
// The deoptimization descriptor points after the edge counter code for |
// uniformity with ARM and MIPS, where we can reuse pattern matching |
// code that matches backwards from the end of the pattern. |
- compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, |
- GetDeoptId(), |
+ compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(), |
TokenPosition::kNoSource); |
} |
if (HasParallelMove()) { |
@@ -2882,7 +2811,8 @@ void IndirectGotoInstr::ComputeOffsetTable() { |
LocationSummary* IndirectEntryInstr::MakeLocationSummary( |
- Zone* zone, bool optimizing) const { |
+ Zone* zone, |
+ bool optimizing) const { |
return JoinEntryInstr::MakeLocationSummary(zone, optimizing); |
} |
@@ -2962,7 +2892,8 @@ void ConstraintInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
LocationSummary* MaterializeObjectInstr::MakeLocationSummary( |
- Zone* zone, bool optimizing) const { |
+ Zone* zone, |
+ bool optimizing) const { |
UNREACHABLE(); |
return NULL; |
} |
@@ -3006,14 +2937,10 @@ void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
LocationSummary* DropTempsInstr::MakeLocationSummary(Zone* zone, |
bool optimizing) const { |
return (InputCount() == 1) |
- ? LocationSummary::Make(zone, |
- 1, |
- Location::SameAsFirstInput(), |
- LocationSummary::kNoCall) |
- : LocationSummary::Make(zone, |
- 0, |
- Location::NoLocation(), |
- LocationSummary::kNoCall); |
+ ? LocationSummary::Make(zone, 1, Location::SameAsFirstInput(), |
+ LocationSummary::kNoCall) |
+ : LocationSummary::Make(zone, 0, Location::NoLocation(), |
+ LocationSummary::kNoCall); |
} |
@@ -3043,9 +2970,7 @@ StrictCompareInstr::StrictCompareInstr(TokenPosition token_pos, |
Value* left, |
Value* right, |
bool needs_number_check) |
- : TemplateComparison(token_pos, |
- kind, |
- Thread::Current()->GetNextDeoptId()), |
+ : TemplateComparison(token_pos, kind, Thread::Current()->GetNextDeoptId()), |
needs_number_check_(needs_number_check) { |
ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT)); |
SetInputAt(0, left); |
@@ -3066,15 +2991,20 @@ static const StubEntry* TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) { |
return 0; |
} |
switch (kind) { |
- case Token::kADD: return StubCode::SmiAddInlineCache_entry(); |
- case Token::kSUB: return StubCode::SmiSubInlineCache_entry(); |
- case Token::kEQ: return StubCode::SmiEqualInlineCache_entry(); |
- default: return NULL; |
+ case Token::kADD: |
+ return StubCode::SmiAddInlineCache_entry(); |
+ case Token::kSUB: |
+ return StubCode::SmiSubInlineCache_entry(); |
+ case Token::kEQ: |
+ return StubCode::SmiEqualInlineCache_entry(); |
+ default: |
+ return NULL; |
} |
} |
#else |
-static void TryFastPathSmiOp( |
- FlowGraphCompiler* compiler, ICData* call_ic_data, const String& name) { |
+static void TryFastPathSmiOp(FlowGraphCompiler* compiler, |
+ ICData* call_ic_data, |
+ const String& name) { |
if (!FLAG_two_args_smi_icd) { |
return; |
} |
@@ -3092,7 +3022,7 @@ static void TryFastPathSmiOp( |
} |
} else if (name.raw() == Symbols::LAngleBracket().raw()) { |
if (call_ic_data->AddSmiSmiCheckForFastSmiStubs()) { |
- __ LessThanTOS(); |
+ __ LessThanTOS(); |
} |
} else if (name.raw() == Symbols::RAngleBracket().raw()) { |
if (call_ic_data->AddSmiSmiCheckForFastSmiStubs()) { |
@@ -3120,9 +3050,8 @@ void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
const ICData* call_ic_data = NULL; |
if (!FLAG_propagate_ic_data || !compiler->is_optimizing() || |
(ic_data() == NULL)) { |
- const Array& arguments_descriptor = |
- Array::Handle(zone, ArgumentsDescriptor::New(ArgumentCount(), |
- argument_names())); |
+ const Array& arguments_descriptor = Array::Handle( |
+ zone, ArgumentsDescriptor::New(ArgumentCount(), argument_names())); |
call_ic_data = compiler->GetOrAddInstanceCallICData( |
deopt_id(), function_name(), arguments_descriptor, |
checked_argument_count()); |
@@ -3136,18 +3065,12 @@ void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
if (ic_data()->NumberOfUsedChecks() > 0) { |
const ICData& unary_ic_data = |
ICData::ZoneHandle(zone, ic_data()->AsUnaryClassChecks()); |
- compiler->GenerateInstanceCall(deopt_id(), |
- token_pos(), |
- ArgumentCount(), |
- locs(), |
- unary_ic_data); |
+ compiler->GenerateInstanceCall(deopt_id(), token_pos(), ArgumentCount(), |
+ locs(), unary_ic_data); |
} else { |
// Call was not visited yet, use original ICData in order to populate it. |
- compiler->GenerateInstanceCall(deopt_id(), |
- token_pos(), |
- ArgumentCount(), |
- locs(), |
- *call_ic_data); |
+ compiler->GenerateInstanceCall(deopt_id(), token_pos(), ArgumentCount(), |
+ locs(), *call_ic_data); |
} |
} else { |
// Unoptimized code. |
@@ -3164,11 +3087,8 @@ void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
compiler->EmitInstanceCall(*stub_entry, *call_ic_data, ArgumentCount(), |
deopt_id(), token_pos(), locs()); |
} else { |
- compiler->GenerateInstanceCall(deopt_id(), |
- token_pos(), |
- ArgumentCount(), |
- locs(), |
- *call_ic_data); |
+ compiler->GenerateInstanceCall(deopt_id(), token_pos(), ArgumentCount(), |
+ locs(), *call_ic_data); |
} |
} |
#else |
@@ -3201,8 +3121,7 @@ void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
UNIMPLEMENTED(); |
break; |
} |
- compiler->AddCurrentDescriptor(RawPcDescriptors::kIcCall, |
- deopt_id(), |
+ compiler->AddCurrentDescriptor(RawPcDescriptors::kIcCall, deopt_id(), |
token_pos()); |
compiler->RecordAfterCall(this); |
@@ -3217,9 +3136,8 @@ bool PolymorphicInstanceCallInstr::HasSingleRecognizedTarget() const { |
if (FLAG_precompiled_mode && with_checks()) return false; |
return ic_data().HasOneTarget() && |
- (MethodRecognizer::RecognizeKind( |
- Function::Handle(ic_data().GetTargetAt(0))) != |
- MethodRecognizer::kUnknown); |
+ (MethodRecognizer::RecognizeKind(Function::Handle( |
+ ic_data().GetTargetAt(0))) != MethodRecognizer::kUnknown); |
} |
@@ -3231,23 +3149,17 @@ void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
if (!with_checks()) { |
ASSERT(ic_data().HasOneTarget()); |
const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0)); |
- compiler->GenerateStaticCall(deopt_id(), |
- instance_call()->token_pos(), |
- target, |
- instance_call()->ArgumentCount(), |
- instance_call()->argument_names(), |
- locs(), |
+ compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), |
+ target, instance_call()->ArgumentCount(), |
+ instance_call()->argument_names(), locs(), |
ICData::Handle()); |
return; |
} |
- compiler->EmitPolymorphicInstanceCall(ic_data(), |
- instance_call()->ArgumentCount(), |
- instance_call()->argument_names(), |
- deopt_id(), |
- instance_call()->token_pos(), |
- locs(), |
- complete()); |
+ compiler->EmitPolymorphicInstanceCall( |
+ ic_data(), instance_call()->ArgumentCount(), |
+ instance_call()->argument_names(), deopt_id(), |
+ instance_call()->token_pos(), locs(), complete()); |
} |
#endif |
@@ -3323,9 +3235,8 @@ void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
const ICData* call_ic_data = NULL; |
if (!FLAG_propagate_ic_data || !compiler->is_optimizing() || |
(ic_data() == NULL)) { |
- const Array& arguments_descriptor = |
- Array::Handle(ArgumentsDescriptor::New(ArgumentCount(), |
- argument_names())); |
+ const Array& arguments_descriptor = Array::Handle( |
+ ArgumentsDescriptor::New(ArgumentCount(), argument_names())); |
MethodRecognizer::Kind recognized_kind = |
MethodRecognizer::RecognizeKind(function()); |
int num_args_checked = 0; |
@@ -3338,35 +3249,28 @@ void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
default: |
break; |
} |
- call_ic_data = compiler->GetOrAddStaticCallICData(deopt_id(), |
- function(), |
- arguments_descriptor, |
- num_args_checked); |
+ call_ic_data = compiler->GetOrAddStaticCallICData( |
+ deopt_id(), function(), arguments_descriptor, num_args_checked); |
} else { |
call_ic_data = &ICData::ZoneHandle(ic_data()->raw()); |
} |
#if !defined(TARGET_ARCH_DBC) |
- compiler->GenerateStaticCall(deopt_id(), |
- token_pos(), |
- function(), |
- ArgumentCount(), |
- argument_names(), |
- locs(), |
+ compiler->GenerateStaticCall(deopt_id(), token_pos(), function(), |
+ ArgumentCount(), argument_names(), locs(), |
*call_ic_data); |
#else |
const Array& arguments_descriptor = |
- (ic_data() == NULL) ? |
- Array::Handle(ArgumentsDescriptor::New(ArgumentCount(), |
- argument_names())) : |
- Array::Handle(ic_data()->arguments_descriptor()); |
+ (ic_data() == NULL) ? Array::Handle(ArgumentsDescriptor::New( |
+ ArgumentCount(), argument_names())) |
+ : Array::Handle(ic_data()->arguments_descriptor()); |
const intptr_t argdesc_kidx = __ AddConstant(arguments_descriptor); |
if (compiler->is_optimizing()) { |
__ PushConstant(function()); |
__ StaticCall(ArgumentCount(), argdesc_kidx); |
- compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
- deopt_id(), token_pos()); |
+ compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), |
+ token_pos()); |
compiler->RecordAfterCall(this); |
__ PopLocal(locs()->out(0).reg()); |
} else { |
@@ -3374,7 +3278,7 @@ void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ PushConstant(ic_data_kidx); |
__ IndirectStaticCall(ArgumentCount(), argdesc_kidx); |
compiler->AddCurrentDescriptor(RawPcDescriptors::kUnoptStaticCall, |
- deopt_id(), token_pos()); |
+ deopt_id(), token_pos()); |
compiler->RecordAfterCall(this); |
} |
#endif // !defined(TARGET_ARCH_DBC) |
@@ -3382,13 +3286,10 @@ void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
void AssertAssignableInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- compiler->GenerateAssertAssignable(token_pos(), |
- deopt_id(), |
- dst_type(), |
- dst_name(), |
- locs()); |
+ compiler->GenerateAssertAssignable(token_pos(), deopt_id(), dst_type(), |
+ dst_name(), locs()); |
- // DBC does not use LocationSummaries in the same way as other architectures. |
+// DBC does not use LocationSummaries in the same way as other architectures. |
#if !defined(TARGET_ARCH_DBC) |
ASSERT(locs()->in(0).reg() == locs()->out(0).reg()); |
#endif // !defined(TARGET_ARCH_DBC) |
@@ -3397,7 +3298,7 @@ void AssertAssignableInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
LocationSummary* DeoptimizeInstr::MakeLocationSummary(Zone* zone, |
bool opt) const { |
- return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall); |
+ return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall); |
} |
@@ -3415,13 +3316,10 @@ Environment* Environment::From(Zone* zone, |
intptr_t fixed_parameter_count, |
const ParsedFunction& parsed_function) { |
Environment* env = |
- new(zone) Environment(definitions.length(), |
- fixed_parameter_count, |
- Thread::kNoDeoptId, |
- parsed_function, |
- NULL); |
+ new (zone) Environment(definitions.length(), fixed_parameter_count, |
+ Thread::kNoDeoptId, parsed_function, NULL); |
for (intptr_t i = 0; i < definitions.length(); ++i) { |
- env->values_.Add(new(zone) Value(definitions[i])); |
+ env->values_.Add(new (zone) Value(definitions[i])); |
} |
return env; |
} |
@@ -3429,12 +3327,9 @@ Environment* Environment::From(Zone* zone, |
Environment* Environment::DeepCopy(Zone* zone, intptr_t length) const { |
ASSERT(length <= values_.length()); |
- Environment* copy = new(zone) Environment( |
- length, |
- fixed_parameter_count_, |
- deopt_id_, |
- parsed_function_, |
- (outer_ == NULL) ? NULL : outer_->DeepCopy(zone)); |
+ Environment* copy = new (zone) |
+ Environment(length, fixed_parameter_count_, deopt_id_, parsed_function_, |
+ (outer_ == NULL) ? NULL : outer_->DeepCopy(zone)); |
if (locations_ != NULL) { |
Location* new_locations = zone->Alloc<Location>(length); |
copy->set_locations(new_locations); |
@@ -3475,9 +3370,9 @@ void Environment::DeepCopyAfterTo(Zone* zone, |
Environment* copy = DeepCopy(zone, values_.length() - argc); |
for (intptr_t i = 0; i < argc; i++) { |
- copy->values_.Add(new(zone) Value(dead)); |
+ copy->values_.Add(new (zone) Value(dead)); |
} |
- copy->values_.Add(new(zone) Value(result)); |
+ copy->values_.Add(new (zone) Value(result)); |
instr->SetEnvironment(copy); |
for (Environment::DeepIterator it(copy); !it.Done(); it.Advance()) { |
@@ -3515,50 +3410,34 @@ ComparisonInstr* DoubleTestOpInstr::CopyWithNewOperands(Value* new_left, |
ComparisonInstr* EqualityCompareInstr::CopyWithNewOperands(Value* new_left, |
Value* new_right) { |
- return new EqualityCompareInstr(token_pos(), |
- kind(), |
- new_left, |
- new_right, |
- operation_cid(), |
- deopt_id()); |
+ return new EqualityCompareInstr(token_pos(), kind(), new_left, new_right, |
+ operation_cid(), deopt_id()); |
} |
ComparisonInstr* RelationalOpInstr::CopyWithNewOperands(Value* new_left, |
Value* new_right) { |
- return new RelationalOpInstr(token_pos(), |
- kind(), |
- new_left, |
- new_right, |
- operation_cid(), |
- deopt_id()); |
+ return new RelationalOpInstr(token_pos(), kind(), new_left, new_right, |
+ operation_cid(), deopt_id()); |
} |
ComparisonInstr* StrictCompareInstr::CopyWithNewOperands(Value* new_left, |
Value* new_right) { |
- return new StrictCompareInstr(token_pos(), |
- kind(), |
- new_left, |
- new_right, |
+ return new StrictCompareInstr(token_pos(), kind(), new_left, new_right, |
needs_number_check()); |
} |
- |
ComparisonInstr* TestSmiInstr::CopyWithNewOperands(Value* new_left, |
Value* new_right) { |
return new TestSmiInstr(token_pos(), kind(), new_left, new_right); |
} |
- |
ComparisonInstr* TestCidsInstr::CopyWithNewOperands(Value* new_left, |
Value* new_right) { |
- return new TestCidsInstr(token_pos(), |
- kind(), |
- new_left, |
- cid_results(), |
+ return new TestCidsInstr(token_pos(), kind(), new_left, cid_results(), |
deopt_id()); |
} |
@@ -3595,8 +3474,8 @@ bool IfThenElseInstr::Supports(ComparisonInstr* comparison, |
if (comparison->IsStrictCompare()) { |
// Strict comparison with number checks calls a stub and is not supported |
// by if-conversion. |
- return is_smi_result |
- && !comparison->AsStrictCompare()->needs_number_check(); |
+ return is_smi_result && |
+ !comparison->AsStrictCompare()->needs_number_check(); |
} |
if (comparison->operation_cid() != kSmiCid) { |
// Non-smi comparisons are not supported by if-conversion. |
@@ -3626,8 +3505,9 @@ bool CheckArrayBoundInstr::IsFixedLengthArrayType(intptr_t cid) { |
Instruction* CheckArrayBoundInstr::Canonicalize(FlowGraph* flow_graph) { |
- return IsRedundant(RangeBoundary::FromDefinition(length()->definition())) ? |
- NULL : this; |
+ return IsRedundant(RangeBoundary::FromDefinition(length()->definition())) |
+ ? NULL |
+ : this; |
} |
@@ -3661,12 +3541,9 @@ const Function& StringInterpolateInstr::CallFunction() const { |
const Class& cls = |
Class::Handle(Library::LookupCoreClass(Symbols::StringBase())); |
ASSERT(!cls.IsNull()); |
- function_ = |
- Resolver::ResolveStatic( |
- cls, |
- Library::PrivateCoreLibName(Symbols::Interpolate()), |
- kNumberOfArguments, |
- kNoArgumentNames); |
+ function_ = Resolver::ResolveStatic( |
+ cls, Library::PrivateCoreLibName(Symbols::Interpolate()), |
+ kNumberOfArguments, kNoArgumentNames); |
} |
ASSERT(!function_.IsNull()); |
return function_; |
@@ -3705,8 +3582,7 @@ Definition* StringInterpolateInstr::Canonicalize(FlowGraph* flow_graph) { |
pieces.Add(Object::null_string()); |
} |
- for (Value::Iterator it(create_array->input_use_list()); |
- !it.Done(); |
+ for (Value::Iterator it(create_array->input_use_list()); !it.Done(); |
it.Advance()) { |
Instruction* curr = it.Current()->instruction(); |
if (curr == this) continue; |
@@ -3728,10 +3604,10 @@ Definition* StringInterpolateInstr::Canonicalize(FlowGraph* flow_graph) { |
} else if (obj.IsSmi()) { |
const char* cstr = obj.ToCString(); |
pieces.SetAt(store_index, |
- String::Handle(zone, String::New(cstr, Heap::kOld))); |
+ String::Handle(zone, String::New(cstr, Heap::kOld))); |
} else if (obj.IsBool()) { |
- pieces.SetAt(store_index, |
- Bool::Cast(obj).value() ? Symbols::True() : Symbols::False()); |
+ pieces.SetAt(store_index, Bool::Cast(obj).value() ? Symbols::True() |
+ : Symbols::False()); |
} else if (obj.IsNull()) { |
pieces.SetAt(store_index, Symbols::Null()); |
} else { |
@@ -3742,8 +3618,8 @@ Definition* StringInterpolateInstr::Canonicalize(FlowGraph* flow_graph) { |
} |
} |
- const String& concatenated = String::ZoneHandle(zone, |
- Symbols::FromConcatAll(thread, pieces)); |
+ const String& concatenated = |
+ String::ZoneHandle(zone, Symbols::FromConcatAll(thread, pieces)); |
return flow_graph->GetConstant(concatenated); |
} |
@@ -3791,7 +3667,6 @@ LoadIndexedInstr::LoadIndexedInstr(Value* array, |
} |
- |
StoreIndexedInstr::StoreIndexedInstr(Value* array, |
Value* index, |
Value* value, |
@@ -3859,60 +3734,88 @@ intptr_t InvokeMathCFunctionInstr::ArgumentCountFor( |
} |
// Use expected function signatures to help MSVC compiler resolve overloading. |
-typedef double (*UnaryMathCFunction) (double x); |
-typedef double (*BinaryMathCFunction) (double x, double y); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcPow, 2, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<BinaryMathCFunction>(&pow))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(DartModulo, 2, true /* is_float */, |
+typedef double (*UnaryMathCFunction)(double x); |
+typedef double (*BinaryMathCFunction)(double x, double y); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcPow, |
+ 2, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<BinaryMathCFunction>(&pow))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ DartModulo, |
+ 2, |
+ true /* is_float */, |
reinterpret_cast<RuntimeFunction>( |
static_cast<BinaryMathCFunction>(&DartModulo))); |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcAtan2, 2, true /* is_float */, |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcAtan2, |
+ 2, |
+ true /* is_float */, |
reinterpret_cast<RuntimeFunction>( |
static_cast<BinaryMathCFunction>(&atan2_ieee))); |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcFloor, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&floor))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcCeil, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&ceil))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcTrunc, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&trunc))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcRound, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&round))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcCos, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&cos))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcSin, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&sin))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcAsin, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&asin))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcAcos, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&acos))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcTan, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&tan))); |
- |
-DEFINE_RAW_LEAF_RUNTIME_ENTRY(LibcAtan, 1, true /* is_float */, |
- reinterpret_cast<RuntimeFunction>( |
- static_cast<UnaryMathCFunction>(&atan))); |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcFloor, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&floor))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcCeil, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&ceil))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcTrunc, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&trunc))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcRound, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&round))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcCos, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&cos))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcSin, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&sin))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcAsin, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&asin))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcAcos, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&acos))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcTan, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&tan))); |
+ |
+DEFINE_RAW_LEAF_RUNTIME_ENTRY( |
+ LibcAtan, |
+ 1, |
+ true /* is_float */, |
+ reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&atan))); |
const RuntimeEntry& InvokeMathCFunctionInstr::TargetFunction() const { |
@@ -3952,9 +3855,12 @@ const RuntimeEntry& InvokeMathCFunctionInstr::TargetFunction() const { |
const char* MathUnaryInstr::KindToCString(MathUnaryKind kind) { |
switch (kind) { |
- case kIllegal: return "illegal"; |
- case kSqrt: return "sqrt"; |
- case kDoubleSquare: return "double-square"; |
+ case kIllegal: |
+ return "illegal"; |
+ case kSqrt: |
+ return "sqrt"; |
+ case kDoubleSquare: |
+ return "double-square"; |
} |
UNREACHABLE(); |
return ""; |
@@ -3969,9 +3875,7 @@ const RuntimeEntry& CaseInsensitiveCompareUC16Instr::TargetFunction() const { |
MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs, |
intptr_t deopt_id, |
MergedMathInstr::Kind kind) |
- : PureDefinition(deopt_id), |
- inputs_(inputs), |
- kind_(kind) { |
+ : PureDefinition(deopt_id), inputs_(inputs), kind_(kind) { |
ASSERT(inputs_->length() == InputCountFor(kind_)); |
for (intptr_t i = 0; i < inputs_->length(); ++i) { |
ASSERT((*inputs)[i] != NULL); |
@@ -3983,18 +3887,26 @@ MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs, |
intptr_t MergedMathInstr::OutputIndexOf(MethodRecognizer::Kind kind) { |
switch (kind) { |
- case MethodRecognizer::kMathSin: return 1; |
- case MethodRecognizer::kMathCos: return 0; |
- default: UNIMPLEMENTED(); return -1; |
+ case MethodRecognizer::kMathSin: |
+ return 1; |
+ case MethodRecognizer::kMathCos: |
+ return 0; |
+ default: |
+ UNIMPLEMENTED(); |
+ return -1; |
} |
} |
intptr_t MergedMathInstr::OutputIndexOf(Token::Kind token) { |
switch (token) { |
- case Token::kTRUNCDIV: return 0; |
- case Token::kMOD: return 1; |
- default: UNIMPLEMENTED(); return -1; |
+ case Token::kTRUNCDIV: |
+ return 0; |
+ case Token::kMOD: |
+ return 1; |
+ default: |
+ UNIMPLEMENTED(); |
+ return -1; |
} |
} |
@@ -4009,13 +3921,10 @@ void NativeCallInstr::SetupNative() { |
NativeFunction native_function = NativeEntry::ResolveNative( |
library, native_name(), num_params, &auto_setup_scope); |
if (native_function == NULL) { |
- Report::MessageF(Report::kError, |
- Script::Handle(function().script()), |
- function().token_pos(), |
- Report::AtLocation, |
+ Report::MessageF(Report::kError, Script::Handle(function().script()), |
+ function().token_pos(), Report::AtLocation, |
"native function '%s' (%" Pd " arguments) cannot be found", |
- native_name().ToCString(), |
- function().NumParameters()); |
+ native_name().ToCString(), function().NumParameters()); |
} |
set_native_c_function(native_function); |
function().SetIsNativeAutoSetupScope(auto_setup_scope); |