Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index cd46747fb0234d67e31d39bf1fed1eefff7e1944..89f9448b8c2c7d17f7cda7e65f1a08b5d4204c58 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -1048,6 +1048,7 @@ HBasicBlock* HGraphBuilder::CreateLoopHeaderBlock() { |
HValue* HGraphBuilder::BuildCheckNonSmi(HValue* obj) { |
+ if (obj->type().IsHeapObject()) return obj; |
HCheckNonSmi* check = new(zone()) HCheckNonSmi(obj); |
AddInstruction(check); |
return check; |
@@ -7015,14 +7016,14 @@ static Representation ComputeLoadStoreRepresentation(Handle<Map> type, |
void HOptimizedGraphBuilder::AddCheckMap(HValue* object, Handle<Map> map) { |
- AddInstruction(new(zone()) HCheckNonSmi(object)); |
+ BuildCheckNonSmi(object); |
AddInstruction(HCheckMaps::New(object, map, zone())); |
} |
void HOptimizedGraphBuilder::AddCheckMapsWithTransitions(HValue* object, |
Handle<Map> map) { |
- AddInstruction(new(zone()) HCheckNonSmi(object)); |
+ BuildCheckNonSmi(object); |
AddInstruction(HCheckMaps::NewWithTransitions(object, map, zone())); |
} |
@@ -7167,7 +7168,7 @@ bool HOptimizedGraphBuilder::HandlePolymorphicArrayLengthLoad( |
if (types->at(i)->instance_type() != JS_ARRAY_TYPE) return false; |
} |
- AddInstruction(new(zone()) HCheckNonSmi(object)); |
+ BuildCheckNonSmi(object); |
HInstruction* typecheck = |
AddInstruction(HCheckMaps::New(object, types, zone())); |
@@ -7187,7 +7188,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
if (HandlePolymorphicArrayLengthLoad(expr, object, types, name)) |
return; |
- AddInstruction(new(zone()) HCheckNonSmi(object)); |
+ BuildCheckNonSmi(object); |
// Use monomorphic load if property lookup results in the same field index |
// for all maps. Requires special map check on the set of all handled maps. |
@@ -7265,7 +7266,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField( |
LookupResult lookup(isolate()); |
if (ComputeLoadStoreField(map, name, &lookup, true)) { |
if (count == 0) { |
- AddInstruction(new(zone()) HCheckNonSmi(object)); // Only needed once. |
+ BuildCheckNonSmi(object); |
join = graph()->CreateBasicBlock(); |
} |
++count; |
@@ -8011,7 +8012,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
KeyedAccessStoreMode store_mode, |
bool* has_side_effects) { |
*has_side_effects = false; |
- AddInstruction(new(zone()) HCheckNonSmi(object)); |
+ BuildCheckNonSmi(object); |
SmallMapList* maps = prop->GetReceiverTypes(); |
bool todo_external_array = false; |
@@ -8235,7 +8236,7 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( |
: BuildLoadKeyedGeneric(obj, key); |
AddInstruction(instr); |
} else { |
- AddInstruction(new(zone()) HCheckNonSmi(obj)); |
+ BuildCheckNonSmi(obj); |
instr = BuildMonomorphicElementAccess( |
obj, key, val, NULL, map, is_store, expr->GetStoreMode()); |
} |
@@ -8370,7 +8371,7 @@ void HOptimizedGraphBuilder::VisitProperty(Property* expr) { |
HInstruction* instr = NULL; |
if (expr->IsStringLength()) { |
HValue* string = Pop(); |
- AddInstruction(new(zone()) HCheckNonSmi(string)); |
+ BuildCheckNonSmi(string); |
AddInstruction(HCheckInstanceType::NewIsString(string, zone())); |
instr = HStringLength::New(zone(), string); |
} else if (expr->IsStringAccess()) { |
@@ -8385,7 +8386,7 @@ void HOptimizedGraphBuilder::VisitProperty(Property* expr) { |
} else if (expr->IsFunctionPrototype()) { |
HValue* function = Pop(); |
- AddInstruction(new(zone()) HCheckNonSmi(function)); |
+ BuildCheckNonSmi(function); |
instr = new(zone()) HLoadFunctionPrototype(function); |
} else if (expr->key()->IsPropertyName()) { |
@@ -8559,7 +8560,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicCallNamed( |
empty_smi_block->Goto(number_block); |
set_current_block(not_smi_block); |
} else { |
- AddInstruction(new(zone()) HCheckNonSmi(receiver)); |
+ BuildCheckNonSmi(receiver); |
} |
} |
HBasicBlock* if_true = graph()->CreateBasicBlock(); |
@@ -10186,7 +10187,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStringCharCodeAt( |
return new(zone()) HConstant(s->Get(i), Representation::Integer32()); |
} |
} |
- AddInstruction(new(zone()) HCheckNonSmi(string)); |
+ BuildCheckNonSmi(string); |
AddInstruction(HCheckInstanceType::NewIsString(string, zone())); |
HInstruction* length = HStringLength::New(zone(), string); |
AddInstruction(length); |
@@ -10272,9 +10273,9 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( |
switch (expr->op()) { |
case Token::ADD: |
if (left_info.IsString() && right_info.IsString()) { |
- AddInstruction(new(zone()) HCheckNonSmi(left)); |
+ BuildCheckNonSmi(left); |
AddInstruction(HCheckInstanceType::NewIsString(left, zone())); |
- AddInstruction(new(zone()) HCheckNonSmi(right)); |
+ BuildCheckNonSmi(right); |
AddInstruction(HCheckInstanceType::NewIsString(right, zone())); |
instr = HStringAdd::New(zone(), context, left, right); |
} else { |
@@ -10680,9 +10681,9 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
result->set_position(expr->position()); |
return ast_context()->ReturnControl(result, expr->id()); |
} else { |
- AddInstruction(new(zone()) HCheckNonSmi(left)); |
+ BuildCheckNonSmi(left); |
AddInstruction(HCheckInstanceType::NewIsSpecObject(left, zone())); |
- AddInstruction(new(zone()) HCheckNonSmi(right)); |
+ BuildCheckNonSmi(right); |
AddInstruction(HCheckInstanceType::NewIsSpecObject(right, zone())); |
HCompareObjectEqAndBranch* result = |
new(zone()) HCompareObjectEqAndBranch(left, right); |
@@ -10695,9 +10696,9 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
} |
} else if (overall_type_info.IsInternalizedString() && |
Token::IsEqualityOp(op)) { |
- AddInstruction(new(zone()) HCheckNonSmi(left)); |
+ BuildCheckNonSmi(left); |
AddInstruction(HCheckInstanceType::NewIsInternalizedString(left, zone())); |
- AddInstruction(new(zone()) HCheckNonSmi(right)); |
+ BuildCheckNonSmi(right); |
AddInstruction(HCheckInstanceType::NewIsInternalizedString(right, zone())); |
HCompareObjectEqAndBranch* result = |
new(zone()) HCompareObjectEqAndBranch(left, right); |