| 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/instruction-selector.h" | 5 #include "src/compiler/instruction-selector.h" |
| 6 | 6 |
| 7 #include "src/compiler/instruction-selector-impl.h" | 7 #include "src/compiler/instruction-selector-impl.h" |
| 8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
| 9 #include "src/compiler/node-properties-inl.h" | 9 #include "src/compiler/node-properties-inl.h" |
| 10 #include "src/compiler/pipeline.h" | 10 #include "src/compiler/pipeline.h" |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 DCHECK_NOT_NULL(node); | 192 DCHECK_NOT_NULL(node); |
| 193 return sequence()->IsDouble(node->id()); | 193 return sequence()->IsDouble(node->id()); |
| 194 } | 194 } |
| 195 | 195 |
| 196 | 196 |
| 197 void InstructionSelector::MarkAsDouble(Node* node) { | 197 void InstructionSelector::MarkAsDouble(Node* node) { |
| 198 DCHECK_NOT_NULL(node); | 198 DCHECK_NOT_NULL(node); |
| 199 DCHECK(!IsReference(node)); | 199 DCHECK(!IsReference(node)); |
| 200 sequence()->MarkAsDouble(node->id()); | 200 sequence()->MarkAsDouble(node->id()); |
| 201 | 201 |
| 202 // Propagate "doubleness" throughout phis. | 202 // Propagate "doubleness" throughout Finish/Phi nodes. |
| 203 for (UseIter i = node->uses().begin(); i != node->uses().end(); ++i) { | 203 for (UseIter i = node->uses().begin(); i != node->uses().end(); ++i) { |
| 204 Node* user = *i; | 204 Node* user = *i; |
| 205 if (user->opcode() != IrOpcode::kPhi) continue; | 205 switch (user->opcode()) { |
| 206 if (IsDouble(user)) continue; | 206 case IrOpcode::kFinish: |
| 207 MarkAsDouble(user); | 207 case IrOpcode::kPhi: |
| 208 if (IsDouble(user)) continue; |
| 209 MarkAsDouble(user); |
| 210 break; |
| 211 default: |
| 212 break; |
| 213 } |
| 208 } | 214 } |
| 209 } | 215 } |
| 210 | 216 |
| 211 | 217 |
| 212 bool InstructionSelector::IsReference(const Node* node) const { | 218 bool InstructionSelector::IsReference(const Node* node) const { |
| 213 DCHECK_NOT_NULL(node); | 219 DCHECK_NOT_NULL(node); |
| 214 return sequence()->IsReference(node->id()); | 220 return sequence()->IsReference(node->id()); |
| 215 } | 221 } |
| 216 | 222 |
| 217 | 223 |
| 218 void InstructionSelector::MarkAsReference(Node* node) { | 224 void InstructionSelector::MarkAsReference(Node* node) { |
| 219 DCHECK_NOT_NULL(node); | 225 DCHECK_NOT_NULL(node); |
| 220 DCHECK(!IsDouble(node)); | 226 DCHECK(!IsDouble(node)); |
| 221 sequence()->MarkAsReference(node->id()); | 227 sequence()->MarkAsReference(node->id()); |
| 222 | 228 |
| 223 // Propagate "referenceness" throughout phis. | 229 // Propagate "referenceness" throughout Finish/Phi nodes. |
| 224 for (UseIter i = node->uses().begin(); i != node->uses().end(); ++i) { | 230 for (UseIter i = node->uses().begin(); i != node->uses().end(); ++i) { |
| 225 Node* user = *i; | 231 Node* user = *i; |
| 226 if (user->opcode() != IrOpcode::kPhi) continue; | 232 switch (user->opcode()) { |
| 227 if (IsReference(user)) continue; | 233 case IrOpcode::kFinish: |
| 228 MarkAsReference(user); | 234 case IrOpcode::kPhi: |
| 235 if (IsReference(user)) continue; |
| 236 MarkAsReference(user); |
| 237 break; |
| 238 default: |
| 239 break; |
| 240 } |
| 229 } | 241 } |
| 230 } | 242 } |
| 231 | 243 |
| 232 | 244 |
| 233 void InstructionSelector::MarkAsRepresentation(MachineType rep, Node* node) { | 245 void InstructionSelector::MarkAsRepresentation(MachineType rep, Node* node) { |
| 234 DCHECK_NOT_NULL(node); | 246 DCHECK_NOT_NULL(node); |
| 235 if (RepresentationOf(rep) == kRepFloat64) MarkAsDouble(node); | 247 if (RepresentationOf(rep) == kRepFloat64) MarkAsDouble(node); |
| 236 if (RepresentationOf(rep) == kRepTagged) MarkAsReference(node); | 248 if (RepresentationOf(rep) == kRepTagged) MarkAsReference(node); |
| 237 } | 249 } |
| 238 | 250 |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 case IrOpcode::kEnd: | 469 case IrOpcode::kEnd: |
| 458 case IrOpcode::kBranch: | 470 case IrOpcode::kBranch: |
| 459 case IrOpcode::kIfTrue: | 471 case IrOpcode::kIfTrue: |
| 460 case IrOpcode::kIfFalse: | 472 case IrOpcode::kIfFalse: |
| 461 case IrOpcode::kEffectPhi: | 473 case IrOpcode::kEffectPhi: |
| 462 case IrOpcode::kMerge: | 474 case IrOpcode::kMerge: |
| 463 case IrOpcode::kLazyDeoptimization: | 475 case IrOpcode::kLazyDeoptimization: |
| 464 case IrOpcode::kContinuation: | 476 case IrOpcode::kContinuation: |
| 465 // No code needed for these graph artifacts. | 477 // No code needed for these graph artifacts. |
| 466 return; | 478 return; |
| 479 case IrOpcode::kFinish: |
| 480 return VisitFinish(node); |
| 467 case IrOpcode::kParameter: { | 481 case IrOpcode::kParameter: { |
| 468 int index = OpParameter<int>(node); | 482 LinkageLocation location = |
| 469 MachineType rep = linkage() | 483 linkage()->GetParameterLocation(OpParameter<int>(node)); |
| 470 ->GetIncomingDescriptor() | 484 MarkAsRepresentation(location.representation(), node); |
| 471 ->GetInputLocation(index) | |
| 472 .representation(); | |
| 473 MarkAsRepresentation(rep, node); | |
| 474 return VisitParameter(node); | 485 return VisitParameter(node); |
| 475 } | 486 } |
| 476 case IrOpcode::kPhi: | 487 case IrOpcode::kPhi: |
| 477 return VisitPhi(node); | 488 return VisitPhi(node); |
| 478 case IrOpcode::kProjection: | 489 case IrOpcode::kProjection: |
| 479 return VisitProjection(node); | 490 return VisitProjection(node); |
| 480 case IrOpcode::kInt32Constant: | 491 case IrOpcode::kInt32Constant: |
| 481 case IrOpcode::kInt64Constant: | 492 case IrOpcode::kInt64Constant: |
| 482 case IrOpcode::kExternalConstant: | 493 case IrOpcode::kExternalConstant: |
| 483 return VisitConstant(node); | 494 return VisitConstant(node); |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 | 801 |
| 791 | 802 |
| 792 void InstructionSelector::VisitWord64Compare(Node* node, | 803 void InstructionSelector::VisitWord64Compare(Node* node, |
| 793 FlagsContinuation* cont) { | 804 FlagsContinuation* cont) { |
| 794 UNIMPLEMENTED(); | 805 UNIMPLEMENTED(); |
| 795 } | 806 } |
| 796 | 807 |
| 797 #endif // V8_TARGET_ARCH_32_BIT || !V8_TURBOFAN_BACKEND | 808 #endif // V8_TARGET_ARCH_32_BIT || !V8_TURBOFAN_BACKEND |
| 798 | 809 |
| 799 | 810 |
| 811 void InstructionSelector::VisitFinish(Node* node) { |
| 812 OperandGenerator g(this); |
| 813 Node* value = node->InputAt(0); |
| 814 Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value)); |
| 815 } |
| 816 |
| 817 |
| 800 void InstructionSelector::VisitParameter(Node* node) { | 818 void InstructionSelector::VisitParameter(Node* node) { |
| 801 OperandGenerator g(this); | 819 OperandGenerator g(this); |
| 802 Emit(kArchNop, g.DefineAsLocation(node, linkage()->GetParameterLocation( | 820 Emit(kArchNop, g.DefineAsLocation(node, linkage()->GetParameterLocation( |
| 803 OpParameter<int>(node)))); | 821 OpParameter<int>(node)))); |
| 804 } | 822 } |
| 805 | 823 |
| 806 | 824 |
| 807 void InstructionSelector::VisitPhi(Node* node) { | 825 void InstructionSelector::VisitPhi(Node* node) { |
| 808 // TODO(bmeurer): Emit a PhiInstruction here. | 826 // TODO(bmeurer): Emit a PhiInstruction here. |
| 809 for (InputIter i = node->inputs().begin(); i != node->inputs().end(); ++i) { | 827 for (InputIter i = node->inputs().begin(); i != node->inputs().end(); ++i) { |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1067 | 1085 |
| 1068 | 1086 |
| 1069 void InstructionSelector::VisitCall(Node* call, BasicBlock* continuation, | 1087 void InstructionSelector::VisitCall(Node* call, BasicBlock* continuation, |
| 1070 BasicBlock* deoptimization) {} | 1088 BasicBlock* deoptimization) {} |
| 1071 | 1089 |
| 1072 #endif // !V8_TURBOFAN_BACKEND | 1090 #endif // !V8_TURBOFAN_BACKEND |
| 1073 | 1091 |
| 1074 } // namespace compiler | 1092 } // namespace compiler |
| 1075 } // namespace internal | 1093 } // namespace internal |
| 1076 } // namespace v8 | 1094 } // namespace v8 |
| OLD | NEW |