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

Unified Diff: src/crankshaft/hydrogen.cc

Issue 1693833002: Remove strong mode support from binary operations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. Created 4 years, 10 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
Index: src/crankshaft/hydrogen.cc
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc
index da058376ea1378b1fc7be95d02a5504afe301328..a6c621bd60a05944cfdf5367c3a696e636563ebb 100644
--- a/src/crankshaft/hydrogen.cc
+++ b/src/crankshaft/hydrogen.cc
@@ -2581,8 +2581,8 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
HObjectAccess::ForFixedTypedArrayBaseExternalPointer());
HValue* base_pointer = Add<HLoadNamedField>(
elements, nullptr, HObjectAccess::ForFixedTypedArrayBaseBasePointer());
- HValue* backing_store = AddUncasted<HAdd>(
- external_pointer, base_pointer, Strength::WEAK, AddOfExternalAndTagged);
+ HValue* backing_store = AddUncasted<HAdd>(external_pointer, base_pointer,
+ AddOfExternalAndTagged);
if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) {
NoObservableSideEffectsScope no_effects(this);
@@ -10300,7 +10300,7 @@ HValue* HOptimizedGraphBuilder::BuildAllocateFixedTypedArray(
HValue* backing_store = AddUncasted<HAdd>(
Add<HConstant>(ExternalReference::fixed_typed_array_base_data_offset()),
- elements, Strength::WEAK, AddOfExternalAndTagged);
+ elements, AddOfExternalAndTagged);
HValue* key = builder.BeginBody(
Add<HConstant>(static_cast<int32_t>(0)),
@@ -10685,8 +10685,7 @@ HInstruction* HOptimizedGraphBuilder::BuildIncrement(
HConstant* delta = (expr->op() == Token::INC)
? graph()->GetConstant1()
: graph()->GetConstantMinus1();
- HInstruction* instr =
- AddUncasted<HAdd>(Top(), delta, strength(function_language_mode()));
+ HInstruction* instr = AddUncasted<HAdd>(Top(), delta);
if (instr->IsAdd()) {
HAdd* add = HAdd::cast(instr);
add->set_observed_input_representation(1, rep);
@@ -10980,8 +10979,7 @@ HValue* HOptimizedGraphBuilder::BuildBinaryOperation(
}
HValue* result = HGraphBuilder::BuildBinaryOperation(
expr->op(), left, right, left_type, right_type, result_type,
- fixed_right_arg, allocation_mode, strength(function_language_mode()),
- expr->id());
+ fixed_right_arg, allocation_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.
@@ -10997,11 +10995,12 @@ HValue* HOptimizedGraphBuilder::BuildBinaryOperation(
return result;
}
-
-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) {
+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,
+ 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
@@ -11044,7 +11043,7 @@ HValue* HGraphBuilder::BuildBinaryOperation(
maybe_string_add = op == Token::ADD;
}
- if (!maybe_string_add && !is_strong(strength)) {
+ if (!maybe_string_add) {
left = TruncateToNumber(left, &left_type);
right = TruncateToNumber(right, &right_type);
}
@@ -11052,43 +11051,36 @@ HValue* HGraphBuilder::BuildBinaryOperation(
// Special case for string addition here.
if (op == Token::ADD &&
(left_type->Is(Type::String()) || right_type->Is(Type::String()))) {
- if (is_strong(strength)) {
- // In strong mode, if the one side of an addition is a string,
- // the other side must be a string too.
+ // Validate type feedback for left argument.
+ if (left_type->Is(Type::String())) {
left = BuildCheckString(left);
- right = BuildCheckString(right);
- } else {
- // Validate type feedback for left argument.
- if (left_type->Is(Type::String())) {
- left = BuildCheckString(left);
- }
+ }
- // Validate type feedback for right argument.
- if (right_type->Is(Type::String())) {
- right = BuildCheckString(right);
- }
+ // Validate type feedback for right argument.
+ if (right_type->Is(Type::String())) {
+ right = BuildCheckString(right);
+ }
- // Convert left argument as necessary.
- if (left_type->Is(Type::Number())) {
- DCHECK(right_type->Is(Type::String()));
- left = BuildNumberToString(left, left_type);
- } else if (!left_type->Is(Type::String())) {
- DCHECK(right_type->Is(Type::String()));
- return AddUncasted<HStringAdd>(
- left, right, allocation_mode.GetPretenureMode(),
- STRING_ADD_CONVERT_LEFT, allocation_mode.feedback_site());
- }
+ // Convert left argument as necessary.
+ if (left_type->Is(Type::Number())) {
+ DCHECK(right_type->Is(Type::String()));
+ left = BuildNumberToString(left, left_type);
+ } else if (!left_type->Is(Type::String())) {
+ DCHECK(right_type->Is(Type::String()));
+ return AddUncasted<HStringAdd>(
+ left, right, allocation_mode.GetPretenureMode(),
+ STRING_ADD_CONVERT_LEFT, allocation_mode.feedback_site());
+ }
- // Convert right argument as necessary.
- if (right_type->Is(Type::Number())) {
- DCHECK(left_type->Is(Type::String()));
- right = BuildNumberToString(right, right_type);
- } else if (!right_type->Is(Type::String())) {
- DCHECK(left_type->Is(Type::String()));
- return AddUncasted<HStringAdd>(
- left, right, allocation_mode.GetPretenureMode(),
- STRING_ADD_CONVERT_RIGHT, allocation_mode.feedback_site());
- }
+ // Convert right argument as necessary.
+ if (right_type->Is(Type::Number())) {
+ DCHECK(left_type->Is(Type::String()));
+ right = BuildNumberToString(right, right_type);
+ } else if (!right_type->Is(Type::String())) {
+ DCHECK(left_type->Is(Type::String()));
+ return AddUncasted<HStringAdd>(
+ left, right, allocation_mode.GetPretenureMode(),
+ STRING_ADD_CONVERT_RIGHT, allocation_mode.feedback_site());
}
// Fast paths for empty constant strings.
@@ -11157,78 +11149,51 @@ HValue* HGraphBuilder::BuildBinaryOperation(
default:
UNREACHABLE();
case Token::ADD:
- function_id =
- is_strong(strength) ? Runtime::kAdd_Strong : Runtime::kAdd;
+ function_id = Runtime::kAdd;
break;
case Token::SUB:
- function_id = is_strong(strength) ? Runtime::kSubtract_Strong
- : Runtime::kSubtract;
+ function_id = Runtime::kSubtract;
break;
case Token::MUL:
- function_id = is_strong(strength) ? Runtime::kMultiply_Strong
- : Runtime::kMultiply;
+ function_id = Runtime::kMultiply;
break;
case Token::DIV:
- function_id =
- is_strong(strength) ? Runtime::kDivide_Strong : Runtime::kDivide;
+ function_id = Runtime::kDivide;
break;
case Token::MOD:
- function_id =
- is_strong(strength) ? Runtime::kModulus_Strong : Runtime::kModulus;
+ function_id = Runtime::kModulus;
break;
case Token::BIT_OR:
- function_id = is_strong(strength) ? Runtime::kBitwiseOr_Strong
- : Runtime::kBitwiseOr;
+ function_id = Runtime::kBitwiseOr;
break;
case Token::BIT_AND:
- function_id = is_strong(strength) ? Runtime::kBitwiseAnd_Strong
- : Runtime::kBitwiseAnd;
+ function_id = Runtime::kBitwiseAnd;
break;
case Token::BIT_XOR:
- function_id = is_strong(strength) ? Runtime::kBitwiseXor_Strong
- : Runtime::kBitwiseXor;
+ function_id = Runtime::kBitwiseXor;
break;
case Token::SAR:
- function_id = is_strong(strength) ? Runtime::kShiftRight_Strong
- : Runtime::kShiftRight;
+ function_id = Runtime::kShiftRight;
break;
case Token::SHR:
- function_id = is_strong(strength) ? Runtime::kShiftRightLogical_Strong
- : Runtime::kShiftRightLogical;
+ function_id = Runtime::kShiftRightLogical;
break;
case Token::SHL:
- function_id = is_strong(strength) ? Runtime::kShiftLeft_Strong
- : Runtime::kShiftLeft;
+ function_id = Runtime::kShiftLeft;
break;
}
Add<HPushArguments>(left, right);
instr = AddUncasted<HCallRuntime>(Runtime::FunctionForId(function_id), 2);
} else {
- if (is_strong(strength) && Token::IsBitOp(op)) {
- // TODO(conradw): This is not efficient, but is necessary to prevent
- // conversion of oddball values to numbers in strong mode. It would be
- // better to prevent the conversion rather than adding a runtime check.
- IfBuilder if_builder(this);
- if_builder.If<HHasInstanceTypeAndBranch>(left, ODDBALL_TYPE);
- if_builder.OrIf<HHasInstanceTypeAndBranch>(right, ODDBALL_TYPE);
- if_builder.Then();
- Add<HCallRuntime>(
- 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);
+ instr = AddUncasted<HAdd>(left, right);
break;
case Token::SUB:
- instr = AddUncasted<HSub>(left, right, strength);
+ instr = AddUncasted<HSub>(left, right);
break;
case Token::MUL:
- instr = AddUncasted<HMul>(left, right, strength);
+ instr = AddUncasted<HMul>(left, right);
break;
case Token::MOD: {
if (fixed_right_arg.IsJust() &&
@@ -11241,38 +11206,38 @@ HValue* HGraphBuilder::BuildBinaryOperation(
if_same.ElseDeopt(Deoptimizer::kUnexpectedRHSOfBinaryOperation);
right = fixed_right;
}
- instr = AddUncasted<HMod>(left, right, strength);
+ instr = AddUncasted<HMod>(left, right);
break;
}
case Token::DIV:
- instr = AddUncasted<HDiv>(left, right, strength);
+ instr = AddUncasted<HDiv>(left, right);
break;
case Token::BIT_XOR:
case Token::BIT_AND:
- instr = AddUncasted<HBitwise>(op, left, right, strength);
+ instr = AddUncasted<HBitwise>(op, left, right);
break;
case Token::BIT_OR: {
HValue *operand, *shift_amount;
if (left_type->Is(Type::Signed32()) &&
right_type->Is(Type::Signed32()) &&
MatchRotateRight(left, right, &operand, &shift_amount)) {
- instr = AddUncasted<HRor>(operand, shift_amount, strength);
+ instr = AddUncasted<HRor>(operand, shift_amount);
} else {
- instr = AddUncasted<HBitwise>(op, left, right, strength);
+ instr = AddUncasted<HBitwise>(op, left, right);
}
break;
}
case Token::SAR:
- instr = AddUncasted<HSar>(left, right, strength);
+ instr = AddUncasted<HSar>(left, right);
break;
case Token::SHR:
- instr = AddUncasted<HShr>(left, right, strength);
+ instr = AddUncasted<HShr>(left, right);
if (instr->IsShr() && CanBeZero(right)) {
graph()->RecordUint32Instruction(instr);
}
break;
case Token::SHL:
- instr = AddUncasted<HShl>(left, right, strength);
+ instr = AddUncasted<HShl>(left, right);
break;
default:
UNREACHABLE();
@@ -11730,8 +11695,7 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
return result;
} else {
if (combined_rep.IsTagged() || combined_rep.IsNone()) {
- HCompareGeneric* result = Add<HCompareGeneric>(
- left, right, op, strength(function_language_mode()));
+ HCompareGeneric* result = Add<HCompareGeneric>(left, right, op);
result->set_observed_input_representation(1, left_rep);
result->set_observed_input_representation(2, right_rep);
if (result->HasObservableSideEffects()) {
@@ -11747,8 +11711,8 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
HBranch* branch = New<HBranch>(result);
return branch;
} else {
- HCompareNumericAndBranch* result = New<HCompareNumericAndBranch>(
- left, right, op, strength(function_language_mode()));
+ HCompareNumericAndBranch* result =
+ New<HCompareNumericAndBranch>(left, right, op);
result->set_observed_input_representation(left_rep, right_rep);
if (top_info()->is_tracking_positions()) {
result->SetOperandPositions(zone(), left_position, right_position);

Powered by Google App Engine
This is Rietveld 408576698