• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 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 #include "src/compiler/node-matchers.h"
6 
7 namespace v8 {
8 namespace internal {
9 namespace compiler {
10 
IsComparison() const11 bool NodeMatcher::IsComparison() const {
12   return IrOpcode::IsComparisonOpcode(opcode());
13 }
14 
15 
BranchMatcher(Node * branch)16 BranchMatcher::BranchMatcher(Node* branch)
17     : NodeMatcher(branch), if_true_(nullptr), if_false_(nullptr) {
18   if (branch->opcode() != IrOpcode::kBranch) return;
19   for (Node* use : branch->uses()) {
20     if (use->opcode() == IrOpcode::kIfTrue) {
21       DCHECK_NULL(if_true_);
22       if_true_ = use;
23     } else if (use->opcode() == IrOpcode::kIfFalse) {
24       DCHECK_NULL(if_false_);
25       if_false_ = use;
26     }
27   }
28 }
29 
30 
DiamondMatcher(Node * merge)31 DiamondMatcher::DiamondMatcher(Node* merge)
32     : NodeMatcher(merge),
33       branch_(nullptr),
34       if_true_(nullptr),
35       if_false_(nullptr) {
36   if (merge->InputCount() != 2) return;
37   if (merge->opcode() != IrOpcode::kMerge) return;
38   Node* input0 = merge->InputAt(0);
39   if (input0->InputCount() != 1) return;
40   Node* input1 = merge->InputAt(1);
41   if (input1->InputCount() != 1) return;
42   Node* branch = input0->InputAt(0);
43   if (branch != input1->InputAt(0)) return;
44   if (branch->opcode() != IrOpcode::kBranch) return;
45   if (input0->opcode() == IrOpcode::kIfTrue &&
46       input1->opcode() == IrOpcode::kIfFalse) {
47     branch_ = branch;
48     if_true_ = input0;
49     if_false_ = input1;
50   } else if (input0->opcode() == IrOpcode::kIfFalse &&
51              input1->opcode() == IrOpcode::kIfTrue) {
52     branch_ = branch;
53     if_true_ = input1;
54     if_false_ = input0;
55   }
56 }
57 
58 }  // namespace compiler
59 }  // namespace internal
60 }  // namespace v8
61