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

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

Issue 912393002: Mark some common operator with Property::kNoThrow. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix GVN failures. Created 5 years, 10 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 | « no previous file | src/compiler/operator.h » ('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 6
7 #include "src/assembler.h" 7 #include "src/assembler.h"
8 #include "src/base/lazy-instance.h" 8 #include "src/base/lazy-instance.h"
9 #include "src/compiler/linkage.h" 9 #include "src/compiler/linkage.h"
10 #include "src/compiler/opcodes.h" 10 #include "src/compiler/opcodes.h"
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 111
112 size_t ProjectionIndexOf(const Operator* const op) { 112 size_t ProjectionIndexOf(const Operator* const op) {
113 DCHECK_EQ(IrOpcode::kProjection, op->opcode()); 113 DCHECK_EQ(IrOpcode::kProjection, op->opcode());
114 return OpParameter<size_t>(op); 114 return OpParameter<size_t>(op);
115 } 115 }
116 116
117 117
118 #define CACHED_OP_LIST(V) \ 118 #define CACHED_OP_LIST(V) \
119 V(Always, Operator::kPure, 0, 0, 0, 1, 0, 0) \ 119 V(Always, Operator::kPure, 0, 0, 0, 1, 0, 0) \
120 V(Dead, Operator::kFoldable, 0, 0, 0, 0, 0, 1) \ 120 V(Dead, Operator::kFoldable, 0, 0, 0, 0, 0, 1) \
121 V(End, Operator::kFoldable, 0, 0, 1, 0, 0, 0) \ 121 V(End, Operator::kKontrol, 0, 0, 1, 0, 0, 0) \
122 V(IfTrue, Operator::kFoldable, 0, 0, 1, 0, 0, 1) \ 122 V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \
123 V(IfFalse, Operator::kFoldable, 0, 0, 1, 0, 0, 1) \ 123 V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \
124 V(Throw, Operator::kFoldable, 1, 1, 1, 0, 0, 1) \ 124 V(Throw, Operator::kFoldable, 1, 1, 1, 0, 0, 1) \
125 V(Return, Operator::kNoProperties, 1, 1, 1, 0, 0, 1) \ 125 V(Return, Operator::kNoThrow, 1, 1, 1, 0, 0, 1) \
126 V(OsrNormalEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) \ 126 V(OsrNormalEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) \
127 V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) 127 V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1)
128 128
129 129
130 #define CACHED_LOOP_LIST(V) \ 130 #define CACHED_LOOP_LIST(V) \
131 V(1) \ 131 V(1) \
132 V(2) 132 V(2)
133 133
134 134
135 #define CACHED_MERGE_LIST(V) \ 135 #define CACHED_MERGE_LIST(V) \
(...skipping 28 matching lines...) Expand all
164 value_output_count, effect_output_count, \ 164 value_output_count, effect_output_count, \
165 control_output_count) {} \ 165 control_output_count) {} \
166 }; \ 166 }; \
167 Name##Operator k##Name##Operator; 167 Name##Operator k##Name##Operator;
168 CACHED_OP_LIST(CACHED) 168 CACHED_OP_LIST(CACHED)
169 #undef CACHED 169 #undef CACHED
170 170
171 template <BranchHint kBranchHint> 171 template <BranchHint kBranchHint>
172 struct BranchOperator FINAL : public Operator1<BranchHint> { 172 struct BranchOperator FINAL : public Operator1<BranchHint> {
173 BranchOperator() 173 BranchOperator()
174 : Operator1<BranchHint>( // -- 174 : Operator1<BranchHint>( // --
175 IrOpcode::kBranch, Operator::kFoldable, // opcode 175 IrOpcode::kBranch, Operator::kKontrol, // opcode
176 "Branch", // name 176 "Branch", // name
177 1, 0, 1, 0, 0, 2, // counts 177 1, 0, 1, 0, 0, 2, // counts
178 kBranchHint) {} // parameter 178 kBranchHint) {} // parameter
179 }; 179 };
180 BranchOperator<BranchHint::kNone> kBranchNoneOperator; 180 BranchOperator<BranchHint::kNone> kBranchNoneOperator;
181 BranchOperator<BranchHint::kTrue> kBranchTrueOperator; 181 BranchOperator<BranchHint::kTrue> kBranchTrueOperator;
182 BranchOperator<BranchHint::kFalse> kBranchFalseOperator; 182 BranchOperator<BranchHint::kFalse> kBranchFalseOperator;
183 183
184 template <size_t kInputCount> 184 template <size_t kInputCount>
185 struct LoopOperator FINAL : public Operator { 185 struct LoopOperator FINAL : public Operator {
186 LoopOperator() 186 LoopOperator()
187 : Operator( // -- 187 : Operator( // --
188 IrOpcode::kLoop, Operator::kFoldable, // opcode 188 IrOpcode::kLoop, Operator::kKontrol, // opcode
189 "Loop", // name 189 "Loop", // name
190 0, 0, kInputCount, 0, 0, 1) {} // counts 190 0, 0, kInputCount, 0, 0, 1) {} // counts
191 }; 191 };
192 #define CACHED_LOOP(input_count) \ 192 #define CACHED_LOOP(input_count) \
193 LoopOperator<input_count> kLoop##input_count##Operator; 193 LoopOperator<input_count> kLoop##input_count##Operator;
194 CACHED_LOOP_LIST(CACHED_LOOP) 194 CACHED_LOOP_LIST(CACHED_LOOP)
195 #undef CACHED_LOOP 195 #undef CACHED_LOOP
196 196
197 template <size_t kInputCount> 197 template <size_t kInputCount>
198 struct MergeOperator FINAL : public Operator { 198 struct MergeOperator FINAL : public Operator {
199 MergeOperator() 199 MergeOperator()
200 : Operator( // -- 200 : Operator( // --
201 IrOpcode::kMerge, Operator::kFoldable, // opcode 201 IrOpcode::kMerge, Operator::kKontrol, // opcode
202 "Merge", // name 202 "Merge", // name
203 0, 0, kInputCount, 0, 0, 1) {} // counts 203 0, 0, kInputCount, 0, 0, 1) {} // counts
204 }; 204 };
205 #define CACHED_MERGE(input_count) \ 205 #define CACHED_MERGE(input_count) \
206 MergeOperator<input_count> kMerge##input_count##Operator; 206 MergeOperator<input_count> kMerge##input_count##Operator;
207 CACHED_MERGE_LIST(CACHED_MERGE) 207 CACHED_MERGE_LIST(CACHED_MERGE)
208 #undef CACHED_MERGE 208 #undef CACHED_MERGE
209 209
210 template <int kIndex> 210 template <int kIndex>
211 struct ParameterOperator FINAL : public Operator1<int> { 211 struct ParameterOperator FINAL : public Operator1<int> {
212 ParameterOperator() 212 ParameterOperator()
213 : Operator1<int>( // -- 213 : Operator1<int>( // --
214 IrOpcode::kParameter, // opcode 214 IrOpcode::kParameter, Operator::kPure, // opcode
215 Operator::kFoldable | Operator::kNoThrow, // flags 215 "Parameter", // name
216 "Parameter", // name 216 1, 0, 0, 1, 0, 0, // counts,
217 1, 0, 0, 1, 0, 0, // counts, 217 kIndex) {} // parameter
218 kIndex) {} // parameter
219 }; 218 };
220 #define CACHED_PARAMETER(index) \ 219 #define CACHED_PARAMETER(index) \
221 ParameterOperator<index> kParameter##index##Operator; 220 ParameterOperator<index> kParameter##index##Operator;
222 CACHED_PARAMETER_LIST(CACHED_PARAMETER) 221 CACHED_PARAMETER_LIST(CACHED_PARAMETER)
223 #undef CACHED_PARAMETER 222 #undef CACHED_PARAMETER
224 }; 223 };
225 224
226 225
227 static base::LazyInstance<CommonOperatorGlobalCache>::type kCache = 226 static base::LazyInstance<CommonOperatorGlobalCache>::type kCache =
228 LAZY_INSTANCE_INITIALIZER; 227 LAZY_INSTANCE_INITIALIZER;
(...skipping 21 matching lines...) Expand all
250 return &cache_.kBranchTrueOperator; 249 return &cache_.kBranchTrueOperator;
251 case BranchHint::kFalse: 250 case BranchHint::kFalse:
252 return &cache_.kBranchFalseOperator; 251 return &cache_.kBranchFalseOperator;
253 } 252 }
254 UNREACHABLE(); 253 UNREACHABLE();
255 return nullptr; 254 return nullptr;
256 } 255 }
257 256
258 257
259 const Operator* CommonOperatorBuilder::Switch(size_t control_output_count) { 258 const Operator* CommonOperatorBuilder::Switch(size_t control_output_count) {
260 DCHECK_GE(control_output_count, 2u); // Disallow trivial switches. 259 DCHECK_GE(control_output_count, 2u); // Disallow trivial switches.
261 return new (zone()) Operator( // -- 260 return new (zone()) Operator( // --
262 IrOpcode::kSwitch, Operator::kFoldable, // opcode 261 IrOpcode::kSwitch, Operator::kKontrol, // opcode
263 "Switch", // name 262 "Switch", // name
264 1, 0, 1, 0, 0, control_output_count); // counts 263 1, 0, 1, 0, 0, control_output_count); // counts
265 } 264 }
266 265
267 266
268 const Operator* CommonOperatorBuilder::Case(size_t index) { 267 const Operator* CommonOperatorBuilder::Case(size_t index) {
269 return new (zone()) Operator1<size_t>( // -- 268 return new (zone()) Operator1<size_t>( // --
270 IrOpcode::kCase, Operator::kFoldable, // opcode 269 IrOpcode::kCase, Operator::kKontrol, // opcode
271 "Case", // name 270 "Case", // name
272 0, 0, 1, 0, 0, 1, // counts 271 0, 0, 1, 0, 0, 1, // counts
273 index); // parameter 272 index); // parameter
274 } 273 }
275 274
276 275
277 const Operator* CommonOperatorBuilder::Start(int num_formal_parameters) { 276 const Operator* CommonOperatorBuilder::Start(int num_formal_parameters) {
278 // Outputs are formal parameters, plus context, receiver, and JSFunction. 277 // Outputs are formal parameters, plus context, receiver, and JSFunction.
279 const int value_output_count = num_formal_parameters + 3; 278 const int value_output_count = num_formal_parameters + 3;
280 return new (zone()) Operator( // -- 279 return new (zone()) Operator( // --
281 IrOpcode::kStart, Operator::kFoldable, // opcode 280 IrOpcode::kStart, Operator::kFoldable, // opcode
282 "Start", // name 281 "Start", // name
283 0, 0, 0, value_output_count, 1, 1); // counts 282 0, 0, 0, value_output_count, 1, 1); // counts
284 } 283 }
285 284
286 285
287 const Operator* CommonOperatorBuilder::Loop(int control_input_count) { 286 const Operator* CommonOperatorBuilder::Loop(int control_input_count) {
288 switch (control_input_count) { 287 switch (control_input_count) {
289 #define CACHED_LOOP(input_count) \ 288 #define CACHED_LOOP(input_count) \
290 case input_count: \ 289 case input_count: \
291 return &cache_.kLoop##input_count##Operator; 290 return &cache_.kLoop##input_count##Operator;
292 CACHED_LOOP_LIST(CACHED_LOOP) 291 CACHED_LOOP_LIST(CACHED_LOOP)
293 #undef CACHED_LOOP 292 #undef CACHED_LOOP
294 default: 293 default:
295 break; 294 break;
296 } 295 }
297 // Uncached. 296 // Uncached.
298 return new (zone()) Operator( // -- 297 return new (zone()) Operator( // --
299 IrOpcode::kLoop, Operator::kFoldable, // opcode 298 IrOpcode::kLoop, Operator::kKontrol, // opcode
300 "Loop", // name 299 "Loop", // name
301 0, 0, control_input_count, 0, 0, 1); // counts 300 0, 0, control_input_count, 0, 0, 1); // counts
302 } 301 }
303 302
304 303
305 const Operator* CommonOperatorBuilder::Merge(int control_input_count) { 304 const Operator* CommonOperatorBuilder::Merge(int control_input_count) {
306 switch (control_input_count) { 305 switch (control_input_count) {
307 #define CACHED_MERGE(input_count) \ 306 #define CACHED_MERGE(input_count) \
308 case input_count: \ 307 case input_count: \
309 return &cache_.kMerge##input_count##Operator; 308 return &cache_.kMerge##input_count##Operator;
310 CACHED_MERGE_LIST(CACHED_MERGE) 309 CACHED_MERGE_LIST(CACHED_MERGE)
311 #undef CACHED_MERGE 310 #undef CACHED_MERGE
312 default: 311 default:
313 break; 312 break;
314 } 313 }
315 // Uncached. 314 // Uncached.
316 return new (zone()) Operator( // -- 315 return new (zone()) Operator( // --
317 IrOpcode::kMerge, Operator::kFoldable, // opcode 316 IrOpcode::kMerge, Operator::kKontrol, // opcode
318 "Merge", // name 317 "Merge", // name
319 0, 0, control_input_count, 0, 0, 1); // counts 318 0, 0, control_input_count, 0, 0, 1); // counts
320 } 319 }
321 320
322 321
323 const Operator* CommonOperatorBuilder::Parameter(int index) { 322 const Operator* CommonOperatorBuilder::Parameter(int index) {
324 switch (index) { 323 switch (index) {
325 #define CACHED_PARAMETER(index) \ 324 #define CACHED_PARAMETER(index) \
326 case index: \ 325 case index: \
327 return &cache_.kParameter##index##Operator; 326 return &cache_.kParameter##index##Operator;
328 CACHED_PARAMETER_LIST(CACHED_PARAMETER) 327 CACHED_PARAMETER_LIST(CACHED_PARAMETER)
329 #undef CACHED_PARAMETER 328 #undef CACHED_PARAMETER
330 default: 329 default:
331 break; 330 break;
332 } 331 }
333 // Uncached. 332 // Uncached.
334 return new (zone()) Operator1<int>( // -- 333 return new (zone()) Operator1<int>( // --
335 IrOpcode::kParameter, // opcode 334 IrOpcode::kParameter, Operator::kPure, // opcode
336 Operator::kFoldable | Operator::kNoThrow, // flags 335 "Parameter", // name
337 "Parameter", // name 336 1, 0, 0, 1, 0, 0, // counts
338 1, 0, 0, 1, 0, 0, // counts 337 index); // parameter
339 index); // parameter
340 } 338 }
341 339
342 340
343 const Operator* CommonOperatorBuilder::OsrValue(int index) { 341 const Operator* CommonOperatorBuilder::OsrValue(int index) {
344 return new (zone()) Operator1<int>( // -- 342 return new (zone()) Operator1<int>( // --
345 IrOpcode::kOsrValue, Operator::kNoProperties, // opcode 343 IrOpcode::kOsrValue, Operator::kNoProperties, // opcode
346 "OsrValue", // name 344 "OsrValue", // name
347 0, 0, 1, 1, 0, 0, // counts 345 0, 0, 1, 1, 0, 0, // counts
348 index); // parameter 346 index); // parameter
349 } 347 }
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 } else { 533 } else {
536 UNREACHABLE(); 534 UNREACHABLE();
537 return nullptr; 535 return nullptr;
538 } 536 }
539 } 537 }
540 538
541 539
542 } // namespace compiler 540 } // namespace compiler
543 } // namespace internal 541 } // namespace internal
544 } // namespace v8 542 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/operator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698