summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/backend/bitcast-elider.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/backend/bitcast-elider.cc')
-rw-r--r--deps/v8/src/compiler/backend/bitcast-elider.cc57
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(); }