| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef V8_COMPILER_NODE_PROPERTIES_INL_H_ | |
| 6 #define V8_COMPILER_NODE_PROPERTIES_INL_H_ | |
| 7 | |
| 8 #include "src/v8.h" | |
| 9 | |
| 10 #include "src/compiler/common-operator.h" | |
| 11 #include "src/compiler/node-properties.h" | |
| 12 #include "src/compiler/opcodes.h" | |
| 13 #include "src/compiler/operator.h" | |
| 14 #include "src/compiler/operator-properties.h" | |
| 15 | |
| 16 namespace v8 { | |
| 17 namespace internal { | |
| 18 namespace compiler { | |
| 19 | |
| 20 // ----------------------------------------------------------------------------- | |
| 21 // Input layout. | |
| 22 // Inputs are always arranged in order as follows: | |
| 23 // 0 [ values, context, effects, control ] node->InputCount() | |
| 24 | |
| 25 inline int NodeProperties::FirstValueIndex(Node* node) { return 0; } | |
| 26 | |
| 27 inline int NodeProperties::FirstContextIndex(Node* node) { | |
| 28 return PastValueIndex(node); | |
| 29 } | |
| 30 | |
| 31 inline int NodeProperties::FirstFrameStateIndex(Node* node) { | |
| 32 return PastContextIndex(node); | |
| 33 } | |
| 34 | |
| 35 inline int NodeProperties::FirstEffectIndex(Node* node) { | |
| 36 return PastFrameStateIndex(node); | |
| 37 } | |
| 38 | |
| 39 inline int NodeProperties::FirstControlIndex(Node* node) { | |
| 40 return PastEffectIndex(node); | |
| 41 } | |
| 42 | |
| 43 | |
| 44 inline int NodeProperties::PastValueIndex(Node* node) { | |
| 45 return FirstValueIndex(node) + node->op()->ValueInputCount(); | |
| 46 } | |
| 47 | |
| 48 inline int NodeProperties::PastContextIndex(Node* node) { | |
| 49 return FirstContextIndex(node) + | |
| 50 OperatorProperties::GetContextInputCount(node->op()); | |
| 51 } | |
| 52 | |
| 53 inline int NodeProperties::PastFrameStateIndex(Node* node) { | |
| 54 return FirstFrameStateIndex(node) + | |
| 55 OperatorProperties::GetFrameStateInputCount(node->op()); | |
| 56 } | |
| 57 | |
| 58 inline int NodeProperties::PastEffectIndex(Node* node) { | |
| 59 return FirstEffectIndex(node) + node->op()->EffectInputCount(); | |
| 60 } | |
| 61 | |
| 62 inline int NodeProperties::PastControlIndex(Node* node) { | |
| 63 return FirstControlIndex(node) + node->op()->ControlInputCount(); | |
| 64 } | |
| 65 | |
| 66 | |
| 67 // ----------------------------------------------------------------------------- | |
| 68 // Input accessors. | |
| 69 | |
| 70 inline Node* NodeProperties::GetValueInput(Node* node, int index) { | |
| 71 DCHECK(0 <= index && index < node->op()->ValueInputCount()); | |
| 72 return node->InputAt(FirstValueIndex(node) + index); | |
| 73 } | |
| 74 | |
| 75 inline Node* NodeProperties::GetContextInput(Node* node) { | |
| 76 DCHECK(OperatorProperties::HasContextInput(node->op())); | |
| 77 return node->InputAt(FirstContextIndex(node)); | |
| 78 } | |
| 79 | |
| 80 inline Node* NodeProperties::GetFrameStateInput(Node* node) { | |
| 81 DCHECK(OperatorProperties::HasFrameStateInput(node->op())); | |
| 82 return node->InputAt(FirstFrameStateIndex(node)); | |
| 83 } | |
| 84 | |
| 85 inline Node* NodeProperties::GetEffectInput(Node* node, int index) { | |
| 86 DCHECK(0 <= index && index < node->op()->EffectInputCount()); | |
| 87 return node->InputAt(FirstEffectIndex(node) + index); | |
| 88 } | |
| 89 | |
| 90 inline Node* NodeProperties::GetControlInput(Node* node, int index) { | |
| 91 DCHECK(0 <= index && index < node->op()->ControlInputCount()); | |
| 92 return node->InputAt(FirstControlIndex(node) + index); | |
| 93 } | |
| 94 | |
| 95 inline int NodeProperties::GetFrameStateIndex(Node* node) { | |
| 96 DCHECK(OperatorProperties::HasFrameStateInput(node->op())); | |
| 97 return FirstFrameStateIndex(node); | |
| 98 } | |
| 99 | |
| 100 // ----------------------------------------------------------------------------- | |
| 101 // Edge kinds. | |
| 102 | |
| 103 inline bool NodeProperties::IsInputRange(Edge edge, int first, int num) { | |
| 104 // TODO(titzer): edge.index() is linear time; | |
| 105 // edges maybe need to be marked as value/effect/control. | |
| 106 if (num == 0) return false; | |
| 107 int index = edge.index(); | |
| 108 return first <= index && index < first + num; | |
| 109 } | |
| 110 | |
| 111 inline bool NodeProperties::IsValueEdge(Edge edge) { | |
| 112 Node* node = edge.from(); | |
| 113 return IsInputRange(edge, FirstValueIndex(node), | |
| 114 node->op()->ValueInputCount()); | |
| 115 } | |
| 116 | |
| 117 inline bool NodeProperties::IsContextEdge(Edge edge) { | |
| 118 Node* node = edge.from(); | |
| 119 return IsInputRange(edge, FirstContextIndex(node), | |
| 120 OperatorProperties::GetContextInputCount(node->op())); | |
| 121 } | |
| 122 | |
| 123 inline bool NodeProperties::IsEffectEdge(Edge edge) { | |
| 124 Node* node = edge.from(); | |
| 125 return IsInputRange(edge, FirstEffectIndex(node), | |
| 126 node->op()->EffectInputCount()); | |
| 127 } | |
| 128 | |
| 129 inline bool NodeProperties::IsControlEdge(Edge edge) { | |
| 130 Node* node = edge.from(); | |
| 131 return IsInputRange(edge, FirstControlIndex(node), | |
| 132 node->op()->ControlInputCount()); | |
| 133 } | |
| 134 | |
| 135 | |
| 136 // ----------------------------------------------------------------------------- | |
| 137 // Miscellaneous predicates. | |
| 138 | |
| 139 inline bool NodeProperties::IsControl(Node* node) { | |
| 140 return IrOpcode::IsControlOpcode(node->opcode()); | |
| 141 } | |
| 142 | |
| 143 | |
| 144 // ----------------------------------------------------------------------------- | |
| 145 // Miscellaneous mutators. | |
| 146 | |
| 147 inline void NodeProperties::ReplaceContextInput(Node* node, Node* context) { | |
| 148 node->ReplaceInput(FirstContextIndex(node), context); | |
| 149 } | |
| 150 | |
| 151 inline void NodeProperties::ReplaceControlInput(Node* node, Node* control) { | |
| 152 node->ReplaceInput(FirstControlIndex(node), control); | |
| 153 } | |
| 154 | |
| 155 inline void NodeProperties::ReplaceEffectInput(Node* node, Node* effect, | |
| 156 int index) { | |
| 157 DCHECK(index < node->op()->EffectInputCount()); | |
| 158 return node->ReplaceInput(FirstEffectIndex(node) + index, effect); | |
| 159 } | |
| 160 | |
| 161 inline void NodeProperties::ReplaceFrameStateInput(Node* node, | |
| 162 Node* frame_state) { | |
| 163 DCHECK(OperatorProperties::HasFrameStateInput(node->op())); | |
| 164 node->ReplaceInput(FirstFrameStateIndex(node), frame_state); | |
| 165 } | |
| 166 | |
| 167 inline void NodeProperties::RemoveNonValueInputs(Node* node) { | |
| 168 node->TrimInputCount(node->op()->ValueInputCount()); | |
| 169 } | |
| 170 | |
| 171 | |
| 172 // Replace value uses of {node} with {value} and effect uses of {node} with | |
| 173 // {effect}. If {effect == NULL}, then use the effect input to {node}. | |
| 174 inline void NodeProperties::ReplaceWithValue(Node* node, Node* value, | |
| 175 Node* effect) { | |
| 176 DCHECK(node->op()->ControlOutputCount() == 0); | |
| 177 if (effect == NULL && node->op()->EffectInputCount() > 0) { | |
| 178 effect = NodeProperties::GetEffectInput(node); | |
| 179 } | |
| 180 | |
| 181 // Requires distinguishing between value and effect edges. | |
| 182 for (Edge edge : node->use_edges()) { | |
| 183 if (NodeProperties::IsEffectEdge(edge)) { | |
| 184 DCHECK_NE(NULL, effect); | |
| 185 edge.UpdateTo(effect); | |
| 186 } else { | |
| 187 edge.UpdateTo(value); | |
| 188 } | |
| 189 } | |
| 190 } | |
| 191 | |
| 192 | |
| 193 // ----------------------------------------------------------------------------- | |
| 194 // Type Bounds. | |
| 195 | |
| 196 inline bool NodeProperties::IsTyped(Node* node) { | |
| 197 Bounds bounds = node->bounds(); | |
| 198 DCHECK((bounds.lower == NULL) == (bounds.upper == NULL)); | |
| 199 return bounds.upper != NULL; | |
| 200 } | |
| 201 | |
| 202 inline Bounds NodeProperties::GetBounds(Node* node) { | |
| 203 DCHECK(IsTyped(node)); | |
| 204 return node->bounds(); | |
| 205 } | |
| 206 | |
| 207 inline void NodeProperties::RemoveBounds(Node* node) { | |
| 208 Bounds empty; | |
| 209 node->set_bounds(empty); | |
| 210 } | |
| 211 | |
| 212 inline void NodeProperties::SetBounds(Node* node, Bounds b) { | |
| 213 DCHECK(b.lower != NULL && b.upper != NULL); | |
| 214 node->set_bounds(b); | |
| 215 } | |
| 216 | |
| 217 inline bool NodeProperties::AllValueInputsAreTyped(Node* node) { | |
| 218 int input_count = node->op()->ValueInputCount(); | |
| 219 for (int i = 0; i < input_count; ++i) { | |
| 220 if (!IsTyped(GetValueInput(node, i))) return false; | |
| 221 } | |
| 222 return true; | |
| 223 } | |
| 224 | |
| 225 | |
| 226 } | |
| 227 } | |
| 228 } // namespace v8::internal::compiler | |
| 229 | |
| 230 #endif // V8_COMPILER_NODE_PROPERTIES_INL_H_ | |
| OLD | NEW |