Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: src/compiler/representation-change.cc

Issue 2476593002: [turbofan] Improve representation selection for HeapObject checking. (Closed)
Patch Set: REBASE and fix. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/representation-change.h ('k') | src/compiler/simplified-lowering.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/representation-change.cc
diff --git a/src/compiler/representation-change.cc b/src/compiler/representation-change.cc
index 4200137f27189bc4b472119abfedaa8636810a2e..e3e5108ee398486a1cdd04b8750f6fde3d22e6e1 100644
--- a/src/compiler/representation-change.cc
+++ b/src/compiler/representation-change.cc
@@ -142,8 +142,10 @@ Node* RepresentationChanger::GetRepresentationFor(
return GetTaggedSignedRepresentationFor(node, output_rep, output_type,
use_node, use_info);
case MachineRepresentation::kTaggedPointer:
- DCHECK(use_info.type_check() == TypeCheckKind::kNone);
- return GetTaggedPointerRepresentationFor(node, output_rep, output_type);
+ DCHECK(use_info.type_check() == TypeCheckKind::kNone ||
+ use_info.type_check() == TypeCheckKind::kHeapObject);
+ return GetTaggedPointerRepresentationFor(node, output_rep, output_type,
+ use_node, use_info);
case MachineRepresentation::kTagged:
DCHECK(use_info.type_check() == TypeCheckKind::kNone);
return GetTaggedRepresentationFor(node, output_rep, output_type,
@@ -285,7 +287,8 @@ Node* RepresentationChanger::GetTaggedSignedRepresentationFor(
}
Node* RepresentationChanger::GetTaggedPointerRepresentationFor(
- Node* node, MachineRepresentation output_rep, Type* output_type) {
+ Node* node, MachineRepresentation output_rep, Type* output_type,
+ Node* use_node, UseInfo use_info) {
// Eagerly fold representation changes for constants.
switch (node->opcode()) {
case IrOpcode::kHeapConstant:
@@ -297,14 +300,46 @@ Node* RepresentationChanger::GetTaggedPointerRepresentationFor(
default:
break;
}
- // Select the correct X -> Tagged operator.
+ // Select the correct X -> TaggedPointer operator.
+ Operator const* op;
if (output_type->Is(Type::None())) {
// This is an impossible value; it should not be used at runtime.
// We just provide a dummy value here.
return jsgraph()->TheHoleConstant();
+ } else if (output_rep == MachineRepresentation::kBit) {
+ return node;
+ } else if (IsWord(output_rep)) {
+ if (output_type->Is(Type::Unsigned32())) {
+ // uint32 -> float64 -> tagged
+ node = InsertChangeUint32ToFloat64(node);
+ } else if (output_type->Is(Type::Signed32())) {
+ // int32 -> float64 -> tagged
+ node = InsertChangeInt32ToFloat64(node);
+ } else {
+ return TypeError(node, output_rep, output_type,
+ MachineRepresentation::kTaggedPointer);
+ }
+ op = simplified()->ChangeFloat64ToTaggedPointer();
+ } else if (output_rep == MachineRepresentation::kFloat32) {
+ // float32 -> float64 -> tagged
+ node = InsertChangeFloat32ToFloat64(node);
+ op = simplified()->ChangeFloat64ToTaggedPointer();
+ } else if (output_rep == MachineRepresentation::kFloat64) {
+ // float64 -> tagged
+ op = simplified()->ChangeFloat64ToTaggedPointer();
+ } else if (CanBeTaggedSigned(output_rep) &&
+ use_info.type_check() == TypeCheckKind::kHeapObject) {
+ if (!output_type->Maybe(Type::SignedSmall())) {
+ return node;
+ }
+ // TODO(turbofan): Consider adding a Bailout operator that just deopts
+ // for TaggedSigned output representation.
+ op = simplified()->CheckedTaggedToTaggedPointer();
+ } else {
+ return TypeError(node, output_rep, output_type,
+ MachineRepresentation::kTaggedPointer);
}
- return TypeError(node, output_rep, output_type,
- MachineRepresentation::kTaggedPointer);
+ return InsertConversion(node, op, use_node);
}
Node* RepresentationChanger::GetTaggedRepresentationFor(
@@ -953,6 +988,10 @@ Node* RepresentationChanger::InsertChangeFloat64ToInt32(Node* node) {
return jsgraph()->graph()->NewNode(machine()->ChangeFloat64ToInt32(), node);
}
+Node* RepresentationChanger::InsertChangeInt32ToFloat64(Node* node) {
+ return jsgraph()->graph()->NewNode(machine()->ChangeInt32ToFloat64(), node);
+}
+
Node* RepresentationChanger::InsertChangeTaggedSignedToInt32(Node* node) {
return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedSignedToInt32(),
node);
@@ -963,6 +1002,10 @@ Node* RepresentationChanger::InsertChangeTaggedToFloat64(Node* node) {
node);
}
+Node* RepresentationChanger::InsertChangeUint32ToFloat64(Node* node) {
+ return jsgraph()->graph()->NewNode(machine()->ChangeUint32ToFloat64(), node);
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
« no previous file with comments | « src/compiler/representation-change.h ('k') | src/compiler/simplified-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698