| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/simplified-lowering.h" | 5 #include "src/compiler/simplified-lowering.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| 11 #include "src/compiler/common-operator.h" | 11 #include "src/compiler/common-operator.h" |
| 12 #include "src/compiler/diamond.h" | 12 #include "src/compiler/diamond.h" |
| 13 #include "src/compiler/linkage.h" | 13 #include "src/compiler/linkage.h" |
| 14 #include "src/compiler/node-matchers.h" | 14 #include "src/compiler/node-matchers.h" |
| 15 #include "src/compiler/node-properties.h" | 15 #include "src/compiler/node-properties.h" |
| 16 #include "src/compiler/operator-properties.h" | 16 #include "src/compiler/operator-properties.h" |
| 17 #include "src/compiler/representation-change.h" | 17 #include "src/compiler/representation-change.h" |
| 18 #include "src/compiler/simplified-lowering.h" | 18 #include "src/compiler/simplified-lowering.h" |
| 19 #include "src/compiler/simplified-operator.h" | 19 #include "src/compiler/simplified-operator.h" |
| 20 #include "src/compiler/source-position.h" |
| 20 #include "src/objects.h" | 21 #include "src/objects.h" |
| 21 | 22 |
| 22 namespace v8 { | 23 namespace v8 { |
| 23 namespace internal { | 24 namespace internal { |
| 24 namespace compiler { | 25 namespace compiler { |
| 25 | 26 |
| 26 // Macro for outputting trace information from representation inference. | 27 // Macro for outputting trace information from representation inference. |
| 27 #define TRACE(x) \ | 28 #define TRACE(x) \ |
| 28 if (FLAG_trace_representation) PrintF x | 29 if (FLAG_trace_representation) PrintF x |
| 29 | 30 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 58 public: | 59 public: |
| 59 // Information for each node tracked during the fixpoint. | 60 // Information for each node tracked during the fixpoint. |
| 60 struct NodeInfo { | 61 struct NodeInfo { |
| 61 MachineTypeUnion use : 15; // Union of all usages for the node. | 62 MachineTypeUnion use : 15; // Union of all usages for the node. |
| 62 bool queued : 1; // Bookkeeping for the traversal. | 63 bool queued : 1; // Bookkeeping for the traversal. |
| 63 bool visited : 1; // Bookkeeping for the traversal. | 64 bool visited : 1; // Bookkeeping for the traversal. |
| 64 MachineTypeUnion output : 15; // Output type of the node. | 65 MachineTypeUnion output : 15; // Output type of the node. |
| 65 }; | 66 }; |
| 66 | 67 |
| 67 RepresentationSelector(JSGraph* jsgraph, Zone* zone, | 68 RepresentationSelector(JSGraph* jsgraph, Zone* zone, |
| 68 RepresentationChanger* changer) | 69 RepresentationChanger* changer, |
| 70 SourcePositionTable* source_positions) |
| 69 : jsgraph_(jsgraph), | 71 : jsgraph_(jsgraph), |
| 70 count_(jsgraph->graph()->NodeCount()), | 72 count_(jsgraph->graph()->NodeCount()), |
| 71 info_(zone->NewArray<NodeInfo>(count_)), | 73 info_(zone->NewArray<NodeInfo>(count_)), |
| 72 nodes_(zone), | 74 nodes_(zone), |
| 73 replacements_(zone), | 75 replacements_(zone), |
| 74 phase_(PROPAGATE), | 76 phase_(PROPAGATE), |
| 75 changer_(changer), | 77 changer_(changer), |
| 76 queue_(zone) { | 78 queue_(zone), |
| 79 source_positions_(source_positions) { |
| 77 memset(info_, 0, sizeof(NodeInfo) * count_); | 80 memset(info_, 0, sizeof(NodeInfo) * count_); |
| 78 | 81 |
| 79 safe_int_additive_range_ = | 82 safe_int_additive_range_ = |
| 80 Type::Range(-std::pow(2.0, 52.0), std::pow(2.0, 52.0), zone); | 83 Type::Range(-std::pow(2.0, 52.0), std::pow(2.0, 52.0), zone); |
| 81 } | 84 } |
| 82 | 85 |
| 83 void Run(SimplifiedLowering* lowering) { | 86 void Run(SimplifiedLowering* lowering) { |
| 84 // Run propagation phase to a fixpoint. | 87 // Run propagation phase to a fixpoint. |
| 85 TRACE(("--{Propagation phase}--\n")); | 88 TRACE(("--{Propagation phase}--\n")); |
| 86 phase_ = PROPAGATE; | 89 phase_ = PROPAGATE; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 99 } | 102 } |
| 100 | 103 |
| 101 // Run lowering and change insertion phase. | 104 // Run lowering and change insertion phase. |
| 102 TRACE(("--{Simplified lowering phase}--\n")); | 105 TRACE(("--{Simplified lowering phase}--\n")); |
| 103 phase_ = LOWER; | 106 phase_ = LOWER; |
| 104 // Process nodes from the collected {nodes_} vector. | 107 // Process nodes from the collected {nodes_} vector. |
| 105 for (NodeVector::iterator i = nodes_.begin(); i != nodes_.end(); ++i) { | 108 for (NodeVector::iterator i = nodes_.begin(); i != nodes_.end(); ++i) { |
| 106 Node* node = *i; | 109 Node* node = *i; |
| 107 TRACE((" visit #%d: %s\n", node->id(), node->op()->mnemonic())); | 110 TRACE((" visit #%d: %s\n", node->id(), node->op()->mnemonic())); |
| 108 // Reuse {VisitNode()} so the representation rules are in one place. | 111 // Reuse {VisitNode()} so the representation rules are in one place. |
| 109 VisitNode(node, GetUseInfo(node), lowering); | 112 if (FLAG_turbo_source_positions) { |
| 113 SourcePositionTable::Scope scope( |
| 114 source_positions_, source_positions_->GetSourcePosition(node)); |
| 115 VisitNode(node, GetUseInfo(node), lowering); |
| 116 } else { |
| 117 VisitNode(node, GetUseInfo(node), lowering); |
| 118 } |
| 110 } | 119 } |
| 111 | 120 |
| 112 // Perform the final replacements. | 121 // Perform the final replacements. |
| 113 for (NodeVector::iterator i = replacements_.begin(); | 122 for (NodeVector::iterator i = replacements_.begin(); |
| 114 i != replacements_.end(); ++i) { | 123 i != replacements_.end(); ++i) { |
| 115 Node* node = *i; | 124 Node* node = *i; |
| 116 Node* replacement = *(++i); | 125 Node* replacement = *(++i); |
| 117 node->ReplaceUses(replacement); | 126 node->ReplaceUses(replacement); |
| 118 } | 127 } |
| 119 } | 128 } |
| (...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 | 1073 |
| 1065 private: | 1074 private: |
| 1066 JSGraph* jsgraph_; | 1075 JSGraph* jsgraph_; |
| 1067 int count_; // number of nodes in the graph | 1076 int count_; // number of nodes in the graph |
| 1068 NodeInfo* info_; // node id -> usage information | 1077 NodeInfo* info_; // node id -> usage information |
| 1069 NodeVector nodes_; // collected nodes | 1078 NodeVector nodes_; // collected nodes |
| 1070 NodeVector replacements_; // replacements to be done after lowering | 1079 NodeVector replacements_; // replacements to be done after lowering |
| 1071 Phase phase_; // current phase of algorithm | 1080 Phase phase_; // current phase of algorithm |
| 1072 RepresentationChanger* changer_; // for inserting representation changes | 1081 RepresentationChanger* changer_; // for inserting representation changes |
| 1073 ZoneQueue<Node*> queue_; // queue for traversing the graph | 1082 ZoneQueue<Node*> queue_; // queue for traversing the graph |
| 1083 // TODO(danno): RepresentationSelector shouldn't know anything about the |
| 1084 // source positions table, but must for now since there currently is no other |
| 1085 // way to pass down source position information to nodes created during |
| 1086 // lowering. Once this phase becomes a vanilla reducer, it should get source |
| 1087 // position information via the SourcePositionWrapper like all other reducers. |
| 1088 SourcePositionTable* source_positions_; |
| 1074 Type* safe_int_additive_range_; | 1089 Type* safe_int_additive_range_; |
| 1075 | 1090 |
| 1076 NodeInfo* GetInfo(Node* node) { | 1091 NodeInfo* GetInfo(Node* node) { |
| 1077 DCHECK(node->id() >= 0); | 1092 DCHECK(node->id() >= 0); |
| 1078 DCHECK(node->id() < count_); | 1093 DCHECK(node->id() < count_); |
| 1079 return &info_[node->id()]; | 1094 return &info_[node->id()]; |
| 1080 } | 1095 } |
| 1081 | 1096 |
| 1082 MachineTypeUnion GetUseInfo(Node* node) { return GetInfo(node)->use; } | 1097 MachineTypeUnion GetUseInfo(Node* node) { return GetInfo(node)->use; } |
| 1083 }; | 1098 }; |
| 1084 | 1099 |
| 1085 | 1100 |
| 1086 Node* SimplifiedLowering::IsTagged(Node* node) { | 1101 Node* SimplifiedLowering::IsTagged(Node* node) { |
| 1087 // TODO(titzer): factor this out to a TaggingScheme abstraction. | 1102 // TODO(titzer): factor this out to a TaggingScheme abstraction. |
| 1088 STATIC_ASSERT(kSmiTagMask == 1); // Only works if tag is the low bit. | 1103 STATIC_ASSERT(kSmiTagMask == 1); // Only works if tag is the low bit. |
| 1089 return graph()->NewNode(machine()->WordAnd(), node, | 1104 return graph()->NewNode(machine()->WordAnd(), node, |
| 1090 jsgraph()->Int32Constant(kSmiTagMask)); | 1105 jsgraph()->Int32Constant(kSmiTagMask)); |
| 1091 } | 1106 } |
| 1092 | 1107 |
| 1093 | 1108 |
| 1094 void SimplifiedLowering::LowerAllNodes() { | 1109 void SimplifiedLowering::LowerAllNodes() { |
| 1095 SimplifiedOperatorBuilder simplified(graph()->zone()); | 1110 SimplifiedOperatorBuilder simplified(graph()->zone()); |
| 1096 RepresentationChanger changer(jsgraph(), &simplified, jsgraph()->isolate()); | 1111 RepresentationChanger changer(jsgraph(), &simplified, jsgraph()->isolate()); |
| 1097 RepresentationSelector selector(jsgraph(), zone_, &changer); | 1112 RepresentationSelector selector(jsgraph(), zone_, &changer, |
| 1113 source_positions_); |
| 1098 selector.Run(this); | 1114 selector.Run(this); |
| 1099 } | 1115 } |
| 1100 | 1116 |
| 1101 | 1117 |
| 1102 Node* SimplifiedLowering::Untag(Node* node) { | 1118 Node* SimplifiedLowering::Untag(Node* node) { |
| 1103 // TODO(titzer): factor this out to a TaggingScheme abstraction. | 1119 // TODO(titzer): factor this out to a TaggingScheme abstraction. |
| 1104 Node* shift_amount = jsgraph()->Int32Constant(kSmiTagSize + kSmiShiftSize); | 1120 Node* shift_amount = jsgraph()->Int32Constant(kSmiTagSize + kSmiShiftSize); |
| 1105 return graph()->NewNode(machine()->WordSar(), node, shift_amount); | 1121 return graph()->NewNode(machine()->WordSar(), node, shift_amount); |
| 1106 } | 1122 } |
| 1107 | 1123 |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1514 | 1530 |
| 1515 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { | 1531 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { |
| 1516 node->set_op(machine()->IntLessThanOrEqual()); | 1532 node->set_op(machine()->IntLessThanOrEqual()); |
| 1517 node->ReplaceInput(0, StringComparison(node, true)); | 1533 node->ReplaceInput(0, StringComparison(node, true)); |
| 1518 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); | 1534 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); |
| 1519 } | 1535 } |
| 1520 | 1536 |
| 1521 } // namespace compiler | 1537 } // namespace compiler |
| 1522 } // namespace internal | 1538 } // namespace internal |
| 1523 } // namespace v8 | 1539 } // namespace v8 |
| OLD | NEW |