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

Side by Side Diff: src/compiler/diamond.h

Issue 694063005: Introduce Diamond, a helper for building diamond-shaped control patterns. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: newline 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/change-lowering.cc ('k') | src/compiler/js-builtin-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
(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_DIAMOND_H_
6 #define V8_COMPILER_DIAMOND_H_
7
8 #include "src/v8.h"
9
10 #include "src/compiler/common-operator.h"
11 #include "src/compiler/graph-inl.h"
12 #include "src/compiler/node.h"
13
14 namespace v8 {
15 namespace internal {
16 namespace compiler {
17
18 // A helper to make it easier to build diamond-shaped control patterns.
19 struct Diamond {
20 Graph* graph;
21 CommonOperatorBuilder* common;
22 Node* branch;
23 Node* if_true;
24 Node* if_false;
25 Node* merge;
26
27 Diamond(Graph* g, CommonOperatorBuilder* b, Node* cond,
28 BranchHint hint = BranchHint::kNone) {
29 graph = g;
30 common = b;
31 branch = graph->NewNode(common->Branch(hint), cond, graph->start());
32 if_true = graph->NewNode(common->IfTrue(), branch);
33 if_false = graph->NewNode(common->IfFalse(), branch);
34 merge = graph->NewNode(common->Merge(2), if_true, if_false);
35 }
36
37 // Place {this} after {that} in control flow order.
38 void Chain(Diamond& that) { branch->ReplaceInput(1, that.merge); }
39
40 // Place {this} after {that} in control flow order.
41 void Chain(Node* that) { branch->ReplaceInput(1, that); }
42
43 // Nest {this} into either the if_true or if_false branch of {that}.
44 void Nest(Diamond& that, bool if_true) {
45 if (if_true) {
46 branch->ReplaceInput(1, that.if_true);
47 that.merge->ReplaceInput(0, merge);
48 } else {
49 branch->ReplaceInput(1, that.if_false);
50 that.merge->ReplaceInput(1, merge);
51 }
52 }
53
54 Node* Phi(MachineType machine_type, Node* tv, Node* fv) {
55 return graph->NewNode(common->Phi(machine_type, 2), tv, fv, merge);
56 }
57
58 Node* EffectPhi(Node* tv, Node* fv) {
59 return graph->NewNode(common->EffectPhi(2), tv, fv, merge);
60 }
61
62 void OverwriteWithPhi(Node* node, MachineType machine_type, Node* tv,
63 Node* fv) {
64 DCHECK(node->InputCount() >= 3);
65 node->set_op(common->Phi(machine_type, 2));
66 node->ReplaceInput(0, tv);
67 node->ReplaceInput(1, fv);
68 node->ReplaceInput(2, merge);
69 node->TrimInputCount(3);
70 }
71
72 void OverwriteWithEffectPhi(Node* node, Node* te, Node* fe) {
73 DCHECK(node->InputCount() >= 3);
74 node->set_op(common->EffectPhi(2));
75 node->ReplaceInput(0, te);
76 node->ReplaceInput(1, fe);
77 node->ReplaceInput(2, merge);
78 node->TrimInputCount(3);
79 }
80 };
81 }
82 }
83 } // namespace v8::internal::compiler
84
85 #endif // V8_COMPILER_DIAMOND_H_
OLDNEW
« no previous file with comments | « src/compiler/change-lowering.cc ('k') | src/compiler/js-builtin-reducer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698