Index: src/compiler/simplified-lowering.cc |
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
index 0c01b1442a8b173e4e29ae94f865e6e1fac0ee16..0fb61a1339a67deebe818b760d31aa6a7781fd63 100644 |
--- a/src/compiler/simplified-lowering.cc |
+++ b/src/compiler/simplified-lowering.cc |
@@ -242,75 +242,6 @@ class InputUseInfos { |
class RepresentationSelector { |
public: |
// Information for each node tracked during the fixpoint. |
- class NodeOutputInfo { |
- public: |
- NodeOutputInfo(MachineRepresentation representation, Type* type) |
- : type_(type), representation_(representation) {} |
- NodeOutputInfo() |
- : type_(Type::None()), representation_(MachineRepresentation::kNone) {} |
- |
- MachineRepresentation representation() const { return representation_; } |
- Type* type() const { return type_; } |
- |
- static NodeOutputInfo None() { |
- return NodeOutputInfo(MachineRepresentation::kNone, Type::None()); |
- } |
- |
- static NodeOutputInfo Float32() { |
- return NodeOutputInfo(MachineRepresentation::kFloat32, Type::Number()); |
- } |
- |
- static NodeOutputInfo Float64() { |
- return NodeOutputInfo(MachineRepresentation::kFloat64, Type::Number()); |
- } |
- |
- static NodeOutputInfo NumberTruncatedToWord32() { |
- return NodeOutputInfo(MachineRepresentation::kWord32, Type::Number()); |
- } |
- |
- static NodeOutputInfo Int32() { |
- return NodeOutputInfo(MachineRepresentation::kWord32, Type::Signed32()); |
- } |
- |
- static NodeOutputInfo Uint32() { |
- return NodeOutputInfo(MachineRepresentation::kWord32, Type::Unsigned32()); |
- } |
- |
- static NodeOutputInfo Bool() { |
- return NodeOutputInfo(MachineRepresentation::kBit, Type::Boolean()); |
- } |
- |
- static NodeOutputInfo Int64() { |
- // TODO(jarin) Fix once we have a real int64 type. |
- return NodeOutputInfo(MachineRepresentation::kWord64, Type::Internal()); |
- } |
- |
- static NodeOutputInfo Uint64() { |
- // TODO(jarin) Fix once we have a real uint64 type. |
- return NodeOutputInfo(MachineRepresentation::kWord64, Type::Internal()); |
- } |
- |
- static NodeOutputInfo AnyTagged() { |
- return NodeOutputInfo(MachineRepresentation::kTagged, Type::Any()); |
- } |
- |
- static NodeOutputInfo BoolTagged() { |
- return NodeOutputInfo(MachineRepresentation::kTagged, Type::Boolean()); |
- } |
- |
- static NodeOutputInfo NumberTagged() { |
- return NodeOutputInfo(MachineRepresentation::kTagged, Type::Number()); |
- } |
- |
- static NodeOutputInfo Pointer() { |
- return NodeOutputInfo(MachineType::PointerRepresentation(), Type::Any()); |
- } |
- |
- private: |
- Type* type_; |
- MachineRepresentation representation_; |
- }; |
- |
class NodeInfo { |
public: |
// Adds new use to the node. Returns true if something has changed |
@@ -326,17 +257,15 @@ class RepresentationSelector { |
void set_visited() { visited_ = true; } |
bool visited() const { return visited_; } |
Truncation truncation() const { return truncation_; } |
- void set_output_type(NodeOutputInfo output) { output_ = output; } |
+ void set_output(MachineRepresentation output) { representation_ = output; } |
- Type* output_type() const { return output_.type(); } |
- MachineRepresentation representation() const { |
- return output_.representation(); |
- } |
+ MachineRepresentation representation() const { return representation_; } |
private: |
- bool queued_ = false; // Bookkeeping for the traversal. |
- bool visited_ = false; // Bookkeeping for the traversal. |
- NodeOutputInfo output_; // Output type and representation. |
+ bool queued_ = false; // Bookkeeping for the traversal. |
+ bool visited_ = false; // Bookkeeping for the traversal. |
+ MachineRepresentation representation_ = |
+ MachineRepresentation::kNone; // Output representation. |
Truncation truncation_ = Truncation::None(); // Information about uses. |
}; |
@@ -471,76 +400,31 @@ class RepresentationSelector { |
} |
} |
- void SetOutputFromMachineType(Node* node, MachineType machine_type) { |
- Type* type = Type::None(); |
- switch (machine_type.semantic()) { |
- case MachineSemantic::kNone: |
- type = Type::None(); |
- break; |
- case MachineSemantic::kBool: |
- type = Type::Boolean(); |
- break; |
- case MachineSemantic::kInt32: |
- type = Type::Signed32(); |
- break; |
- case MachineSemantic::kUint32: |
- type = Type::Unsigned32(); |
- break; |
- case MachineSemantic::kInt64: |
- // TODO(jarin) Fix once we have proper int64. |
- type = Type::Internal(); |
- break; |
- case MachineSemantic::kUint64: |
- // TODO(jarin) Fix once we have proper uint64. |
- type = Type::Internal(); |
- break; |
- case MachineSemantic::kNumber: |
- type = Type::Number(); |
- break; |
- case MachineSemantic::kAny: |
- type = Type::Any(); |
- break; |
- } |
- return SetOutput(node, NodeOutputInfo(machine_type.representation(), type)); |
- } |
- |
- void SetOutput(Node* node, NodeOutputInfo output_info) { |
- // Every node should have at most one output representation. Note that |
- // phis can have 0, if they have not been used in a representation-inducing |
- // instruction. |
- Type* output_type = output_info.type(); |
- if (NodeProperties::IsTyped(node)) { |
- output_type = Type::Intersect(NodeProperties::GetType(node), |
- output_info.type(), jsgraph_->zone()); |
- } |
+ void SetOutput(Node* node, MachineRepresentation representation) { |
NodeInfo* info = GetInfo(node); |
- DCHECK(info->output_type()->Is(output_type)); |
- DCHECK(MachineRepresentationIsSubtype(info->representation(), |
- output_info.representation())); |
- if (!output_type->Is(info->output_type()) || |
- output_info.representation() != info->representation()) { |
- EnqueueUses(node); |
- } |
- info->set_output_type( |
- NodeOutputInfo(output_info.representation(), output_type)); |
+ DCHECK( |
+ MachineRepresentationIsSubtype(info->representation(), representation)); |
+ info->set_output(representation); |
} |
+ Type* GetUpperBound(Node* node) { return NodeProperties::GetType(node); } |
+ |
bool BothInputsAreSigned32(Node* node) { |
DCHECK_EQ(2, node->InputCount()); |
- return GetInfo(node->InputAt(0))->output_type()->Is(Type::Signed32()) && |
- GetInfo(node->InputAt(1))->output_type()->Is(Type::Signed32()); |
+ return GetUpperBound(node->InputAt(0))->Is(Type::Signed32()) && |
+ GetUpperBound(node->InputAt(1))->Is(Type::Signed32()); |
} |
bool BothInputsAreUnsigned32(Node* node) { |
DCHECK_EQ(2, node->InputCount()); |
- return GetInfo(node->InputAt(0))->output_type()->Is(Type::Unsigned32()) && |
- GetInfo(node->InputAt(1))->output_type()->Is(Type::Unsigned32()); |
+ return GetUpperBound(node->InputAt(0))->Is(Type::Unsigned32()) && |
+ GetUpperBound(node->InputAt(1))->Is(Type::Unsigned32()); |
} |
bool BothInputsAre(Node* node, Type* type) { |
DCHECK_EQ(2, node->InputCount()); |
- return GetInfo(node->InputAt(0))->output_type()->Is(type) && |
- GetInfo(node->InputAt(1))->output_type()->Is(type); |
+ return GetUpperBound(node->InputAt(0))->Is(type) && |
+ GetUpperBound(node->InputAt(1))->Is(type); |
} |
void ConvertInput(Node* node, int index, UseInfo use) { |
@@ -560,7 +444,7 @@ class RepresentationSelector { |
PrintUseInfo(use); |
TRACE("\n"); |
Node* n = changer_->GetRepresentationFor( |
- input, input_info->representation(), input_info->output_type(), |
+ input, input_info->representation(), GetUpperBound(input), |
use.preferred(), use.truncation()); |
node->ReplaceInput(index, n); |
} |
@@ -606,7 +490,7 @@ class RepresentationSelector { |
// Helper for binops of the R x L -> O variety. |
void VisitBinop(Node* node, UseInfo left_use, UseInfo right_use, |
- NodeOutputInfo output) { |
+ MachineRepresentation output) { |
DCHECK_EQ(2, node->op()->ValueInputCount()); |
ProcessInput(node, 0, left_use); |
ProcessInput(node, 1, right_use); |
@@ -617,80 +501,77 @@ class RepresentationSelector { |
} |
// Helper for binops of the I x I -> O variety. |
- void VisitBinop(Node* node, UseInfo input_use, NodeOutputInfo output) { |
+ void VisitBinop(Node* node, UseInfo input_use, MachineRepresentation output) { |
VisitBinop(node, input_use, input_use, output); |
} |
// Helper for unops of the I -> O variety. |
- void VisitUnop(Node* node, UseInfo input_use, NodeOutputInfo output) { |
+ void VisitUnop(Node* node, UseInfo input_use, MachineRepresentation output) { |
DCHECK_EQ(1, node->InputCount()); |
ProcessInput(node, 0, input_use); |
SetOutput(node, output); |
} |
// Helper for leaf nodes. |
- void VisitLeaf(Node* node, NodeOutputInfo output) { |
+ void VisitLeaf(Node* node, MachineRepresentation output) { |
DCHECK_EQ(0, node->InputCount()); |
SetOutput(node, output); |
} |
// Helpers for specific types of binops. |
void VisitFloat64Binop(Node* node) { |
- VisitBinop(node, UseInfo::Float64(), NodeOutputInfo::Float64()); |
+ VisitBinop(node, UseInfo::Float64(), MachineRepresentation::kFloat64); |
} |
void VisitInt32Binop(Node* node) { |
- VisitBinop(node, UseInfo::TruncatingWord32(), NodeOutputInfo::Int32()); |
+ VisitBinop(node, UseInfo::TruncatingWord32(), |
+ MachineRepresentation::kWord32); |
} |
void VisitWord32TruncatingBinop(Node* node) { |
VisitBinop(node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo::NumberTruncatedToWord32()); |
+ MachineRepresentation::kWord32); |
} |
void VisitUint32Binop(Node* node) { |
- VisitBinop(node, UseInfo::TruncatingWord32(), NodeOutputInfo::Uint32()); |
+ VisitBinop(node, UseInfo::TruncatingWord32(), |
+ MachineRepresentation::kWord32); |
} |
void VisitInt64Binop(Node* node) { |
- VisitBinop(node, UseInfo::TruncatingWord64(), NodeOutputInfo::Int64()); |
+ VisitBinop(node, UseInfo::TruncatingWord64(), |
+ MachineRepresentation::kWord64); |
} |
void VisitUint64Binop(Node* node) { |
- VisitBinop(node, UseInfo::TruncatingWord64(), NodeOutputInfo::Uint64()); |
+ VisitBinop(node, UseInfo::TruncatingWord64(), |
+ MachineRepresentation::kWord64); |
} |
void VisitFloat64Cmp(Node* node) { |
- VisitBinop(node, UseInfo::Float64(), NodeOutputInfo::Bool()); |
+ VisitBinop(node, UseInfo::Float64(), MachineRepresentation::kBit); |
} |
void VisitInt32Cmp(Node* node) { |
- VisitBinop(node, UseInfo::TruncatingWord32(), NodeOutputInfo::Bool()); |
+ VisitBinop(node, UseInfo::TruncatingWord32(), MachineRepresentation::kBit); |
} |
void VisitUint32Cmp(Node* node) { |
- VisitBinop(node, UseInfo::TruncatingWord32(), NodeOutputInfo::Bool()); |
+ VisitBinop(node, UseInfo::TruncatingWord32(), MachineRepresentation::kBit); |
} |
void VisitInt64Cmp(Node* node) { |
- VisitBinop(node, UseInfo::TruncatingWord64(), NodeOutputInfo::Bool()); |
+ VisitBinop(node, UseInfo::TruncatingWord64(), MachineRepresentation::kBit); |
} |
void VisitUint64Cmp(Node* node) { |
- VisitBinop(node, UseInfo::TruncatingWord64(), NodeOutputInfo::Bool()); |
+ VisitBinop(node, UseInfo::TruncatingWord64(), MachineRepresentation::kBit); |
} |
// Infer representation for phi-like nodes. |
- NodeOutputInfo GetOutputInfoForPhi(Node* node, Truncation use) { |
- // Compute the type. |
- Type* type = GetInfo(node->InputAt(0))->output_type(); |
- for (int i = 1; i < node->op()->ValueInputCount(); ++i) { |
- type = Type::Union(type, GetInfo(node->InputAt(i))->output_type(), |
- jsgraph_->zone()); |
- } |
- |
+ MachineRepresentation GetOutputInfoForPhi(Node* node, Truncation use) { |
// Compute the representation. |
- MachineRepresentation rep = MachineRepresentation::kTagged; |
+ Type* type = GetUpperBound(node); |
if (type->Is(Type::None())) { |
- rep = MachineRepresentation::kNone; |
+ return MachineRepresentation::kNone; |
} else if (type->Is(Type::Signed32()) || type->Is(Type::Unsigned32())) { |
- rep = MachineRepresentation::kWord32; |
+ return MachineRepresentation::kWord32; |
} else if (use.TruncatesToWord32()) { |
- rep = MachineRepresentation::kWord32; |
+ return MachineRepresentation::kWord32; |
} else if (type->Is(Type::Boolean())) { |
- rep = MachineRepresentation::kBit; |
+ return MachineRepresentation::kBit; |
} else if (type->Is(Type::Number())) { |
- rep = MachineRepresentation::kFloat64; |
+ return MachineRepresentation::kFloat64; |
} else if (type->Is(Type::Internal())) { |
// We mark (u)int64 as Type::Internal. |
// TODO(jarin) This is a workaround for our lack of (u)int64 |
@@ -706,10 +587,10 @@ class RepresentationSelector { |
MachineRepresentation::kWord64); |
} |
#endif |
- rep = is_word64 ? MachineRepresentation::kWord64 |
- : MachineRepresentation::kTagged; |
+ return is_word64 ? MachineRepresentation::kWord64 |
+ : MachineRepresentation::kTagged; |
} |
- return NodeOutputInfo(rep, type); |
+ return MachineRepresentation::kTagged; |
} |
// Helper for handling selects. |
@@ -717,20 +598,20 @@ class RepresentationSelector { |
SimplifiedLowering* lowering) { |
ProcessInput(node, 0, UseInfo::Bool()); |
- NodeOutputInfo output = GetOutputInfoForPhi(node, truncation); |
+ MachineRepresentation output = GetOutputInfoForPhi(node, truncation); |
SetOutput(node, output); |
if (lower()) { |
// Update the select operator. |
SelectParameters p = SelectParametersOf(node->op()); |
- if (output.representation() != p.representation()) { |
- NodeProperties::ChangeOp(node, lowering->common()->Select( |
- output.representation(), p.hint())); |
+ if (output != p.representation()) { |
+ NodeProperties::ChangeOp(node, |
+ lowering->common()->Select(output, p.hint())); |
} |
} |
// Convert inputs to the output representation of this phi, pass the |
// truncation truncation along. |
- UseInfo input_use(output.representation(), truncation); |
+ UseInfo input_use(output, truncation); |
ProcessInput(node, 1, input_use); |
ProcessInput(node, 2, input_use); |
} |
@@ -738,21 +619,20 @@ class RepresentationSelector { |
// Helper for handling phis. |
void VisitPhi(Node* node, Truncation truncation, |
SimplifiedLowering* lowering) { |
- NodeOutputInfo output = GetOutputInfoForPhi(node, truncation); |
+ MachineRepresentation output = GetOutputInfoForPhi(node, truncation); |
SetOutput(node, output); |
int values = node->op()->ValueInputCount(); |
if (lower()) { |
// Update the phi operator. |
- if (output.representation() != PhiRepresentationOf(node->op())) { |
- NodeProperties::ChangeOp( |
- node, lowering->common()->Phi(output.representation(), values)); |
+ if (output != PhiRepresentationOf(node->op())) { |
+ NodeProperties::ChangeOp(node, lowering->common()->Phi(output, values)); |
} |
} |
// Convert inputs to the output representation of this phi, pass the |
// truncation truncation along. |
- UseInfo input_use(output.representation(), truncation); |
+ UseInfo input_use(output, truncation); |
for (int i = 0; i < node->InputCount(); i++) { |
ProcessInput(node, i, i < values ? input_use : UseInfo::None()); |
} |
@@ -776,9 +656,10 @@ class RepresentationSelector { |
} |
if (sig->return_count() > 0) { |
- SetOutputFromMachineType(node, desc->GetMachineSignature()->GetReturn()); |
+ SetOutput(node, |
+ desc->GetMachineSignature()->GetReturn().representation()); |
} else { |
- SetOutput(node, NodeOutputInfo::AnyTagged()); |
+ SetOutput(node, MachineRepresentation::kTagged); |
} |
} |
@@ -805,10 +686,10 @@ class RepresentationSelector { |
new (zone->New(sizeof(ZoneVector<MachineType>))) |
ZoneVector<MachineType>(node->InputCount(), zone); |
for (int i = 0; i < node->InputCount(); i++) { |
- NodeInfo* input_info = GetInfo(node->InputAt(i)); |
- MachineType machine_type( |
- input_info->representation(), |
- DeoptValueSemanticOf(input_info->output_type())); |
+ Node* input = node->InputAt(i); |
+ NodeInfo* input_info = GetInfo(input); |
+ MachineType machine_type(input_info->representation(), |
+ DeoptValueSemanticOf(GetUpperBound(input))); |
DCHECK(machine_type.representation() != |
MachineRepresentation::kWord32 || |
machine_type.semantic() == MachineSemantic::kInt32 || |
@@ -818,7 +699,7 @@ class RepresentationSelector { |
NodeProperties::ChangeOp(node, |
jsgraph_->common()->TypedStateValues(types)); |
} |
- SetOutput(node, NodeOutputInfo::AnyTagged()); |
+ SetOutput(node, MachineRepresentation::kTagged); |
} |
const Operator* Int32Op(Node* node) { |
@@ -843,28 +724,27 @@ class RepresentationSelector { |
//------------------------------------------------------------------ |
case IrOpcode::kStart: |
case IrOpcode::kDead: |
- return VisitLeaf(node, NodeOutputInfo::None()); |
+ return VisitLeaf(node, MachineRepresentation::kNone); |
case IrOpcode::kParameter: { |
// TODO(titzer): use representation from linkage. |
- Type* type = NodeProperties::GetType(node); |
ProcessInput(node, 0, UseInfo::None()); |
- SetOutput(node, NodeOutputInfo(MachineRepresentation::kTagged, type)); |
+ SetOutput(node, MachineRepresentation::kTagged); |
return; |
} |
case IrOpcode::kInt32Constant: |
- return VisitLeaf(node, NodeOutputInfo::Int32()); |
+ return VisitLeaf(node, MachineRepresentation::kWord32); |
case IrOpcode::kInt64Constant: |
- return VisitLeaf(node, NodeOutputInfo::Int64()); |
+ return VisitLeaf(node, MachineRepresentation::kWord64); |
case IrOpcode::kFloat32Constant: |
- return VisitLeaf(node, NodeOutputInfo::Float32()); |
+ return VisitLeaf(node, MachineRepresentation::kFloat32); |
case IrOpcode::kFloat64Constant: |
- return VisitLeaf(node, NodeOutputInfo::Float64()); |
+ return VisitLeaf(node, MachineRepresentation::kFloat64); |
case IrOpcode::kExternalConstant: |
- return VisitLeaf(node, NodeOutputInfo::Pointer()); |
+ return VisitLeaf(node, MachineType::PointerRepresentation()); |
case IrOpcode::kNumberConstant: |
- return VisitLeaf(node, NodeOutputInfo::NumberTagged()); |
+ return VisitLeaf(node, MachineRepresentation::kTagged); |
case IrOpcode::kHeapConstant: |
- return VisitLeaf(node, NodeOutputInfo::AnyTagged()); |
+ return VisitLeaf(node, MachineRepresentation::kTagged); |
case IrOpcode::kDeoptimizeIf: |
case IrOpcode::kDeoptimizeUnless: |
@@ -899,7 +779,7 @@ class RepresentationSelector { |
JS_OP_LIST(DEFINE_JS_CASE) |
#undef DEFINE_JS_CASE |
VisitInputs(node); |
- return SetOutput(node, NodeOutputInfo::AnyTagged()); |
+ return SetOutput(node, MachineRepresentation::kTagged); |
//------------------------------------------------------------------ |
// Simplified operators. |
@@ -919,7 +799,7 @@ class RepresentationSelector { |
} else { |
// No input representation requirement; adapt during lowering. |
ProcessInput(node, 0, UseInfo::AnyTruncatingToBool()); |
- SetOutput(node, NodeOutputInfo::Bool()); |
+ SetOutput(node, MachineRepresentation::kBit); |
} |
break; |
} |
@@ -937,7 +817,7 @@ class RepresentationSelector { |
} else { |
// No input representation requirement; adapt during lowering. |
ProcessInput(node, 0, UseInfo::AnyTruncatingToBool()); |
- SetOutput(node, NodeOutputInfo::Int32()); |
+ SetOutput(node, MachineRepresentation::kWord32); |
} |
break; |
} |
@@ -1065,27 +945,27 @@ class RepresentationSelector { |
break; |
} |
case IrOpcode::kNumberShiftLeft: { |
- Type* rhs_type = GetInfo(node->InputAt(1))->output_type(); |
+ Type* rhs_type = GetUpperBound(node->InputAt(1)); |
VisitBinop(node, UseInfo::TruncatingWord32(), |
- UseInfo::TruncatingWord32(), NodeOutputInfo::Int32()); |
+ UseInfo::TruncatingWord32(), MachineRepresentation::kWord32); |
if (lower()) { |
lowering->DoShift(node, lowering->machine()->Word32Shl(), rhs_type); |
} |
break; |
} |
case IrOpcode::kNumberShiftRight: { |
- Type* rhs_type = GetInfo(node->InputAt(1))->output_type(); |
+ Type* rhs_type = GetUpperBound(node->InputAt(1)); |
VisitBinop(node, UseInfo::TruncatingWord32(), |
- UseInfo::TruncatingWord32(), NodeOutputInfo::Int32()); |
+ UseInfo::TruncatingWord32(), MachineRepresentation::kWord32); |
if (lower()) { |
lowering->DoShift(node, lowering->machine()->Word32Sar(), rhs_type); |
} |
break; |
} |
case IrOpcode::kNumberShiftRightLogical: { |
- Type* rhs_type = GetInfo(node->InputAt(1))->output_type(); |
+ Type* rhs_type = GetUpperBound(node->InputAt(1)); |
VisitBinop(node, UseInfo::TruncatingWord32(), |
- UseInfo::TruncatingWord32(), NodeOutputInfo::Uint32()); |
+ UseInfo::TruncatingWord32(), MachineRepresentation::kWord32); |
if (lower()) { |
lowering->DoShift(node, lowering->machine()->Word32Shr(), rhs_type); |
} |
@@ -1093,18 +973,20 @@ class RepresentationSelector { |
} |
case IrOpcode::kNumberToInt32: { |
// Just change representation if necessary. |
- VisitUnop(node, UseInfo::TruncatingWord32(), NodeOutputInfo::Int32()); |
+ VisitUnop(node, UseInfo::TruncatingWord32(), |
+ MachineRepresentation::kWord32); |
if (lower()) DeferReplacement(node, node->InputAt(0)); |
break; |
} |
case IrOpcode::kNumberToUint32: { |
// Just change representation if necessary. |
- VisitUnop(node, UseInfo::TruncatingWord32(), NodeOutputInfo::Uint32()); |
+ VisitUnop(node, UseInfo::TruncatingWord32(), |
+ MachineRepresentation::kWord32); |
if (lower()) DeferReplacement(node, node->InputAt(0)); |
break; |
} |
case IrOpcode::kNumberIsHoleNaN: { |
- VisitUnop(node, UseInfo::Float64(), NodeOutputInfo::Bool()); |
+ VisitUnop(node, UseInfo::Float64(), MachineRepresentation::kBit); |
if (lower()) { |
// NumberIsHoleNaN(x) => Word32Equal(Float64ExtractLowWord32(x), |
// #HoleNaNLower32) |
@@ -1119,7 +1001,7 @@ class RepresentationSelector { |
break; |
} |
case IrOpcode::kPlainPrimitiveToNumber: { |
- VisitUnop(node, UseInfo::AnyTagged(), NodeOutputInfo::NumberTagged()); |
+ VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); |
if (lower()) { |
// PlainPrimitiveToNumber(x) => Call(ToNumberStub, x, no-context) |
Operator::Properties properties = node->op()->properties(); |
@@ -1136,14 +1018,14 @@ class RepresentationSelector { |
break; |
} |
case IrOpcode::kReferenceEqual: { |
- VisitBinop(node, UseInfo::AnyTagged(), NodeOutputInfo::Bool()); |
+ VisitBinop(node, UseInfo::AnyTagged(), MachineRepresentation::kBit); |
if (lower()) { |
NodeProperties::ChangeOp(node, lowering->machine()->WordEqual()); |
} |
break; |
} |
case IrOpcode::kStringEqual: { |
- VisitBinop(node, UseInfo::AnyTagged(), NodeOutputInfo::BoolTagged()); |
+ VisitBinop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); |
if (lower()) { |
// StringEqual(x, y) => Call(StringEqualStub, x, y, no-context) |
Operator::Properties properties = node->op()->properties(); |
@@ -1160,7 +1042,7 @@ class RepresentationSelector { |
break; |
} |
case IrOpcode::kStringLessThan: { |
- VisitBinop(node, UseInfo::AnyTagged(), NodeOutputInfo::BoolTagged()); |
+ VisitBinop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); |
if (lower()) { |
// StringLessThan(x, y) => Call(StringLessThanStub, x, y, no-context) |
Operator::Properties properties = node->op()->properties(); |
@@ -1177,7 +1059,7 @@ class RepresentationSelector { |
break; |
} |
case IrOpcode::kStringLessThanOrEqual: { |
- VisitBinop(node, UseInfo::AnyTagged(), NodeOutputInfo::BoolTagged()); |
+ VisitBinop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); |
if (lower()) { |
// StringLessThanOrEqual(x, y) |
// => Call(StringLessThanOrEqualStub, x, y, no-context) |
@@ -1198,14 +1080,14 @@ class RepresentationSelector { |
case IrOpcode::kAllocate: { |
ProcessInput(node, 0, UseInfo::AnyTagged()); |
ProcessRemainingInputs(node, 1); |
- SetOutput(node, NodeOutputInfo::AnyTagged()); |
+ SetOutput(node, MachineRepresentation::kTagged); |
break; |
} |
case IrOpcode::kLoadField: { |
FieldAccess access = FieldAccessOf(node->op()); |
ProcessInput(node, 0, UseInfoForBasePointer(access)); |
ProcessRemainingInputs(node, 1); |
- SetOutputFromMachineType(node, access.machine_type); |
+ SetOutput(node, access.machine_type.representation()); |
break; |
} |
case IrOpcode::kStoreField: { |
@@ -1214,7 +1096,7 @@ class RepresentationSelector { |
ProcessInput(node, 1, TruncatingUseInfoFromRepresentation( |
access.machine_type.representation())); |
ProcessRemainingInputs(node, 2); |
- SetOutput(node, NodeOutputInfo::None()); |
+ SetOutput(node, MachineRepresentation::kNone); |
break; |
} |
case IrOpcode::kLoadBuffer: { |
@@ -1224,29 +1106,26 @@ class RepresentationSelector { |
ProcessInput(node, 2, UseInfo::TruncatingWord32()); // length |
ProcessRemainingInputs(node, 3); |
- NodeOutputInfo output_info; |
+ MachineRepresentation output; |
if (truncation.TruncatesUndefinedToZeroOrNaN()) { |
if (truncation.TruncatesNaNToZero()) { |
// If undefined is truncated to a non-NaN number, we can use |
// the load's representation. |
- output_info = NodeOutputInfo(access.machine_type().representation(), |
- NodeProperties::GetType(node)); |
+ output = access.machine_type().representation(); |
} else { |
// If undefined is truncated to a number, but the use can |
// observe NaN, we need to output at least the float32 |
// representation. |
if (access.machine_type().representation() == |
MachineRepresentation::kFloat32) { |
- output_info = |
- NodeOutputInfo(access.machine_type().representation(), |
- NodeProperties::GetType(node)); |
+ output = access.machine_type().representation(); |
} else { |
if (access.machine_type().representation() != |
MachineRepresentation::kFloat64) { |
// TODO(bmeurer): See comment on abort_compilation_. |
if (lower()) lowering->abort_compilation_ = true; |
} |
- output_info = NodeOutputInfo::Float64(); |
+ output = MachineRepresentation::kFloat64; |
} |
} |
} else { |
@@ -1255,11 +1134,10 @@ class RepresentationSelector { |
// If undefined is not truncated away, we need to have the tagged |
// representation. |
- output_info = NodeOutputInfo::AnyTagged(); |
+ output = MachineRepresentation::kTagged; |
} |
- SetOutput(node, output_info); |
- if (lower()) |
- lowering->DoLoadBuffer(node, output_info.representation(), changer_); |
+ SetOutput(node, output); |
+ if (lower()) lowering->DoLoadBuffer(node, output, changer_); |
break; |
} |
case IrOpcode::kStoreBuffer: { |
@@ -1271,7 +1149,7 @@ class RepresentationSelector { |
TruncatingUseInfoFromRepresentation( |
access.machine_type().representation())); // value |
ProcessRemainingInputs(node, 4); |
- SetOutput(node, NodeOutputInfo::None()); |
+ SetOutput(node, MachineRepresentation::kNone); |
if (lower()) lowering->DoStoreBuffer(node); |
break; |
} |
@@ -1280,7 +1158,7 @@ class RepresentationSelector { |
ProcessInput(node, 0, UseInfoForBasePointer(access)); // base |
ProcessInput(node, 1, UseInfo::TruncatingWord32()); // index |
ProcessRemainingInputs(node, 2); |
- SetOutputFromMachineType(node, access.machine_type); |
+ SetOutput(node, access.machine_type.representation()); |
break; |
} |
case IrOpcode::kStoreElement: { |
@@ -1291,7 +1169,7 @@ class RepresentationSelector { |
TruncatingUseInfoFromRepresentation( |
access.machine_type.representation())); // value |
ProcessRemainingInputs(node, 3); |
- SetOutput(node, NodeOutputInfo::None()); |
+ SetOutput(node, MachineRepresentation::kNone); |
break; |
} |
case IrOpcode::kObjectIsNumber: |
@@ -1299,7 +1177,7 @@ class RepresentationSelector { |
case IrOpcode::kObjectIsSmi: |
case IrOpcode::kObjectIsUndetectable: { |
ProcessInput(node, 0, UseInfo::AnyTagged()); |
- SetOutput(node, NodeOutputInfo::Bool()); |
+ SetOutput(node, MachineRepresentation::kBit); |
break; |
} |
@@ -1313,7 +1191,7 @@ class RepresentationSelector { |
ProcessInput(node, 0, UseInfo::AnyTagged()); // tagged pointer |
ProcessInput(node, 1, UseInfo::PointerInt()); // index |
ProcessRemainingInputs(node, 2); |
- SetOutputFromMachineType(node, rep); |
+ SetOutput(node, rep.representation()); |
break; |
} |
case IrOpcode::kStore: { |
@@ -1325,13 +1203,13 @@ class RepresentationSelector { |
ProcessInput(node, 2, |
TruncatingUseInfoFromRepresentation(rep.representation())); |
ProcessRemainingInputs(node, 3); |
- SetOutput(node, NodeOutputInfo::None()); |
+ SetOutput(node, MachineRepresentation::kNone); |
break; |
} |
case IrOpcode::kWord32Shr: |
// We output unsigned int32 for shift right because JavaScript. |
return VisitBinop(node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo::Uint32()); |
+ MachineRepresentation::kWord32); |
case IrOpcode::kWord32And: |
case IrOpcode::kWord32Or: |
case IrOpcode::kWord32Xor: |
@@ -1341,14 +1219,14 @@ class RepresentationSelector { |
// though the machine bits are the same for either signed or unsigned, |
// because JavaScript considers the result from these operations signed. |
return VisitBinop(node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo::Int32()); |
+ MachineRepresentation::kWord32); |
case IrOpcode::kWord32Equal: |
return VisitBinop(node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo::Bool()); |
+ MachineRepresentation::kBit); |
case IrOpcode::kWord32Clz: |
return VisitUnop(node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo::Uint32()); |
+ MachineRepresentation::kWord32); |
case IrOpcode::kInt32Add: |
case IrOpcode::kInt32Sub: |
@@ -1393,44 +1271,43 @@ class RepresentationSelector { |
case IrOpcode::kWord64Shr: |
case IrOpcode::kWord64Sar: |
return VisitBinop(node, UseInfo::TruncatingWord64(), |
- NodeOutputInfo::Int64()); |
+ MachineRepresentation::kWord64); |
case IrOpcode::kWord64Equal: |
return VisitBinop(node, UseInfo::TruncatingWord64(), |
- NodeOutputInfo::Bool()); |
+ MachineRepresentation::kBit); |
case IrOpcode::kChangeInt32ToInt64: |
- return VisitUnop( |
- node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo(MachineRepresentation::kWord64, Type::Signed32())); |
+ return VisitUnop(node, UseInfo::TruncatingWord32(), |
+ MachineRepresentation::kWord64); |
case IrOpcode::kChangeUint32ToUint64: |
- return VisitUnop( |
- node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo(MachineRepresentation::kWord64, Type::Unsigned32())); |
+ return VisitUnop(node, UseInfo::TruncatingWord32(), |
+ MachineRepresentation::kWord64); |
case IrOpcode::kTruncateFloat64ToFloat32: |
- return VisitUnop(node, UseInfo::Float64(), NodeOutputInfo::Float32()); |
+ return VisitUnop(node, UseInfo::Float64(), |
+ MachineRepresentation::kFloat32); |
case IrOpcode::kTruncateFloat64ToInt32: |
- return VisitUnop(node, UseInfo::Float64(), NodeOutputInfo::Int32()); |
+ return VisitUnop(node, UseInfo::Float64(), |
+ MachineRepresentation::kWord32); |
case IrOpcode::kTruncateInt64ToInt32: |
// TODO(titzer): Is kTypeInt32 correct here? |
return VisitUnop(node, UseInfo::Word64TruncatingToWord32(), |
- NodeOutputInfo::Int32()); |
+ MachineRepresentation::kWord32); |
case IrOpcode::kChangeFloat32ToFloat64: |
- return VisitUnop(node, UseInfo::Float32(), NodeOutputInfo::Float64()); |
+ return VisitUnop(node, UseInfo::Float32(), |
+ MachineRepresentation::kFloat64); |
case IrOpcode::kChangeInt32ToFloat64: |
- return VisitUnop( |
- node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo(MachineRepresentation::kFloat64, Type::Signed32())); |
+ return VisitUnop(node, UseInfo::TruncatingWord32(), |
+ MachineRepresentation::kFloat64); |
case IrOpcode::kChangeUint32ToFloat64: |
return VisitUnop(node, UseInfo::TruncatingWord32(), |
- NodeOutputInfo(MachineRepresentation::kFloat64, |
- Type::Unsigned32())); |
+ MachineRepresentation::kFloat64); |
case IrOpcode::kChangeFloat64ToInt32: |
return VisitUnop(node, UseInfo::Float64TruncatingToWord32(), |
- NodeOutputInfo::Int32()); |
+ MachineRepresentation::kWord32); |
case IrOpcode::kChangeFloat64ToUint32: |
return VisitUnop(node, UseInfo::Float64TruncatingToWord32(), |
- NodeOutputInfo::Uint32()); |
+ MachineRepresentation::kWord32); |
case IrOpcode::kFloat64Add: |
case IrOpcode::kFloat64Sub: |
@@ -1445,29 +1322,31 @@ class RepresentationSelector { |
case IrOpcode::kFloat64RoundTruncate: |
case IrOpcode::kFloat64RoundTiesAway: |
case IrOpcode::kFloat64RoundUp: |
- return VisitUnop(node, UseInfo::Float64(), NodeOutputInfo::Float64()); |
+ return VisitUnop(node, UseInfo::Float64(), |
+ MachineRepresentation::kFloat64); |
case IrOpcode::kFloat64Equal: |
case IrOpcode::kFloat64LessThan: |
case IrOpcode::kFloat64LessThanOrEqual: |
return VisitFloat64Cmp(node); |
case IrOpcode::kFloat64ExtractLowWord32: |
case IrOpcode::kFloat64ExtractHighWord32: |
- return VisitUnop(node, UseInfo::Float64(), NodeOutputInfo::Int32()); |
+ return VisitUnop(node, UseInfo::Float64(), |
+ MachineRepresentation::kWord32); |
case IrOpcode::kFloat64InsertLowWord32: |
case IrOpcode::kFloat64InsertHighWord32: |
return VisitBinop(node, UseInfo::Float64(), UseInfo::TruncatingWord32(), |
- NodeOutputInfo::Float64()); |
+ MachineRepresentation::kFloat64); |
case IrOpcode::kLoadStackPointer: |
case IrOpcode::kLoadFramePointer: |
case IrOpcode::kLoadParentFramePointer: |
- return VisitLeaf(node, NodeOutputInfo::Pointer()); |
+ return VisitLeaf(node, MachineType::PointerRepresentation()); |
case IrOpcode::kStateValues: |
VisitStateValues(node); |
break; |
default: |
VisitInputs(node); |
// Assume the output is tagged. |
- SetOutput(node, NodeOutputInfo::AnyTagged()); |
+ SetOutput(node, MachineRepresentation::kTagged); |
break; |
} |
} |
@@ -1478,7 +1357,7 @@ class RepresentationSelector { |
replacement->op()->mnemonic()); |
if (replacement->id() < count_ && |
- GetInfo(node)->output_type()->Is(GetInfo(replacement)->output_type())) { |
+ GetUpperBound(node)->Is(GetUpperBound(replacement))) { |
// Replace with a previously existing node eagerly only if the type is the |
// same. |
node->ReplaceUses(replacement); |
@@ -1496,9 +1375,7 @@ class RepresentationSelector { |
void PrintOutputInfo(NodeInfo* info) { |
if (FLAG_trace_representation) { |
OFStream os(stdout); |
- os << info->representation() << " ("; |
- info->output_type()->PrintTo(os, Type::SEMANTIC_DIM); |
- os << ")"; |
+ os << info->representation(); |
} |
} |