diff options
Diffstat (limited to 'deps/v8/src/compiler/redundancy-elimination.cc')
-rw-r--r-- | deps/v8/src/compiler/redundancy-elimination.cc | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/deps/v8/src/compiler/redundancy-elimination.cc b/deps/v8/src/compiler/redundancy-elimination.cc index 3a40e8d5bf..eedf946fb6 100644 --- a/deps/v8/src/compiler/redundancy-elimination.cc +++ b/deps/v8/src/compiler/redundancy-elimination.cc @@ -5,6 +5,7 @@ #include "src/compiler/redundancy-elimination.h" #include "src/compiler/node-properties.h" +#include "src/compiler/simplified-operator.h" namespace v8 { namespace internal { @@ -19,26 +20,36 @@ Reduction RedundancyElimination::Reduce(Node* node) { if (node_checks_.Get(node)) return NoChange(); switch (node->opcode()) { case IrOpcode::kCheckBounds: + case IrOpcode::kCheckEqualsInternalizedString: + case IrOpcode::kCheckEqualsSymbol: case IrOpcode::kCheckFloat64Hole: case IrOpcode::kCheckHeapObject: case IrOpcode::kCheckIf: case IrOpcode::kCheckInternalizedString: + case IrOpcode::kCheckNotTaggedHole: case IrOpcode::kCheckNumber: case IrOpcode::kCheckReceiver: + case IrOpcode::kCheckSeqString: case IrOpcode::kCheckSmi: case IrOpcode::kCheckString: - case IrOpcode::kCheckSeqString: - case IrOpcode::kCheckNotTaggedHole: + case IrOpcode::kCheckSymbol: case IrOpcode::kCheckedFloat64ToInt32: case IrOpcode::kCheckedInt32Add: - case IrOpcode::kCheckedInt32Sub: case IrOpcode::kCheckedInt32Div: case IrOpcode::kCheckedInt32Mod: case IrOpcode::kCheckedInt32Mul: - case IrOpcode::kCheckedTaggedToFloat64: + case IrOpcode::kCheckedInt32Sub: + case IrOpcode::kCheckedInt32ToTaggedSigned: case IrOpcode::kCheckedTaggedSignedToInt32: + case IrOpcode::kCheckedTaggedToFloat64: case IrOpcode::kCheckedTaggedToInt32: + case IrOpcode::kCheckedTaggedToTaggedPointer: + case IrOpcode::kCheckedTaggedToTaggedSigned: + case IrOpcode::kCheckedTruncateTaggedToWord32: + case IrOpcode::kCheckedUint32Div: + case IrOpcode::kCheckedUint32Mod: case IrOpcode::kCheckedUint32ToInt32: + case IrOpcode::kCheckedUint32ToTaggedSigned: return ReduceCheckNode(node); case IrOpcode::kSpeculativeNumberAdd: case IrOpcode::kSpeculativeNumberSubtract: @@ -124,13 +135,43 @@ RedundancyElimination::EffectPathChecks::AddCheck(Zone* zone, namespace { -bool IsCompatibleCheck(Node const* a, Node const* b) { +// Does check {a} subsume check {b}? +bool CheckSubsumes(Node const* a, Node const* b) { if (a->op() != b->op()) { if (a->opcode() == IrOpcode::kCheckInternalizedString && b->opcode() == IrOpcode::kCheckString) { // CheckInternalizedString(node) implies CheckString(node) - } else { + } else if (a->opcode() != b->opcode()) { return false; + } else { + switch (a->opcode()) { + case IrOpcode::kCheckBounds: + case IrOpcode::kCheckSmi: + case IrOpcode::kCheckString: + case IrOpcode::kCheckNumber: + break; + case IrOpcode::kCheckedInt32ToTaggedSigned: + case IrOpcode::kCheckedTaggedSignedToInt32: + case IrOpcode::kCheckedTaggedToTaggedPointer: + case IrOpcode::kCheckedTaggedToTaggedSigned: + case IrOpcode::kCheckedUint32ToInt32: + case IrOpcode::kCheckedUint32ToTaggedSigned: + break; + case IrOpcode::kCheckedFloat64ToInt32: + case IrOpcode::kCheckedTaggedToInt32: { + const CheckMinusZeroParameters& ap = + CheckMinusZeroParametersOf(a->op()); + const CheckMinusZeroParameters& bp = + CheckMinusZeroParametersOf(b->op()); + if (ap.mode() != bp.mode()) { + return false; + } + break; + } + default: + DCHECK(!IsCheckedWithFeedback(a->op())); + return false; + } } } for (int i = a->op()->ValueInputCount(); --i >= 0;) { @@ -143,7 +184,7 @@ bool IsCompatibleCheck(Node const* a, Node const* b) { Node* RedundancyElimination::EffectPathChecks::LookupCheck(Node* node) const { for (Check const* check = head_; check != nullptr; check = check->next) { - if (IsCompatibleCheck(check->node, node)) { + if (CheckSubsumes(check->node, node)) { DCHECK(!check->node->IsDead()); return check->node; } |