summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/decompression-elimination.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/decompression-elimination.cc')
-rw-r--r--deps/v8/src/compiler/decompression-elimination.cc39
1 files changed, 38 insertions, 1 deletions
diff --git a/deps/v8/src/compiler/decompression-elimination.cc b/deps/v8/src/compiler/decompression-elimination.cc
index 537744652b..5c0f6b1cfa 100644
--- a/deps/v8/src/compiler/decompression-elimination.cc
+++ b/deps/v8/src/compiler/decompression-elimination.cc
@@ -67,7 +67,6 @@ Reduction DecompressionElimination::ReduceCompress(Node* node) {
Node* input_node = node->InputAt(0);
IrOpcode::Value input_opcode = input_node->opcode();
if (IrOpcode::IsDecompressOpcode(input_opcode)) {
- DCHECK(IsValidDecompress(node->opcode(), input_opcode));
DCHECK_EQ(input_node->InputCount(), 1);
return Replace(input_node->InputAt(0));
} else if (IsReducibleConstantOpcode(input_opcode)) {
@@ -167,6 +166,42 @@ Reduction DecompressionElimination::ReduceTypedStateValues(Node* node) {
return any_change ? Changed(node) : NoChange();
}
+Reduction DecompressionElimination::ReduceWord32Equal(Node* node) {
+ DCHECK_EQ(node->opcode(), IrOpcode::kWord32Equal);
+
+ DCHECK_EQ(node->InputCount(), 2);
+ Node* lhs = node->InputAt(0);
+ Node* rhs = node->InputAt(1);
+
+ if (!IrOpcode::IsCompressOpcode(lhs->opcode()) ||
+ !IrOpcode::IsCompressOpcode(rhs->opcode())) {
+ return NoChange();
+ }
+ // Input nodes for compress operation.
+ lhs = lhs->InputAt(0);
+ rhs = rhs->InputAt(0);
+
+ bool changed = false;
+
+ if (lhs->opcode() == IrOpcode::kBitcastWordToTaggedSigned) {
+ Node* input = lhs->InputAt(0);
+ if (IsReducibleConstantOpcode(input->opcode())) {
+ node->ReplaceInput(0, GetCompressedConstant(input));
+ changed = true;
+ }
+ }
+
+ if (rhs->opcode() == IrOpcode::kBitcastWordToTaggedSigned) {
+ Node* input = rhs->InputAt(0);
+ if (IsReducibleConstantOpcode(input->opcode())) {
+ node->ReplaceInput(1, GetCompressedConstant(input));
+ changed = true;
+ }
+ }
+
+ return changed ? Changed(node) : NoChange();
+}
+
Reduction DecompressionElimination::ReduceWord64Equal(Node* node) {
DCHECK_EQ(node->opcode(), IrOpcode::kWord64Equal);
@@ -220,6 +255,8 @@ Reduction DecompressionElimination::Reduce(Node* node) {
return ReducePhi(node);
case IrOpcode::kTypedStateValues:
return ReduceTypedStateValues(node);
+ case IrOpcode::kWord32Equal:
+ return ReduceWord32Equal(node);
case IrOpcode::kWord64Equal:
return ReduceWord64Equal(node);
default: