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/simplified-operator-reducer.h" | 5 #include "src/compiler/simplified-operator-reducer.h" |
6 | 6 |
7 #include "src/compiler/access-builder.h" | |
8 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
9 #include "src/compiler/machine-operator.h" | 8 #include "src/compiler/machine-operator.h" |
10 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
11 #include "src/compiler/node-properties.h" | |
12 #include "src/compiler/operator-properties.h" | 10 #include "src/compiler/operator-properties.h" |
13 | 11 |
14 namespace v8 { | 12 namespace v8 { |
15 namespace internal { | 13 namespace internal { |
16 namespace compiler { | 14 namespace compiler { |
17 | 15 |
18 SimplifiedOperatorReducer::SimplifiedOperatorReducer(JSGraph* jsgraph) | 16 SimplifiedOperatorReducer::SimplifiedOperatorReducer(JSGraph* jsgraph) |
19 : jsgraph_(jsgraph), simplified_(jsgraph->zone()) {} | 17 : jsgraph_(jsgraph), simplified_(jsgraph->zone()) {} |
20 | 18 |
21 | 19 |
22 SimplifiedOperatorReducer::~SimplifiedOperatorReducer() {} | 20 SimplifiedOperatorReducer::~SimplifiedOperatorReducer() {} |
23 | 21 |
24 | 22 |
25 Reduction SimplifiedOperatorReducer::Reduce(Node* node) { | 23 Reduction SimplifiedOperatorReducer::Reduce(Node* node) { |
26 switch (node->opcode()) { | 24 switch (node->opcode()) { |
27 case IrOpcode::kAnyToBoolean: | |
28 return ReduceAnyToBoolean(node); | |
29 case IrOpcode::kBooleanNot: { | 25 case IrOpcode::kBooleanNot: { |
30 HeapObjectMatcher<HeapObject> m(node->InputAt(0)); | 26 HeapObjectMatcher<HeapObject> m(node->InputAt(0)); |
31 if (m.Is(Unique<HeapObject>::CreateImmovable(factory()->false_value()))) { | 27 if (m.Is(Unique<HeapObject>::CreateImmovable(factory()->false_value()))) { |
32 return Replace(jsgraph()->TrueConstant()); | 28 return Replace(jsgraph()->TrueConstant()); |
33 } | 29 } |
34 if (m.Is(Unique<HeapObject>::CreateImmovable(factory()->true_value()))) { | 30 if (m.Is(Unique<HeapObject>::CreateImmovable(factory()->true_value()))) { |
35 return Replace(jsgraph()->FalseConstant()); | 31 return Replace(jsgraph()->FalseConstant()); |
36 } | 32 } |
37 if (m.IsBooleanNot()) return Replace(m.node()->InputAt(0)); | 33 if (m.IsBooleanNot()) return Replace(m.node()->InputAt(0)); |
38 break; | 34 break; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 if (m.HasValue()) return ReplaceNumber(FastUI2D(m.Value())); | 100 if (m.HasValue()) return ReplaceNumber(FastUI2D(m.Value())); |
105 break; | 101 break; |
106 } | 102 } |
107 default: | 103 default: |
108 break; | 104 break; |
109 } | 105 } |
110 return NoChange(); | 106 return NoChange(); |
111 } | 107 } |
112 | 108 |
113 | 109 |
114 Reduction SimplifiedOperatorReducer::ReduceAnyToBoolean(Node* node) { | |
115 Node* const input = NodeProperties::GetValueInput(node, 0); | |
116 Type* const input_type = NodeProperties::GetBounds(input).upper; | |
117 if (input_type->Is(Type::Boolean())) { | |
118 // AnyToBoolean(x:boolean) => x | |
119 return Replace(input); | |
120 } | |
121 if (input_type->Is(Type::OrderedNumber())) { | |
122 // AnyToBoolean(x:ordered-number) => BooleanNot(NumberEqual(x, #0)) | |
123 Node* compare = graph()->NewNode(simplified()->NumberEqual(), input, | |
124 jsgraph()->ZeroConstant()); | |
125 return Change(node, simplified()->BooleanNot(), compare); | |
126 } | |
127 if (input_type->Is(Type::String())) { | |
128 // AnyToBoolean(x:string) => BooleanNot(NumberEqual(x.length, #0)) | |
129 FieldAccess const access = AccessBuilder::ForStringLength(); | |
130 Node* length = graph()->NewNode(simplified()->LoadField(access), input, | |
131 graph()->start(), graph()->start()); | |
132 Node* compare = graph()->NewNode(simplified()->NumberEqual(), length, | |
133 jsgraph()->ZeroConstant()); | |
134 return Change(node, simplified()->BooleanNot(), compare); | |
135 } | |
136 return NoChange(); | |
137 } | |
138 | |
139 | |
140 Reduction SimplifiedOperatorReducer::Change(Node* node, const Operator* op, | 110 Reduction SimplifiedOperatorReducer::Change(Node* node, const Operator* op, |
141 Node* a) { | 111 Node* a) { |
142 DCHECK_EQ(node->InputCount(), OperatorProperties::GetTotalInputCount(op)); | 112 DCHECK_EQ(node->InputCount(), OperatorProperties::GetTotalInputCount(op)); |
143 DCHECK_LE(1, node->InputCount()); | 113 DCHECK_LE(1, node->InputCount()); |
144 node->set_op(op); | 114 node->set_op(op); |
145 node->ReplaceInput(0, a); | 115 node->ReplaceInput(0, a); |
146 return Changed(node); | 116 return Changed(node); |
147 } | 117 } |
148 | 118 |
149 | 119 |
(...skipping 18 matching lines...) Expand all Loading... |
168 | 138 |
169 | 139 |
170 Graph* SimplifiedOperatorReducer::graph() const { return jsgraph()->graph(); } | 140 Graph* SimplifiedOperatorReducer::graph() const { return jsgraph()->graph(); } |
171 | 141 |
172 | 142 |
173 Factory* SimplifiedOperatorReducer::factory() const { | 143 Factory* SimplifiedOperatorReducer::factory() const { |
174 return jsgraph()->isolate()->factory(); | 144 return jsgraph()->isolate()->factory(); |
175 } | 145 } |
176 | 146 |
177 | 147 |
178 CommonOperatorBuilder* SimplifiedOperatorReducer::common() const { | |
179 return jsgraph()->common(); | |
180 } | |
181 | |
182 | |
183 MachineOperatorBuilder* SimplifiedOperatorReducer::machine() const { | 148 MachineOperatorBuilder* SimplifiedOperatorReducer::machine() const { |
184 return jsgraph()->machine(); | 149 return jsgraph()->machine(); |
185 } | 150 } |
186 | 151 |
187 } // namespace compiler | 152 } // namespace compiler |
188 } // namespace internal | 153 } // namespace internal |
189 } // namespace v8 | 154 } // namespace v8 |
OLD | NEW |