| Index: src/compiler/simplified-lowering.cc
|
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
|
| index e32a51e136b2e5453a44a344766ff0d933c410b4..704b3ad4e6c0d08ee86197153009cad69888e8ba 100644
|
| --- a/src/compiler/simplified-lowering.cc
|
| +++ b/src/compiler/simplified-lowering.cc
|
| @@ -54,10 +54,10 @@ class RepresentationSelector {
|
| public:
|
| // Information for each node tracked during the fixpoint.
|
| struct NodeInfo {
|
| - RepTypeUnion use : 14; // Union of all usages for the node.
|
| + MachineTypeUnion use : 14; // Union of all usages for the node.
|
| bool queued : 1; // Bookkeeping for the traversal.
|
| bool visited : 1; // Bookkeeping for the traversal.
|
| - RepTypeUnion output : 14; // Output type of the node.
|
| + MachineTypeUnion output : 14; // Output type of the node.
|
| };
|
|
|
| RepresentationSelector(JSGraph* jsgraph, Zone* zone,
|
| @@ -115,7 +115,7 @@ class RepresentationSelector {
|
|
|
| // Enqueue {node} if the {use} contains new information for that node.
|
| // Add {node} to {nodes_} if this is the first time it's been visited.
|
| - void Enqueue(Node* node, RepTypeUnion use = 0) {
|
| + void Enqueue(Node* node, MachineTypeUnion use = 0) {
|
| if (phase_ != PROPAGATE) return;
|
| NodeInfo* info = GetInfo(node);
|
| if (!info->visited) {
|
| @@ -147,11 +147,11 @@ class RepresentationSelector {
|
|
|
| bool lower() { return phase_ == LOWER; }
|
|
|
| - void Enqueue(Node* node, RepType use) {
|
| - Enqueue(node, static_cast<RepTypeUnion>(use));
|
| + void Enqueue(Node* node, MachineType use) {
|
| + Enqueue(node, static_cast<MachineTypeUnion>(use));
|
| }
|
|
|
| - void SetOutput(Node* node, RepTypeUnion output) {
|
| + void SetOutput(Node* node, MachineTypeUnion output) {
|
| // 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.
|
| @@ -165,7 +165,7 @@ class RepresentationSelector {
|
| NodeProperties::GetBounds(node->InputAt(1)).upper->Is(type);
|
| }
|
|
|
| - void ProcessInput(Node* node, int index, RepTypeUnion use) {
|
| + void ProcessInput(Node* node, int index, MachineTypeUnion use) {
|
| Node* input = node->InputAt(index);
|
| if (phase_ == PROPAGATE) {
|
| // In the propagate phase, propagate the usage information backward.
|
| @@ -173,7 +173,7 @@ class RepresentationSelector {
|
| } else {
|
| // In the change phase, insert a change before the use if necessary.
|
| if ((use & rMask) == 0) return; // No input requirement on the use.
|
| - RepTypeUnion output = GetInfo(input)->output;
|
| + MachineTypeUnion output = GetInfo(input)->output;
|
| if ((output & rMask & use) == 0) {
|
| // Output representation doesn't match usage.
|
| TRACE((" change: #%d:%s(@%d #%d:%s) ", node->id(),
|
| @@ -190,13 +190,6 @@ class RepresentationSelector {
|
| }
|
| }
|
|
|
| - static const RepTypeUnion kFloat64 = rFloat64 | tNumber;
|
| - static const RepTypeUnion kInt32 = rWord32 | tInt32;
|
| - static const RepTypeUnion kUint32 = rWord32 | tUint32;
|
| - static const RepTypeUnion kInt64 = rWord64 | tInt64;
|
| - static const RepTypeUnion kUint64 = rWord64 | tUint64;
|
| - static const RepTypeUnion kAnyTagged = rTagged | tAny;
|
| -
|
| // The default, most general visitation case. For {node}, process all value,
|
| // context, effect, and control inputs, assuming that value inputs should have
|
| // {rTagged} representation and can observe all output values {tAny}.
|
| @@ -204,11 +197,11 @@ class RepresentationSelector {
|
| InputIter i = node->inputs().begin();
|
| for (int j = OperatorProperties::GetValueInputCount(node->op()); j > 0;
|
| ++i, j--) {
|
| - ProcessInput(node, i.index(), kAnyTagged); // Value inputs
|
| + ProcessInput(node, i.index(), mAnyTagged); // Value inputs
|
| }
|
| for (int j = OperatorProperties::GetContextInputCount(node->op()); j > 0;
|
| ++i, j--) {
|
| - ProcessInput(node, i.index(), kAnyTagged); // Context inputs
|
| + ProcessInput(node, i.index(), mAnyTagged); // Context inputs
|
| }
|
| for (int j = OperatorProperties::GetEffectInputCount(node->op()); j > 0;
|
| ++i, j--) {
|
| @@ -218,11 +211,12 @@ class RepresentationSelector {
|
| ++i, j--) {
|
| Enqueue(*i); // Control inputs: just visit
|
| }
|
| - SetOutput(node, kAnyTagged);
|
| + SetOutput(node, mAnyTagged);
|
| }
|
|
|
| // Helper for binops of the I x I -> O variety.
|
| - void VisitBinop(Node* node, RepTypeUnion input_use, RepTypeUnion output) {
|
| + void VisitBinop(Node* node, MachineTypeUnion input_use,
|
| + MachineTypeUnion output) {
|
| DCHECK_EQ(2, node->InputCount());
|
| ProcessInput(node, 0, input_use);
|
| ProcessInput(node, 1, input_use);
|
| @@ -230,32 +224,33 @@ class RepresentationSelector {
|
| }
|
|
|
| // Helper for unops of the I -> O variety.
|
| - void VisitUnop(Node* node, RepTypeUnion input_use, RepTypeUnion output) {
|
| + void VisitUnop(Node* node, MachineTypeUnion input_use,
|
| + MachineTypeUnion output) {
|
| DCHECK_EQ(1, node->InputCount());
|
| ProcessInput(node, 0, input_use);
|
| SetOutput(node, output);
|
| }
|
|
|
| // Helper for leaf nodes.
|
| - void VisitLeaf(Node* node, RepTypeUnion output) {
|
| + void VisitLeaf(Node* node, MachineTypeUnion output) {
|
| DCHECK_EQ(0, node->InputCount());
|
| SetOutput(node, output);
|
| }
|
|
|
| // Helpers for specific types of binops.
|
| - void VisitFloat64Binop(Node* node) { VisitBinop(node, kFloat64, kFloat64); }
|
| - void VisitInt32Binop(Node* node) { VisitBinop(node, kInt32, kInt32); }
|
| - void VisitUint32Binop(Node* node) { VisitBinop(node, kUint32, kUint32); }
|
| - void VisitInt64Binop(Node* node) { VisitBinop(node, kInt64, kInt64); }
|
| - void VisitUint64Binop(Node* node) { VisitBinop(node, kUint64, kUint64); }
|
| - void VisitFloat64Cmp(Node* node) { VisitBinop(node, kFloat64, rBit); }
|
| - void VisitInt32Cmp(Node* node) { VisitBinop(node, kInt32, rBit); }
|
| - void VisitUint32Cmp(Node* node) { VisitBinop(node, kUint32, rBit); }
|
| - void VisitInt64Cmp(Node* node) { VisitBinop(node, kInt64, rBit); }
|
| - void VisitUint64Cmp(Node* node) { VisitBinop(node, kUint64, rBit); }
|
| + void VisitFloat64Binop(Node* node) { VisitBinop(node, mFloat64, mFloat64); }
|
| + void VisitInt32Binop(Node* node) { VisitBinop(node, mInt32, mInt32); }
|
| + void VisitUint32Binop(Node* node) { VisitBinop(node, mUint32, mUint32); }
|
| + void VisitInt64Binop(Node* node) { VisitBinop(node, mInt64, mInt64); }
|
| + void VisitUint64Binop(Node* node) { VisitBinop(node, mUint64, mUint64); }
|
| + void VisitFloat64Cmp(Node* node) { VisitBinop(node, mFloat64, rBit); }
|
| + void VisitInt32Cmp(Node* node) { VisitBinop(node, mInt32, rBit); }
|
| + void VisitUint32Cmp(Node* node) { VisitBinop(node, mUint32, rBit); }
|
| + void VisitInt64Cmp(Node* node) { VisitBinop(node, mInt64, rBit); }
|
| + void VisitUint64Cmp(Node* node) { VisitBinop(node, mUint64, rBit); }
|
|
|
| // Helper for handling phis.
|
| - void VisitPhi(Node* node, RepTypeUnion use) {
|
| + void VisitPhi(Node* node, MachineTypeUnion use) {
|
| // First, propagate the usage information to inputs of the phi.
|
| int values = OperatorProperties::GetValueInputCount(node->op());
|
| Node::Inputs inputs = node->inputs();
|
| @@ -267,9 +262,9 @@ class RepresentationSelector {
|
| }
|
| // Phis adapt to whatever output representation their uses demand,
|
| // pushing representation changes to their inputs.
|
| - RepTypeUnion use_rep = GetUseInfo(node) & rMask;
|
| - RepTypeUnion use_type = GetUseInfo(node) & tMask;
|
| - RepTypeUnion rep = 0;
|
| + MachineTypeUnion use_rep = GetUseInfo(node) & rMask;
|
| + MachineTypeUnion use_type = GetUseInfo(node) & tMask;
|
| + MachineTypeUnion rep = 0;
|
| if (use_rep & rTagged) {
|
| rep = rTagged; // Tagged overrides everything.
|
| } else if (use_rep & rFloat64) {
|
| @@ -316,7 +311,8 @@ class RepresentationSelector {
|
|
|
| // Dispatching routine for visiting the node {node} with the usage {use}.
|
| // Depending on the operator, propagate new usage info to the inputs.
|
| - void VisitNode(Node* node, RepTypeUnion use, SimplifiedLowering* lowering) {
|
| + void VisitNode(Node* node, MachineTypeUnion use,
|
| + SimplifiedLowering* lowering) {
|
| switch (node->opcode()) {
|
| //------------------------------------------------------------------
|
| // Common operators.
|
| @@ -338,7 +334,7 @@ class RepresentationSelector {
|
| case IrOpcode::kFloat64Constant:
|
| return VisitLeaf(node, rFloat64);
|
| case IrOpcode::kExternalConstant:
|
| - return VisitLeaf(node, rPtr);
|
| + return VisitLeaf(node, mPtr);
|
| case IrOpcode::kNumberConstant:
|
| return VisitLeaf(node, rTagged);
|
| case IrOpcode::kHeapConstant:
|
| @@ -379,7 +375,7 @@ class RepresentationSelector {
|
| //------------------------------------------------------------------
|
| case IrOpcode::kBooleanNot: {
|
| if (lower()) {
|
| - RepTypeUnion input = GetInfo(node->InputAt(0))->output;
|
| + MachineTypeUnion input = GetInfo(node->InputAt(0))->output;
|
| if (input & rBit) {
|
| // BooleanNot(x: rBit) => WordEqual(x, #0)
|
| node->set_op(lowering->machine()->WordEqual());
|
| @@ -445,9 +441,9 @@ class RepresentationSelector {
|
| break;
|
| }
|
| case IrOpcode::kNumberToInt32: {
|
| - RepTypeUnion use_rep = use & rMask;
|
| + MachineTypeUnion use_rep = use & rMask;
|
| if (lower()) {
|
| - RepTypeUnion in = GetInfo(node->InputAt(0))->output;
|
| + MachineTypeUnion in = GetInfo(node->InputAt(0))->output;
|
| if ((in & tMask) == tInt32 || (in & rMask) == rWord32) {
|
| // If the input has type int32, or is already a word32, just change
|
| // representation if necessary.
|
| @@ -467,9 +463,9 @@ class RepresentationSelector {
|
| break;
|
| }
|
| case IrOpcode::kNumberToUint32: {
|
| - RepTypeUnion use_rep = use & rMask;
|
| + MachineTypeUnion use_rep = use & rMask;
|
| if (lower()) {
|
| - RepTypeUnion in = GetInfo(node->InputAt(0))->output;
|
| + MachineTypeUnion in = GetInfo(node->InputAt(0))->output;
|
| if ((in & tMask) == tUint32 || (in & rMask) == rWord32) {
|
| // The input has type int32, just change representation.
|
| VisitUnop(node, tUint32 | use_rep, tUint32 | use_rep);
|
| @@ -488,41 +484,41 @@ class RepresentationSelector {
|
| break;
|
| }
|
| case IrOpcode::kReferenceEqual: {
|
| - VisitBinop(node, kAnyTagged, rBit);
|
| + VisitBinop(node, mAnyTagged, rBit);
|
| if (lower()) node->set_op(lowering->machine()->WordEqual());
|
| break;
|
| }
|
| case IrOpcode::kStringEqual: {
|
| - VisitBinop(node, kAnyTagged, rBit);
|
| + VisitBinop(node, mAnyTagged, rBit);
|
| // TODO(titzer): lower StringEqual to stub/runtime call.
|
| break;
|
| }
|
| case IrOpcode::kStringLessThan: {
|
| - VisitBinop(node, kAnyTagged, rBit);
|
| + VisitBinop(node, mAnyTagged, rBit);
|
| // TODO(titzer): lower StringLessThan to stub/runtime call.
|
| break;
|
| }
|
| case IrOpcode::kStringLessThanOrEqual: {
|
| - VisitBinop(node, kAnyTagged, rBit);
|
| + VisitBinop(node, mAnyTagged, rBit);
|
| // TODO(titzer): lower StringLessThanOrEqual to stub/runtime call.
|
| break;
|
| }
|
| case IrOpcode::kStringAdd: {
|
| - VisitBinop(node, kAnyTagged, kAnyTagged);
|
| + VisitBinop(node, mAnyTagged, mAnyTagged);
|
| // TODO(titzer): lower StringAdd to stub/runtime call.
|
| break;
|
| }
|
| case IrOpcode::kLoadField: {
|
| FieldAccess access = FieldAccessOf(node->op());
|
| ProcessInput(node, 0, changer_->TypeForBasePointer(access));
|
| - SetOutput(node, changer_->TypeForField(access));
|
| + SetOutput(node, access.machine_type);
|
| if (lower()) lowering->DoLoadField(node);
|
| break;
|
| }
|
| case IrOpcode::kStoreField: {
|
| FieldAccess access = FieldAccessOf(node->op());
|
| ProcessInput(node, 0, changer_->TypeForBasePointer(access));
|
| - ProcessInput(node, 1, changer_->TypeForField(access));
|
| + ProcessInput(node, 1, access.machine_type);
|
| SetOutput(node, 0);
|
| if (lower()) lowering->DoStoreField(node);
|
| break;
|
| @@ -530,16 +526,16 @@ class RepresentationSelector {
|
| case IrOpcode::kLoadElement: {
|
| ElementAccess access = ElementAccessOf(node->op());
|
| ProcessInput(node, 0, changer_->TypeForBasePointer(access));
|
| - ProcessInput(node, 1, kInt32); // element index
|
| - SetOutput(node, changer_->TypeForElement(access));
|
| + ProcessInput(node, 1, mInt32); // element index
|
| + SetOutput(node, access.machine_type);
|
| if (lower()) lowering->DoLoadElement(node);
|
| break;
|
| }
|
| case IrOpcode::kStoreElement: {
|
| ElementAccess access = ElementAccessOf(node->op());
|
| ProcessInput(node, 0, changer_->TypeForBasePointer(access));
|
| - ProcessInput(node, 1, kInt32); // element index
|
| - ProcessInput(node, 2, changer_->TypeForElement(access));
|
| + ProcessInput(node, 1, mInt32); // element index
|
| + ProcessInput(node, 2, access.machine_type);
|
| SetOutput(node, 0);
|
| if (lower()) lowering->DoStoreElement(node);
|
| break;
|
| @@ -550,20 +546,20 @@ class RepresentationSelector {
|
| //------------------------------------------------------------------
|
| case IrOpcode::kLoad: {
|
| // TODO(titzer): machine loads/stores need to know BaseTaggedness!?
|
| - RepType tBase = rTagged;
|
| - MachineType rep = OpParameter<MachineType>(node);
|
| + MachineType tBase = rTagged;
|
| + MachineType machine_type = OpParameter<MachineType>(node);
|
| ProcessInput(node, 0, tBase); // pointer or object
|
| - ProcessInput(node, 1, kInt32); // index
|
| - SetOutput(node, changer_->TypeForMachineType(rep));
|
| + ProcessInput(node, 1, mInt32); // index
|
| + SetOutput(node, machine_type);
|
| break;
|
| }
|
| case IrOpcode::kStore: {
|
| // TODO(titzer): machine loads/stores need to know BaseTaggedness!?
|
| - RepType tBase = rTagged;
|
| + MachineType tBase = rTagged;
|
| StoreRepresentation rep = OpParameter<StoreRepresentation>(node);
|
| ProcessInput(node, 0, tBase); // pointer or object
|
| - ProcessInput(node, 1, kInt32); // index
|
| - ProcessInput(node, 2, changer_->TypeForMachineType(rep.rep));
|
| + ProcessInput(node, 1, mInt32); // index
|
| + ProcessInput(node, 2, rep.machine_type);
|
| SetOutput(node, 0);
|
| break;
|
| }
|
| @@ -674,11 +670,10 @@ class RepresentationSelector {
|
| TRACE(("\n"));
|
| }
|
|
|
| - void PrintInfo(RepTypeUnion info) {
|
| + void PrintInfo(MachineTypeUnion info) {
|
| if (FLAG_trace_representation) {
|
| - char buf[REP_TYPE_STRLEN];
|
| - RenderRepTypeUnion(buf, info);
|
| - TRACE(("%s", buf));
|
| + OFStream os(stdout);
|
| + PrintMachineTypeUnionTo(os, info);
|
| }
|
| }
|
|
|
| @@ -700,7 +695,7 @@ class RepresentationSelector {
|
| return &info_[node->id()];
|
| }
|
|
|
| - RepTypeUnion GetUseInfo(Node* node) { return GetInfo(node)->use; }
|
| + MachineTypeUnion GetUseInfo(Node* node) { return GetInfo(node)->use; }
|
| };
|
|
|
|
|
| @@ -759,7 +754,7 @@ static void UpdateControlSuccessors(Node* before, Node* node) {
|
| void SimplifiedLowering::DoChangeTaggedToUI32(Node* node, Node* effect,
|
| Node* control, bool is_signed) {
|
| // if (IsTagged(val))
|
| - // ConvertFloat64To(Int32|Uint32)(Load[kMachineFloat64](input, #value_offset))
|
| + // ConvertFloat64To(Int32|Uint32)(Load[mFloat64](input, #value_offset))
|
| // else Untag(val)
|
| Node* val = node->InputAt(0);
|
| Node* branch = graph()->NewNode(common()->Branch(), IsTagged(val), control);
|
| @@ -767,7 +762,7 @@ void SimplifiedLowering::DoChangeTaggedToUI32(Node* node, Node* effect,
|
| // true branch.
|
| Node* tbranch = graph()->NewNode(common()->IfTrue(), branch);
|
| Node* loaded = graph()->NewNode(
|
| - machine()->Load(kMachineFloat64), val,
|
| + machine()->Load(mFloat64), val,
|
| OffsetMinusTagConstant(HeapNumber::kValueOffset), effect);
|
| Operator* op = is_signed ? machine()->ChangeFloat64ToInt32()
|
| : machine()->ChangeFloat64ToUint32();
|
| @@ -788,7 +783,7 @@ void SimplifiedLowering::DoChangeTaggedToUI32(Node* node, Node* effect,
|
|
|
| void SimplifiedLowering::DoChangeTaggedToFloat64(Node* node, Node* effect,
|
| Node* control) {
|
| - // if (IsTagged(input)) Load[kMachineFloat64](input, #value_offset)
|
| + // if (IsTagged(input)) Load[mFloat64](input, #value_offset)
|
| // else ConvertFloat64(Untag(input))
|
| Node* val = node->InputAt(0);
|
| Node* branch = graph()->NewNode(common()->Branch(), IsTagged(val), control);
|
| @@ -796,7 +791,7 @@ void SimplifiedLowering::DoChangeTaggedToFloat64(Node* node, Node* effect,
|
| // true branch.
|
| Node* tbranch = graph()->NewNode(common()->IfTrue(), branch);
|
| Node* loaded = graph()->NewNode(
|
| - machine()->Load(kMachineFloat64), val,
|
| + machine()->Load(mFloat64), val,
|
| OffsetMinusTagConstant(HeapNumber::kValueOffset), effect);
|
|
|
| // false branch.
|
| @@ -897,7 +892,8 @@ static WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged,
|
| MachineType representation,
|
| Type* type) {
|
| // TODO(turbofan): skip write barriers for Smis, etc.
|
| - if (base_is_tagged == kTaggedBase && representation == kMachineTagged) {
|
| + if (base_is_tagged == kTaggedBase &&
|
| + RepresentationOf(representation) == rTagged) {
|
| // Write barriers are only for writes into heap objects (i.e. tagged base).
|
| return kFullWriteBarrier;
|
| }
|
| @@ -907,7 +903,7 @@ static WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged,
|
|
|
| void SimplifiedLowering::DoLoadField(Node* node) {
|
| const FieldAccess& access = FieldAccessOf(node->op());
|
| - node->set_op(machine_.Load(access.representation));
|
| + node->set_op(machine_.Load(access.machine_type));
|
| Node* offset = jsgraph()->Int32Constant(access.offset - access.tag());
|
| node->InsertInput(zone(), 1, offset);
|
| }
|
| @@ -916,8 +912,8 @@ void SimplifiedLowering::DoLoadField(Node* node) {
|
| void SimplifiedLowering::DoStoreField(Node* node) {
|
| const FieldAccess& access = FieldAccessOf(node->op());
|
| WriteBarrierKind kind = ComputeWriteBarrierKind(
|
| - access.base_is_tagged, access.representation, access.type);
|
| - node->set_op(machine_.Store(access.representation, kind));
|
| + access.base_is_tagged, access.machine_type, access.type);
|
| + node->set_op(machine_.Store(access.machine_type, kind));
|
| Node* offset = jsgraph()->Int32Constant(access.offset - access.tag());
|
| node->InsertInput(zone(), 1, offset);
|
| }
|
| @@ -925,28 +921,7 @@ void SimplifiedLowering::DoStoreField(Node* node) {
|
|
|
| Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access,
|
| Node* index) {
|
| - int element_size = 0;
|
| - switch (access.representation) {
|
| - case kMachineTagged:
|
| - element_size = kPointerSize;
|
| - break;
|
| - case kMachineWord8:
|
| - element_size = 1;
|
| - break;
|
| - case kMachineWord16:
|
| - element_size = 2;
|
| - break;
|
| - case kMachineWord32:
|
| - element_size = 4;
|
| - break;
|
| - case kMachineWord64:
|
| - case kMachineFloat64:
|
| - element_size = 8;
|
| - break;
|
| - case kMachineLast:
|
| - UNREACHABLE();
|
| - break;
|
| - }
|
| + int element_size = ElementSizeOf(access.machine_type);
|
| if (element_size != 1) {
|
| index = graph()->NewNode(machine()->Int32Mul(),
|
| jsgraph()->Int32Constant(element_size), index);
|
| @@ -960,7 +935,7 @@ Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access,
|
|
|
| void SimplifiedLowering::DoLoadElement(Node* node) {
|
| const ElementAccess& access = ElementAccessOf(node->op());
|
| - node->set_op(machine_.Load(access.representation));
|
| + node->set_op(machine_.Load(access.machine_type));
|
| node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1)));
|
| }
|
|
|
| @@ -968,8 +943,8 @@ void SimplifiedLowering::DoLoadElement(Node* node) {
|
| void SimplifiedLowering::DoStoreElement(Node* node) {
|
| const ElementAccess& access = ElementAccessOf(node->op());
|
| WriteBarrierKind kind = ComputeWriteBarrierKind(
|
| - access.base_is_tagged, access.representation, access.type);
|
| - node->set_op(machine_.Store(access.representation, kind));
|
| + access.base_is_tagged, access.machine_type, access.type);
|
| + node->set_op(machine_.Store(access.machine_type, kind));
|
| node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1)));
|
| }
|
|
|
|
|