Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(588)

Side by Side Diff: src/compiler/simplified-lowering.cc

Issue 545153002: [turbofan] Add MachineType to Phi. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add test case. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/compiler/raw-machine-assembler.h ('k') | test/cctest/compiler/test-phi-reducer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/compiler/common-operator.h" 8 #include "src/compiler/common-operator.h"
9 #include "src/compiler/graph-inl.h" 9 #include "src/compiler/graph-inl.h"
10 #include "src/compiler/node-properties-inl.h" 10 #include "src/compiler/node-properties-inl.h"
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 void VisitUint64Binop(Node* node) { 260 void VisitUint64Binop(Node* node) {
261 VisitBinop(node, kMachUint64, kMachUint64); 261 VisitBinop(node, kMachUint64, kMachUint64);
262 } 262 }
263 void VisitFloat64Cmp(Node* node) { VisitBinop(node, kMachFloat64, kRepBit); } 263 void VisitFloat64Cmp(Node* node) { VisitBinop(node, kMachFloat64, kRepBit); }
264 void VisitInt32Cmp(Node* node) { VisitBinop(node, kMachInt32, kRepBit); } 264 void VisitInt32Cmp(Node* node) { VisitBinop(node, kMachInt32, kRepBit); }
265 void VisitUint32Cmp(Node* node) { VisitBinop(node, kMachUint32, kRepBit); } 265 void VisitUint32Cmp(Node* node) { VisitBinop(node, kMachUint32, kRepBit); }
266 void VisitInt64Cmp(Node* node) { VisitBinop(node, kMachInt64, kRepBit); } 266 void VisitInt64Cmp(Node* node) { VisitBinop(node, kMachInt64, kRepBit); }
267 void VisitUint64Cmp(Node* node) { VisitBinop(node, kMachUint64, kRepBit); } 267 void VisitUint64Cmp(Node* node) { VisitBinop(node, kMachUint64, kRepBit); }
268 268
269 // Helper for handling phis. 269 // Helper for handling phis.
270 void VisitPhi(Node* node, MachineTypeUnion use) { 270 void VisitPhi(Node* node, MachineTypeUnion use,
271 SimplifiedLowering* lowering) {
271 // First, propagate the usage information to inputs of the phi. 272 // First, propagate the usage information to inputs of the phi.
272 if (!lower()) { 273 if (!lower()) {
273 int values = OperatorProperties::GetValueInputCount(node->op()); 274 int values = OperatorProperties::GetValueInputCount(node->op());
274 // Propagate {use} of the phi to value inputs, and 0 to control. 275 // Propagate {use} of the phi to value inputs, and 0 to control.
275 Node::Inputs inputs = node->inputs(); 276 Node::Inputs inputs = node->inputs();
276 for (Node::Inputs::iterator iter(inputs.begin()); iter != inputs.end(); 277 for (Node::Inputs::iterator iter(inputs.begin()); iter != inputs.end();
277 ++iter, --values) { 278 ++iter, --values) {
278 // TODO(titzer): it'd be nice to have distinguished edge kinds here. 279 // TODO(titzer): it'd be nice to have distinguished edge kinds here.
279 ProcessInput(node, iter.index(), values > 0 ? use : 0); 280 ProcessInput(node, iter.index(), values > 0 ? use : 0);
280 } 281 }
(...skipping 30 matching lines...) Expand all
311 UNREACHABLE(); // should have at least a usage type! 312 UNREACHABLE(); // should have at least a usage type!
312 } 313 }
313 } 314 }
314 // Preserve the usage type, but set the representation. 315 // Preserve the usage type, but set the representation.
315 Type* upper = NodeProperties::GetBounds(node).upper; 316 Type* upper = NodeProperties::GetBounds(node).upper;
316 MachineTypeUnion output_type = rep | changer_->TypeFromUpperBound(upper); 317 MachineTypeUnion output_type = rep | changer_->TypeFromUpperBound(upper);
317 SetOutput(node, output_type); 318 SetOutput(node, output_type);
318 319
319 if (lower()) { 320 if (lower()) {
320 int values = OperatorProperties::GetValueInputCount(node->op()); 321 int values = OperatorProperties::GetValueInputCount(node->op());
322
323 // Update the phi operator.
324 MachineType type = static_cast<MachineType>(output_type);
325 if (type != OpParameter<MachineType>(node)) {
326 node->set_op(lowering->common()->Phi(type, values));
327 }
328
321 // Convert inputs to the output representation of this phi. 329 // Convert inputs to the output representation of this phi.
322 Node::Inputs inputs = node->inputs(); 330 Node::Inputs inputs = node->inputs();
323 for (Node::Inputs::iterator iter(inputs.begin()); iter != inputs.end(); 331 for (Node::Inputs::iterator iter(inputs.begin()); iter != inputs.end();
324 ++iter, --values) { 332 ++iter, --values) {
325 // TODO(titzer): it'd be nice to have distinguished edge kinds here. 333 // TODO(titzer): it'd be nice to have distinguished edge kinds here.
326 ProcessInput(node, iter.index(), values > 0 ? output_type : 0); 334 ProcessInput(node, iter.index(), values > 0 ? output_type : 0);
327 } 335 }
328 } 336 }
329 } 337 }
330 338
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 case IrOpcode::kReturn: 385 case IrOpcode::kReturn:
378 case IrOpcode::kMerge: 386 case IrOpcode::kMerge:
379 case IrOpcode::kThrow: 387 case IrOpcode::kThrow:
380 return VisitInputs(node); // default visit for all node inputs. 388 return VisitInputs(node); // default visit for all node inputs.
381 389
382 case IrOpcode::kBranch: 390 case IrOpcode::kBranch:
383 ProcessInput(node, 0, kRepBit); 391 ProcessInput(node, 0, kRepBit);
384 Enqueue(NodeProperties::GetControlInput(node, 0)); 392 Enqueue(NodeProperties::GetControlInput(node, 0));
385 break; 393 break;
386 case IrOpcode::kPhi: 394 case IrOpcode::kPhi:
387 return VisitPhi(node, use); 395 return VisitPhi(node, use, lowering);
388 396
389 //------------------------------------------------------------------ 397 //------------------------------------------------------------------
390 // JavaScript operators. 398 // JavaScript operators.
391 //------------------------------------------------------------------ 399 //------------------------------------------------------------------
392 // For now, we assume that all JS operators were too complex to lower 400 // For now, we assume that all JS operators were too complex to lower
393 // to Simplified and that they will always require tagged value inputs 401 // to Simplified and that they will always require tagged value inputs
394 // and produce tagged value outputs. 402 // and produce tagged value outputs.
395 // TODO(turbofan): it might be possible to lower some JSOperators here, 403 // TODO(turbofan): it might be possible to lower some JSOperators here,
396 // but that responsibility really lies in the typed lowering phase. 404 // but that responsibility really lies in the typed lowering phase.
397 #define DEFINE_JS_CASE(x) case IrOpcode::k##x: 405 #define DEFINE_JS_CASE(x) case IrOpcode::k##x:
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { 899 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) {
892 node->set_op(machine()->IntLessThanOrEqual()); 900 node->set_op(machine()->IntLessThanOrEqual());
893 node->ReplaceInput(0, StringComparison(node, true)); 901 node->ReplaceInput(0, StringComparison(node, true));
894 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); 902 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL));
895 } 903 }
896 904
897 905
898 } // namespace compiler 906 } // namespace compiler
899 } // namespace internal 907 } // namespace internal
900 } // namespace v8 908 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/raw-machine-assembler.h ('k') | test/cctest/compiler/test-phi-reducer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698