summaryrefslogtreecommitdiff
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.cc55
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;
}