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

Side by Side Diff: src/compiler/common-operator-reducer.cc

Issue 1072353002: [turbofan] Optimize silent hole checks on legacy const context slots. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 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
« no previous file with comments | « src/compiler/common-operator-reducer.h ('k') | test/mjsunit/asm/pointer-masking.js » ('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-reducer.h" 5 #include "src/compiler/common-operator-reducer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "src/compiler/common-operator.h" 9 #include "src/compiler/common-operator.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 return NoChange(); 102 return NoChange();
103 } 103 }
104 104
105 105
106 Reduction CommonOperatorReducer::ReduceSelect(Node* node) { 106 Reduction CommonOperatorReducer::ReduceSelect(Node* node) {
107 DCHECK_EQ(IrOpcode::kSelect, node->opcode()); 107 DCHECK_EQ(IrOpcode::kSelect, node->opcode());
108 Node* cond = NodeProperties::GetValueInput(node, 0); 108 Node* cond = NodeProperties::GetValueInput(node, 0);
109 Node* vtrue = NodeProperties::GetValueInput(node, 1); 109 Node* vtrue = NodeProperties::GetValueInput(node, 1);
110 Node* vfalse = NodeProperties::GetValueInput(node, 2); 110 Node* vfalse = NodeProperties::GetValueInput(node, 2);
111 if (vtrue == vfalse) return Replace(vtrue); 111 if (vtrue == vfalse) return Replace(vtrue);
112 if (cond->opcode() == IrOpcode::kFloat32LessThan) { 112 switch (cond->opcode()) {
113 Float32BinopMatcher mcond(cond); 113 case IrOpcode::kHeapConstant: {
114 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && 114 HeapObjectMatcher<HeapObject> mcond(cond);
115 vfalse->opcode() == IrOpcode::kFloat32Sub && 115 if (mcond.Is(
Michael Starzinger 2015/04/10 09:32:39 We should be able to use the following here ... H
Benedikt Meurer 2015/04/10 09:39:38 Done.
116 machine()->HasFloat32Abs()) { 116 Unique<HeapObject>::CreateImmovable(factory()->true_value()))) {
117 Float32BinopMatcher mvfalse(vfalse); 117 return Replace(vtrue);
118 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
119 return Change(node, machine()->Float32Abs(), vtrue);
120 } 118 }
119 if (mcond.Is(
120 Unique<HeapObject>::CreateImmovable(factory()->false_value()))) {
121 return Replace(vfalse);
122 }
123 break;
121 } 124 }
122 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && 125 case IrOpcode::kFloat32LessThan: {
123 machine()->HasFloat32Min()) { 126 Float32BinopMatcher mcond(cond);
124 return Change(node, machine()->Float32Min(), vtrue, vfalse); 127 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
125 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && 128 vfalse->opcode() == IrOpcode::kFloat32Sub &&
126 machine()->HasFloat32Max()) { 129 machine()->HasFloat32Abs()) {
127 return Change(node, machine()->Float32Max(), vtrue, vfalse); 130 Float32BinopMatcher mvfalse(vfalse);
131 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
132 return Change(node, machine()->Float32Abs(), vtrue);
133 }
134 }
135 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
136 machine()->HasFloat32Min()) {
137 return Change(node, machine()->Float32Min(), vtrue, vfalse);
138 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
139 machine()->HasFloat32Max()) {
140 return Change(node, machine()->Float32Max(), vtrue, vfalse);
141 }
142 break;
128 } 143 }
129 } else if (cond->opcode() == IrOpcode::kFloat64LessThan) { 144 case IrOpcode::kFloat64LessThan: {
130 Float64BinopMatcher mcond(cond); 145 Float64BinopMatcher mcond(cond);
131 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && 146 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
132 vfalse->opcode() == IrOpcode::kFloat64Sub && 147 vfalse->opcode() == IrOpcode::kFloat64Sub &&
133 machine()->HasFloat64Abs()) { 148 machine()->HasFloat64Abs()) {
134 Float64BinopMatcher mvfalse(vfalse); 149 Float64BinopMatcher mvfalse(vfalse);
135 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { 150 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
136 return Change(node, machine()->Float64Abs(), vtrue); 151 return Change(node, machine()->Float64Abs(), vtrue);
152 }
137 } 153 }
154 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
155 machine()->HasFloat64Min()) {
156 return Change(node, machine()->Float64Min(), vtrue, vfalse);
157 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
158 machine()->HasFloat64Max()) {
159 return Change(node, machine()->Float64Max(), vtrue, vfalse);
160 }
161 break;
138 } 162 }
139 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && 163 default:
140 machine()->HasFloat64Min()) { 164 break;
141 return Change(node, machine()->Float64Min(), vtrue, vfalse);
142 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
143 machine()->HasFloat64Max()) {
144 return Change(node, machine()->Float64Max(), vtrue, vfalse);
145 }
146 } 165 }
147 return NoChange(); 166 return NoChange();
148 } 167 }
149 168
150 169
151 Reduction CommonOperatorReducer::Change(Node* node, Operator const* op, 170 Reduction CommonOperatorReducer::Change(Node* node, Operator const* op,
152 Node* a) { 171 Node* a) {
153 node->set_op(op); 172 node->set_op(op);
154 node->ReplaceInput(0, a); 173 node->ReplaceInput(0, a);
155 node->TrimInputCount(1); 174 node->TrimInputCount(1);
(...skipping 12 matching lines...) Expand all
168 187
169 188
170 CommonOperatorBuilder* CommonOperatorReducer::common() const { 189 CommonOperatorBuilder* CommonOperatorReducer::common() const {
171 return jsgraph()->common(); 190 return jsgraph()->common();
172 } 191 }
173 192
174 193
175 Graph* CommonOperatorReducer::graph() const { return jsgraph()->graph(); } 194 Graph* CommonOperatorReducer::graph() const { return jsgraph()->graph(); }
176 195
177 196
197 Factory* CommonOperatorReducer::factory() const {
Michael Starzinger 2015/04/10 09:32:39 If the above suggestion works, then the factory ge
Benedikt Meurer 2015/04/10 09:39:38 Done.
198 return jsgraph()->isolate()->factory();
199 }
200
201
178 MachineOperatorBuilder* CommonOperatorReducer::machine() const { 202 MachineOperatorBuilder* CommonOperatorReducer::machine() const {
179 return jsgraph()->machine(); 203 return jsgraph()->machine();
180 } 204 }
181 205
182 } // namespace compiler 206 } // namespace compiler
183 } // namespace internal 207 } // namespace internal
184 } // namespace v8 208 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/common-operator-reducer.h ('k') | test/mjsunit/asm/pointer-masking.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698