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

Side by Side Diff: src/compiler/control-reducer.cc

Issue 691513002: [turbofan] Introduce new Select operator to improve bounds checking. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month 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/common-operator.cc ('k') | src/compiler/js-generic-lowering.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/common-operator.h" 5 #include "src/compiler/common-operator.h"
6 #include "src/compiler/control-reducer.h" 6 #include "src/compiler/control-reducer.h"
7 #include "src/compiler/graph.h" 7 #include "src/compiler/graph.h"
8 #include "src/compiler/js-graph.h" 8 #include "src/compiler/js-graph.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/node-properties-inl.h" 10 #include "src/compiler/node-properties-inl.h"
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 } 315 }
316 } 316 }
317 317
318 // Reduce branches, phis, and merges. 318 // Reduce branches, phis, and merges.
319 switch (node->opcode()) { 319 switch (node->opcode()) {
320 case IrOpcode::kBranch: 320 case IrOpcode::kBranch:
321 return ReduceBranch(node); 321 return ReduceBranch(node);
322 case IrOpcode::kLoop: 322 case IrOpcode::kLoop:
323 case IrOpcode::kMerge: 323 case IrOpcode::kMerge:
324 return ReduceMerge(node); 324 return ReduceMerge(node);
325 case IrOpcode::kSelect:
326 return ReduceSelect(node);
325 case IrOpcode::kPhi: 327 case IrOpcode::kPhi:
326 case IrOpcode::kEffectPhi: 328 case IrOpcode::kEffectPhi:
327 return ReducePhi(node); 329 return ReducePhi(node);
328 default: 330 default:
329 return node; 331 return node;
330 } 332 }
331 } 333 }
332 334
335 // Reduce redundant selects.
336 Node* ReduceSelect(Node* const node) {
337 Node* const cond = node->InputAt(0);
338 Node* const tvalue = node->InputAt(1);
339 Node* const fvalue = node->InputAt(2);
340 if (tvalue == fvalue) return tvalue;
341 switch (cond->opcode()) {
342 case IrOpcode::kInt32Constant:
343 return Int32Matcher(cond).Is(0) ? fvalue : tvalue;
344 case IrOpcode::kInt64Constant:
345 return Int64Matcher(cond).Is(0) ? fvalue : tvalue;
346 case IrOpcode::kNumberConstant:
347 return NumberMatcher(cond).Is(0) ? fvalue : tvalue;
348 case IrOpcode::kHeapConstant: {
349 Handle<Object> object =
350 HeapObjectMatcher<Object>(cond).Value().handle();
351 if (object->IsTrue()) return tvalue;
352 if (object->IsFalse()) return fvalue;
353 break;
354 }
355 default:
356 break;
357 }
358 return node;
359 }
360
333 // Reduce redundant phis. 361 // Reduce redundant phis.
334 Node* ReducePhi(Node* node) { 362 Node* ReducePhi(Node* node) {
335 int n = node->InputCount(); 363 int n = node->InputCount();
336 if (n <= 1) return dead(); // No non-control inputs. 364 if (n <= 1) return dead(); // No non-control inputs.
337 if (n == 2) return node->InputAt(0); // Only one non-control input. 365 if (n == 2) return node->InputAt(0); // Only one non-control input.
338 366
339 Node* replacement = NULL; 367 Node* replacement = NULL;
340 Node::Inputs inputs = node->inputs(); 368 Node::Inputs inputs = node->inputs();
341 for (InputIter it = inputs.begin(); n > 1; --n, ++it) { 369 for (InputIter it = inputs.begin(); n > 1; --n, ++it) {
342 Node* input = *it; 370 Node* input = *it;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 } 427 }
400 428
401 // Reduce branches if they have constant inputs. 429 // Reduce branches if they have constant inputs.
402 Node* ReduceBranch(Node* node) { 430 Node* ReduceBranch(Node* node) {
403 Node* cond = node->InputAt(0); 431 Node* cond = node->InputAt(0);
404 bool is_true; 432 bool is_true;
405 switch (cond->opcode()) { 433 switch (cond->opcode()) {
406 case IrOpcode::kInt32Constant: 434 case IrOpcode::kInt32Constant:
407 is_true = !Int32Matcher(cond).Is(0); 435 is_true = !Int32Matcher(cond).Is(0);
408 break; 436 break;
437 case IrOpcode::kInt64Constant:
438 is_true = !Int64Matcher(cond).Is(0);
439 break;
409 case IrOpcode::kNumberConstant: 440 case IrOpcode::kNumberConstant:
410 is_true = !NumberMatcher(cond).Is(0); 441 is_true = !NumberMatcher(cond).Is(0);
411 break; 442 break;
412 case IrOpcode::kHeapConstant: { 443 case IrOpcode::kHeapConstant: {
413 Handle<Object> object = 444 Handle<Object> object =
414 HeapObjectMatcher<Object>(cond).Value().handle(); 445 HeapObjectMatcher<Object>(cond).Value().handle();
415 if (object->IsTrue()) 446 if (object->IsTrue())
416 is_true = true; 447 is_true = true;
417 else if (object->IsFalse()) 448 else if (object->IsFalse())
418 is_true = false; 449 is_true = false;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph, 557 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph,
527 CommonOperatorBuilder* common, 558 CommonOperatorBuilder* common,
528 Node* node) { 559 Node* node) {
529 Zone zone(jsgraph->graph()->zone()->isolate()); 560 Zone zone(jsgraph->graph()->zone()->isolate());
530 ControlReducerImpl impl(&zone, jsgraph, common); 561 ControlReducerImpl impl(&zone, jsgraph, common);
531 return impl.ReduceBranch(node); 562 return impl.ReduceBranch(node);
532 } 563 }
533 } 564 }
534 } 565 }
535 } // namespace v8::internal::compiler 566 } // namespace v8::internal::compiler
OLDNEW
« no previous file with comments | « src/compiler/common-operator.cc ('k') | src/compiler/js-generic-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698