Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 0019b6d578c803af9f19376d253cfc8945165ef6..74b5bba594746ef6253f121c22d0546c8f30d4f3 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -10300,7 +10300,7 @@ HInstruction* HOptimizedGraphBuilder::BuildIncrement( |
rep = Representation::Smi(); |
} |
- if (returns_original_input) { |
+ if (returns_original_input && !is_strong(function_language_mode())) { |
// We need an explicit HValue representing ToNumber(input). The |
// actual HChange instruction we need is (sometimes) added in a later |
// phase, so it is not available now to be used as an input to HAdd and |
@@ -10323,11 +10323,17 @@ HInstruction* HOptimizedGraphBuilder::BuildIncrement( |
AddUncasted<HAdd>(Top(), delta, strength(function_language_mode())); |
if (instr->IsAdd()) { |
HAdd* add = HAdd::cast(instr); |
- add->set_observed_input_representation(1, rep); |
+ if (!is_strong(function_language_mode())) { |
rossberg
2015/06/30 12:53:52
Hm, why no recording in strong mode? Can you add a
conradw
2015/06/30 14:01:10
Urk, this was something I added while misunderstan
|
+ add->set_observed_input_representation(1, rep); |
+ } |
add->set_observed_input_representation(2, Representation::Smi()); |
} |
+ if (!is_strong(function_language_mode())) { |
+ instr->ClearAllSideEffects(); |
+ } else { |
+ Add<HSimulate>(expr->ToNumberId(), REMOVABLE_SIMULATE); |
+ } |
instr->SetFlag(HInstruction::kCannotBeTagged); |
- instr->ClearAllSideEffects(); |
return instr; |
} |
@@ -10611,10 +10617,10 @@ HValue* HOptimizedGraphBuilder::BuildBinaryOperation( |
if (FLAG_allocation_site_pretenuring && !allocation_site.is_null()) { |
allocation_mode = HAllocationMode(allocation_site); |
} |
- |
HValue* result = HGraphBuilder::BuildBinaryOperation( |
expr->op(), left, right, left_type, right_type, result_type, |
- fixed_right_arg, allocation_mode, strength(function_language_mode())); |
+ fixed_right_arg, allocation_mode, strength(function_language_mode()), |
+ expr->id()); |
// Add a simulate after instructions with observable side effects, and |
// after phis, which are the result of BuildBinaryOperation when we |
// inlined some complex subgraph. |
@@ -10631,12 +10637,10 @@ HValue* HOptimizedGraphBuilder::BuildBinaryOperation( |
} |
-HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left, |
- HValue* right, Type* left_type, |
- Type* right_type, Type* result_type, |
- Maybe<int> fixed_right_arg, |
- HAllocationMode allocation_mode, |
- Strength strength) { |
+HValue* HGraphBuilder::BuildBinaryOperation( |
+ Token::Value op, HValue* left, HValue* right, Type* left_type, |
+ Type* right_type, Type* result_type, Maybe<int> fixed_right_arg, |
+ HAllocationMode allocation_mode, Strength strength, BailoutId opt_id) { |
bool maybe_string_add = false; |
if (op == Token::ADD) { |
// If we are adding constant string with something for which we don't have |
@@ -10679,7 +10683,7 @@ HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left, |
maybe_string_add = op == Token::ADD; |
} |
- if (!maybe_string_add) { |
+ if (!maybe_string_add && !is_strong(strength)) { |
left = TruncateToNumber(left, &left_type); |
right = TruncateToNumber(right, &right_type); |
} |
@@ -10789,6 +10793,20 @@ HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left, |
Add<HPushArguments>(left, right); |
instr = AddUncasted<HInvokeFunction>(function, 2); |
} else { |
+ if (is_strong(strength) && Token::IsBitOp(op)) { |
+ IfBuilder if_builder(this); |
+ if_builder.If<HHasInstanceTypeAndBranch>(left, ODDBALL_TYPE); |
+ if_builder.OrIf<HHasInstanceTypeAndBranch>(right, ODDBALL_TYPE); |
+ if_builder.Then(); |
+ Add<HCallRuntime>( |
+ isolate()->factory()->empty_string(), |
+ Runtime::FunctionForId(Runtime::kThrowStrongModeImplicitConversion), |
+ 0); |
+ if (!graph()->info()->IsStub()) { |
+ Add<HSimulate>(opt_id, REMOVABLE_SIMULATE); |
+ } |
+ if_builder.End(); |
+ } |
switch (op) { |
case Token::ADD: |
instr = AddUncasted<HAdd>(left, right, strength); |
@@ -11246,6 +11264,19 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction( |
HBranch* branch = New<HBranch>(result); |
return branch; |
} else { |
+ if (is_strong(function_language_mode()) && |
+ Token::IsOrderedRelationalCompareOp(op)) { |
+ IfBuilder if_builder(this); |
+ if_builder.If<HHasInstanceTypeAndBranch>(left, ODDBALL_TYPE); |
+ if_builder.OrIf<HHasInstanceTypeAndBranch>(right, ODDBALL_TYPE); |
+ if_builder.Then(); |
+ Add<HCallRuntime>( |
+ isolate()->factory()->empty_string(), |
+ Runtime::FunctionForId(Runtime::kThrowStrongModeImplicitConversion), |
+ 0); |
+ Add<HSimulate>(bailout_id, REMOVABLE_SIMULATE); |
+ if_builder.End(); |
+ } |
HCompareNumericAndBranch* result = |
New<HCompareNumericAndBranch>(left, right, op); |
result->set_observed_input_representation(left_rep, right_rep); |