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

Unified Diff: src/compiler/js-typed-lowering.cc

Issue 2259613003: [turbofan] Reduce code duplication in JSTypedLowering somewhat. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 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/compiler/js-typed-lowering.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/js-typed-lowering.cc
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
index 51a56970995c46230bb6b80044b52a50d3f1da7c..a49a3ae28fefd0031ab0422fae107ae5264b3435 100644
--- a/src/compiler/js-typed-lowering.cc
+++ b/src/compiler/js-typed-lowering.cc
@@ -215,6 +215,68 @@ class JSBinopReduction final {
return ChangeToSpeculativeOperator(op, false, type);
}
+ const Operator* NumberOp() {
+ switch (node_->opcode()) {
+ case IrOpcode::kJSAdd:
+ return simplified()->NumberAdd();
+ case IrOpcode::kJSSubtract:
+ return simplified()->NumberSubtract();
+ case IrOpcode::kJSMultiply:
+ return simplified()->NumberMultiply();
+ case IrOpcode::kJSDivide:
+ return simplified()->NumberDivide();
+ case IrOpcode::kJSModulus:
+ return simplified()->NumberModulus();
+ case IrOpcode::kJSBitwiseAnd:
+ return simplified()->NumberBitwiseAnd();
+ case IrOpcode::kJSBitwiseOr:
+ return simplified()->NumberBitwiseOr();
+ case IrOpcode::kJSBitwiseXor:
+ return simplified()->NumberBitwiseXor();
+ case IrOpcode::kJSShiftLeft:
+ return simplified()->NumberShiftLeft();
+ case IrOpcode::kJSShiftRight:
+ return simplified()->NumberShiftRight();
+ case IrOpcode::kJSShiftRightLogical:
+ return simplified()->NumberShiftRightLogical();
+ default:
+ break;
+ }
+ UNREACHABLE();
+ return nullptr;
+ }
+
+ const Operator* SpeculativeNumberOp(NumberOperationHint hint) {
+ switch (node_->opcode()) {
+ case IrOpcode::kJSAdd:
+ return simplified()->SpeculativeNumberAdd(hint);
+ case IrOpcode::kJSSubtract:
+ return simplified()->SpeculativeNumberSubtract(hint);
+ case IrOpcode::kJSMultiply:
+ return simplified()->SpeculativeNumberMultiply(hint);
+ case IrOpcode::kJSDivide:
+ return simplified()->SpeculativeNumberDivide(hint);
+ case IrOpcode::kJSModulus:
+ return simplified()->SpeculativeNumberModulus(hint);
+ case IrOpcode::kJSBitwiseAnd:
+ return simplified()->SpeculativeNumberBitwiseAnd(hint);
+ case IrOpcode::kJSBitwiseOr:
+ return simplified()->SpeculativeNumberBitwiseOr(hint);
+ case IrOpcode::kJSBitwiseXor:
+ return simplified()->SpeculativeNumberBitwiseXor(hint);
+ case IrOpcode::kJSShiftLeft:
+ return simplified()->SpeculativeNumberShiftLeft(hint);
+ case IrOpcode::kJSShiftRight:
+ return simplified()->SpeculativeNumberShiftRight(hint);
+ case IrOpcode::kJSShiftRightLogical:
+ return simplified()->SpeculativeNumberShiftRightLogical(hint);
+ default:
+ break;
+ }
+ UNREACHABLE();
+ return nullptr;
+ }
+
bool LeftInputIs(Type* t) { return left_type()->Is(t); }
bool RightInputIs(Type* t) { return right_type()->Is(t); }
@@ -238,6 +300,7 @@ class JSBinopReduction final {
Node* right() { return NodeProperties::GetValueInput(node_, 1); }
Type* left_type() { return NodeProperties::GetType(node_->InputAt(0)); }
Type* right_type() { return NodeProperties::GetType(node_->InputAt(1)); }
+ Type* type() { return NodeProperties::GetType(node_); }
SimplifiedOperatorBuilder* simplified() { return lowering_->simplified(); }
Graph* graph() const { return lowering_->graph(); }
@@ -427,152 +490,57 @@ Reduction JSTypedLowering::ReduceJSAdd(Node* node) {
return NoChange();
}
-Reduction JSTypedLowering::ReduceJSSubtract(Node* node) {
+Reduction JSTypedLowering::ReduceNumberBinop(Node* node) {
JSBinopReduction r(this, node);
NumberOperationHint hint;
if (r.GetBinaryNumberOperationHint(&hint)) {
if (hint == NumberOperationHint::kNumberOrOddball &&
r.BothInputsAre(Type::PlainPrimitive())) {
- // JSSubtract(x:plain-primitive, y:plain-primitive)
- // => NumberSubtract(ToNumber(x), ToNumber(y))
r.ConvertInputsToNumber();
- return r.ChangeToPureOperator(simplified()->NumberSubtract(),
- Type::Number());
+ return r.ChangeToPureOperator(r.NumberOp(), Type::Number());
}
- return r.ChangeToSpeculativeOperator(
- simplified()->SpeculativeNumberSubtract(hint), Type::Number());
+ return r.ChangeToSpeculativeOperator(r.SpeculativeNumberOp(hint),
+ Type::Number());
}
if (r.BothInputsAre(Type::PlainPrimitive()) ||
!(flags() & kDeoptimizationEnabled)) {
r.ConvertInputsToNumber();
- return r.ChangeToPureOperator(simplified()->NumberSubtract(),
- Type::Number());
+ return r.ChangeToPureOperator(r.NumberOp(), Type::Number());
}
return NoChange();
}
-Reduction JSTypedLowering::ReduceJSMultiply(Node* node) {
+Reduction JSTypedLowering::ReduceInt32Binop(Node* node) {
JSBinopReduction r(this, node);
NumberOperationHint hint;
if (r.GetBinaryNumberOperationHint(&hint)) {
- if (hint == NumberOperationHint::kNumberOrOddball &&
- r.BothInputsAre(Type::PlainPrimitive())) {
- // JSMultiply(x:plain-primitive,
- // y:plain-primitive) => NumberMultiply(ToNumber(x),
- // ToNumber(y))
- r.ConvertInputsToNumber();
- return r.ChangeToPureOperator(simplified()->NumberMultiply(),
- Type::Number());
- }
- return r.ChangeToSpeculativeOperator(
- simplified()->SpeculativeNumberMultiply(hint), Type::Number());
- }
- if (r.BothInputsAre(Type::PlainPrimitive()) ||
- !(flags() & kDeoptimizationEnabled)) {
- r.ConvertInputsToNumber();
- return r.ChangeToPureOperator(simplified()->NumberMultiply(),
- Type::Number());
- }
- return NoChange();
-}
-
-Reduction JSTypedLowering::ReduceJSDivide(Node* node) {
- JSBinopReduction r(this, node);
- NumberOperationHint hint;
- if (r.GetBinaryNumberOperationHint(&hint)) {
- if (hint == NumberOperationHint::kNumberOrOddball &&
- r.BothInputsAre(Type::PlainPrimitive())) {
- // JSDivide(x:plain-primitive,
- // y:plain-primitive) => NumberDivide(ToNumber(x), ToNumber(y))
- r.ConvertInputsToNumber();
- return r.ChangeToPureOperator(simplified()->NumberDivide(),
- Type::Number());
- }
- return r.ChangeToSpeculativeOperator(
- simplified()->SpeculativeNumberDivide(hint), Type::Number());
- }
- if (r.BothInputsAre(Type::PlainPrimitive())) {
- // JSDivide(x:plain-primitive,
- // y:plain-primitive) => NumberDivide(ToNumber(x), ToNumber(y))
- r.ConvertInputsToNumber();
- return r.ChangeToPureOperator(simplified()->NumberDivide(), Type::Number());
- }
- return NoChange();
-}
-
-Reduction JSTypedLowering::ReduceJSModulus(Node* node) {
- JSBinopReduction r(this, node);
- NumberOperationHint hint;
- if (r.GetBinaryNumberOperationHint(&hint)) {
- if (hint == NumberOperationHint::kNumberOrOddball &&
- r.BothInputsAre(Type::PlainPrimitive())) {
- // JSModulus(x:plain-primitive,
- // y:plain-primitive) => NumberModulus(ToNumber(x), ToNumber(y))
- r.ConvertInputsToNumber();
- return r.ChangeToPureOperator(simplified()->NumberModulus(),
- Type::Number());
- }
- return r.ChangeToSpeculativeOperator(
- simplified()->SpeculativeNumberModulus(hint), Type::Number());
- }
- if (r.BothInputsAre(Type::PlainPrimitive())) {
- // JSModulus(x:plain-primitive,
- // y:plain-primitive) => NumberModulus(ToNumber(x), ToNumber(y))
- r.ConvertInputsToNumber();
- return r.ChangeToPureOperator(simplified()->NumberModulus(),
- Type::Number());
- }
- return NoChange();
-}
-
-Reduction JSTypedLowering::ReduceInt32Binop(Node* node,
- const Operator* int_op) {
- JSBinopReduction r(this, node);
- NumberOperationHint hint;
- if (r.GetBinaryNumberOperationHint(&hint)) {
- Operator const* speculative_op;
- if (int_op->opcode() == IrOpcode::kNumberBitwiseAnd) {
- speculative_op = simplified()->SpeculativeNumberBitwiseAnd(hint);
- } else if (int_op->opcode() == IrOpcode::kNumberBitwiseOr) {
- speculative_op = simplified()->SpeculativeNumberBitwiseOr(hint);
- } else {
- DCHECK_EQ(IrOpcode::kNumberBitwiseXor, int_op->opcode());
- speculative_op = simplified()->SpeculativeNumberBitwiseXor(hint);
- }
- return r.ChangeToSpeculativeOperator(speculative_op, Type::Signed32());
+ return r.ChangeToSpeculativeOperator(r.SpeculativeNumberOp(hint),
+ Type::Signed32());
}
if (r.BothInputsAre(Type::PlainPrimitive()) ||
!(flags() & kDeoptimizationEnabled)) {
r.ConvertInputsToNumber();
r.ConvertInputsToUI32(kSigned, kSigned);
- return r.ChangeToPureOperator(int_op, Type::Signed32());
+ return r.ChangeToPureOperator(r.NumberOp(), Type::Signed32());
}
return NoChange();
}
-Reduction JSTypedLowering::ReduceUI32Shift(Node* node, Signedness signedness,
- const Operator* shift_op) {
+Reduction JSTypedLowering::ReduceUI32Shift(Node* node, Signedness signedness) {
JSBinopReduction r(this, node);
NumberOperationHint hint;
if (r.GetBinaryNumberOperationHint(&hint)) {
- Operator const* speculative_op;
- if (shift_op->opcode() == IrOpcode::kNumberShiftLeft) {
- speculative_op = simplified()->SpeculativeNumberShiftLeft(hint);
- } else if (shift_op->opcode() == IrOpcode::kNumberShiftRightLogical) {
- speculative_op = simplified()->SpeculativeNumberShiftRightLogical(hint);
- } else {
- DCHECK_EQ(IrOpcode::kNumberShiftRight, shift_op->opcode());
- speculative_op = simplified()->SpeculativeNumberShiftRight(hint);
- }
return r.ChangeToSpeculativeOperator(
- speculative_op,
+ r.SpeculativeNumberOp(hint),
signedness == kUnsigned ? Type::Unsigned32() : Type::Signed32());
}
if (r.BothInputsAre(Type::PlainPrimitive()) ||
!(flags() & kDeoptimizationEnabled)) {
r.ConvertInputsToNumber();
r.ConvertInputsToUI32(signedness, kUnsigned);
- return r.ChangeToPureOperator(shift_op);
+ return r.ChangeToPureOperator(r.NumberOp(), signedness == kUnsigned
+ ? Type::Unsigned32()
+ : Type::Signed32());
}
return NoChange();
}
@@ -2047,28 +2015,21 @@ Reduction JSTypedLowering::Reduce(Node* node) {
case IrOpcode::kJSGreaterThanOrEqual:
return ReduceJSComparison(node);
case IrOpcode::kJSBitwiseOr:
- return ReduceInt32Binop(node, simplified()->NumberBitwiseOr());
case IrOpcode::kJSBitwiseXor:
- return ReduceInt32Binop(node, simplified()->NumberBitwiseXor());
case IrOpcode::kJSBitwiseAnd:
- return ReduceInt32Binop(node, simplified()->NumberBitwiseAnd());
+ return ReduceInt32Binop(node);
case IrOpcode::kJSShiftLeft:
- return ReduceUI32Shift(node, kSigned, simplified()->NumberShiftLeft());
case IrOpcode::kJSShiftRight:
- return ReduceUI32Shift(node, kSigned, simplified()->NumberShiftRight());
+ return ReduceUI32Shift(node, kSigned);
case IrOpcode::kJSShiftRightLogical:
- return ReduceUI32Shift(node, kUnsigned,
- simplified()->NumberShiftRightLogical());
+ return ReduceUI32Shift(node, kUnsigned);
case IrOpcode::kJSAdd:
return ReduceJSAdd(node);
case IrOpcode::kJSSubtract:
- return ReduceJSSubtract(node);
case IrOpcode::kJSMultiply:
- return ReduceJSMultiply(node);
case IrOpcode::kJSDivide:
- return ReduceJSDivide(node);
case IrOpcode::kJSModulus:
- return ReduceJSModulus(node);
+ return ReduceNumberBinop(node);
case IrOpcode::kJSToBoolean:
return ReduceJSToBoolean(node);
case IrOpcode::kJSToInteger:
« no previous file with comments | « src/compiler/js-typed-lowering.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698