aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/redundancy-elimination.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/redundancy-elimination.cc')
-rw-r--r--deps/v8/src/compiler/redundancy-elimination.cc23
1 files changed, 21 insertions, 2 deletions
diff --git a/deps/v8/src/compiler/redundancy-elimination.cc b/deps/v8/src/compiler/redundancy-elimination.cc
index fdab39fb43..5fe10848e0 100644
--- a/deps/v8/src/compiler/redundancy-elimination.cc
+++ b/deps/v8/src/compiler/redundancy-elimination.cc
@@ -29,6 +29,7 @@ Reduction RedundancyElimination::Reduce(Node* node) {
case IrOpcode::kCheckNotTaggedHole:
case IrOpcode::kCheckNumber:
case IrOpcode::kCheckReceiver:
+ case IrOpcode::kCheckReceiverOrNullOrUndefined:
case IrOpcode::kCheckSmi:
case IrOpcode::kCheckString:
case IrOpcode::kCheckSymbol:
@@ -135,6 +136,9 @@ bool CheckSubsumes(Node const* a, Node const* b) {
} else if (a->opcode() == IrOpcode::kCheckedTaggedSignedToInt32 &&
b->opcode() == IrOpcode::kCheckedTaggedToInt32) {
// CheckedTaggedSignedToInt32(node) implies CheckedTaggedToInt32(node)
+ } else if (a->opcode() == IrOpcode::kCheckReceiver &&
+ b->opcode() == IrOpcode::kCheckReceiverOrNullOrUndefined) {
+ // CheckReceiver(node) implies CheckReceiverOrNullOrUndefined(node)
} else if (a->opcode() != b->opcode()) {
return false;
} else {
@@ -150,13 +154,17 @@ bool CheckSubsumes(Node const* a, Node const* b) {
case IrOpcode::kCheckedTaggedSignedToInt32:
case IrOpcode::kCheckedTaggedToTaggedPointer:
case IrOpcode::kCheckedTaggedToTaggedSigned:
+ case IrOpcode::kCheckedUint32Bounds:
case IrOpcode::kCheckedUint32ToInt32:
case IrOpcode::kCheckedUint32ToTaggedSigned:
+ case IrOpcode::kCheckedUint64Bounds:
case IrOpcode::kCheckedUint64ToInt32:
case IrOpcode::kCheckedUint64ToTaggedSigned:
break;
case IrOpcode::kCheckedFloat64ToInt32:
- case IrOpcode::kCheckedTaggedToInt32: {
+ case IrOpcode::kCheckedFloat64ToInt64:
+ case IrOpcode::kCheckedTaggedToInt32:
+ case IrOpcode::kCheckedTaggedToInt64: {
const CheckMinusZeroParameters& ap =
CheckMinusZeroParametersOf(a->op());
const CheckMinusZeroParameters& bp =
@@ -192,11 +200,22 @@ bool CheckSubsumes(Node const* a, Node const* b) {
return true;
}
+bool TypeSubsumes(Node* node, Node* replacement) {
+ if (!NodeProperties::IsTyped(node) || !NodeProperties::IsTyped(replacement)) {
+ // If either node is untyped, we are running during an untyped optimization
+ // phase, and replacement is OK.
+ return true;
+ }
+ Type node_type = NodeProperties::GetType(node);
+ Type replacement_type = NodeProperties::GetType(replacement);
+ return replacement_type.Is(node_type);
+}
+
} // namespace
Node* RedundancyElimination::EffectPathChecks::LookupCheck(Node* node) const {
for (Check const* check = head_; check != nullptr; check = check->next) {
- if (CheckSubsumes(check->node, node)) {
+ if (CheckSubsumes(check->node, node) && TypeSubsumes(node, check->node)) {
DCHECK(!check->node->IsDead());
return check->node;
}