diff options
Diffstat (limited to 'deps/v8/src/compiler/backend/bitcast-elider.cc')
-rw-r--r-- | deps/v8/src/compiler/backend/bitcast-elider.cc | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/deps/v8/src/compiler/backend/bitcast-elider.cc b/deps/v8/src/compiler/backend/bitcast-elider.cc index 263e3d691b..403e6d318c 100644 --- a/deps/v8/src/compiler/backend/bitcast-elider.cc +++ b/deps/v8/src/compiler/backend/bitcast-elider.cc @@ -20,6 +20,37 @@ bool IsBitcast(Node* node) { node->opcode() == IrOpcode::kBitcastWordToTaggedSigned; } +bool OwnedByWord32Op(Node* node) { +#if V8_TARGET_ARCH_LOONG64 || V8_TARGET_ARCH_MIPS64 + return false; +#else + for (Node* const use : node->uses()) { + switch (use->opcode()) { + case IrOpcode::kWord32Equal: + case IrOpcode::kInt32LessThan: + case IrOpcode::kInt32LessThanOrEqual: + case IrOpcode::kUint32LessThan: + case IrOpcode::kUint32LessThanOrEqual: + case IrOpcode::kChangeInt32ToInt64: +#define Word32Op(Name) case IrOpcode::k##Name: + MACHINE_BINOP_32_LIST(Word32Op) +#undef Word32Op + break; + default: + return false; + } + } + return true; +#endif +} + +void Replace(Node* node, Node* replacement) { + for (Edge edge : node->use_edges()) { + edge.UpdateTo(replacement); + } + node->Kill(); +} + } // namespace void BitcastElider::Enqueue(Node* node) { @@ -28,18 +59,21 @@ void BitcastElider::Enqueue(Node* node) { to_visit_.push(node); } +void BitcastElider::Revisit(Node* node) { to_visit_.push(node); } + void BitcastElider::VisitNode(Node* node) { for (int i = 0; i < node->InputCount(); i++) { Node* input = node->InputAt(i); - bool should_replace_input = false; - while (IsBitcast(input)) { - input = input->InputAt(0); - should_replace_input = true; - } - if (should_replace_input) { - node->ReplaceInput(i, input); + if (input->opcode() == IrOpcode::kTruncateInt64ToInt32 && + OwnedByWord32Op(input)) { + Replace(input, input->InputAt(0)); + Revisit(node); + } else if (is_builtin_ && IsBitcast(input)) { + Replace(input, input->InputAt(0)); + Revisit(node); + } else { + Enqueue(input); } - Enqueue(input); } } @@ -52,8 +86,11 @@ void BitcastElider::ProcessGraph() { } } -BitcastElider::BitcastElider(Zone* zone, Graph* graph) - : graph_(graph), to_visit_(zone), seen_(graph, 2) {} +BitcastElider::BitcastElider(Zone* zone, Graph* graph, bool is_builtin) + : graph_(graph), + to_visit_(zone), + seen_(graph, 2), + is_builtin_(is_builtin) {} void BitcastElider::Reduce() { ProcessGraph(); } |