Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Unified Diff: src/hydrogen.cc

Issue 1216463003: [strong] Implement strong mode semantics for the count operation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: cl feedback + eliminate runtime check Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index 0019b6d578c803af9f19376d253cfc8945165ef6..3eb8940f34c3b30ac96c232ac0c0ed4d962b40bc 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
@@ -10326,8 +10326,12 @@ HInstruction* HOptimizedGraphBuilder::BuildIncrement(
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 +10615,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 +10635,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 +10681,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 +10791,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,8 +11262,8 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
HBranch* branch = New<HBranch>(result);
return branch;
} else {
- HCompareNumericAndBranch* result =
- New<HCompareNumericAndBranch>(left, right, op);
+ HCompareNumericAndBranch* result = New<HCompareNumericAndBranch>(
+ left, right, op, strength(function_language_mode()));
result->set_observed_input_representation(left_rep, right_rep);
if (top_info()->is_tracking_positions()) {
result->SetOperandPositions(zone(), left_position, right_position);
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698