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

Side by Side Diff: src/jump-target.cc

Issue 125045: First round of JumpTarget simplification. Remove dead functions... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « src/jump-target.h ('k') | src/x64/assembler-x64.cc » ('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 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 30 matching lines...) Expand all
41 41
42 42
43 void JumpTarget::Unuse() { 43 void JumpTarget::Unuse() {
44 reaching_frames_.Clear(); 44 reaching_frames_.Clear();
45 merge_labels_.Clear(); 45 merge_labels_.Clear();
46 entry_frame_ = NULL; 46 entry_frame_ = NULL;
47 entry_label_.Unuse(); 47 entry_label_.Unuse();
48 } 48 }
49 49
50 50
51 void JumpTarget::ComputeEntryFrame(int mergable_elements) { 51 void JumpTarget::ComputeEntryFrame() {
52 // Given: a collection of frames reaching by forward CFG edges and 52 // Given: a collection of frames reaching by forward CFG edges and
53 // the directionality of the block. Compute: an entry frame for the 53 // the directionality of the block. Compute: an entry frame for the
54 // block. 54 // block.
55 55
56 Counters::compute_entry_frame.Increment(); 56 Counters::compute_entry_frame.Increment();
57 #ifdef DEBUG 57 #ifdef DEBUG
58 if (compiling_deferred_code_) { 58 if (compiling_deferred_code_) {
59 ASSERT(reaching_frames_.length() > 1); 59 ASSERT(reaching_frames_.length() > 1);
60 VirtualFrame* frame = reaching_frames_[0]; 60 VirtualFrame* frame = reaching_frames_[0];
61 bool all_identical = true; 61 bool all_identical = true;
62 for (int i = 1; i < reaching_frames_.length(); i++) { 62 for (int i = 1; i < reaching_frames_.length(); i++) {
63 if (!frame->Equals(reaching_frames_[i])) { 63 if (!frame->Equals(reaching_frames_[i])) {
64 all_identical = false; 64 all_identical = false;
65 break; 65 break;
66 } 66 }
67 } 67 }
68 ASSERT(!all_identical || all_identical); 68 ASSERT(!all_identical || all_identical);
69 } 69 }
70 #endif 70 #endif
71 71
72 // Choose an initial frame. 72 // Choose an initial frame.
73 VirtualFrame* initial_frame = reaching_frames_[0]; 73 VirtualFrame* initial_frame = reaching_frames_[0];
74 74
75 // A list of pointers to frame elements in the entry frame. NULL 75 // A list of pointers to frame elements in the entry frame. NULL
76 // indicates that the element has not yet been determined. 76 // indicates that the element has not yet been determined.
77 int length = initial_frame->element_count(); 77 int length = initial_frame->element_count();
78 ZoneList<FrameElement*> elements(length); 78 ZoneList<FrameElement*> elements(length);
79 79
80 // Convert the number of mergable elements (counted from the top
81 // down) to a frame high-water mark (counted from the bottom up).
82 // Elements strictly above the high-water index will be mergable in
83 // entry frames for bidirectional jump targets.
84 int high_water_mark = (mergable_elements == kAllElements)
85 ? VirtualFrame::kIllegalIndex // All frame indices are above this.
86 : length - mergable_elements - 1; // Top index if m_e == 0.
87
88 // Initially populate the list of elements based on the initial 80 // Initially populate the list of elements based on the initial
89 // frame. 81 // frame.
90 for (int i = 0; i < length; i++) { 82 for (int i = 0; i < length; i++) {
91 FrameElement element = initial_frame->elements_[i]; 83 FrameElement element = initial_frame->elements_[i];
92 // We do not allow copies or constants in bidirectional frames. All 84 // We do not allow copies or constants in bidirectional frames. All
93 // elements above the water mark on bidirectional frames have 85 // elements above the water mark on bidirectional frames have
94 // unknown static types. 86 // unknown static types.
95 if (direction_ == BIDIRECTIONAL && i > high_water_mark) { 87 if (direction_ == BIDIRECTIONAL) {
96 if (element.is_constant() || element.is_copy()) { 88 if (element.is_constant() || element.is_copy()) {
97 elements.Add(NULL); 89 elements.Add(NULL);
98 continue; 90 continue;
99 } 91 }
100 // It's safe to change the static type on the initial frame 92 // It's safe to change the static type on the initial frame
101 // element, see comment in JumpTarget::Combine. 93 // element, see comment in JumpTarget::Combine.
102 initial_frame->elements_[i].set_static_type(StaticType::unknown()); 94 initial_frame->elements_[i].set_static_type(StaticType::unknown());
103 } 95 }
104 elements.Add(&initial_frame->elements_[i]); 96 elements.Add(&initial_frame->elements_[i]);
105 } 97 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 if (elements[i] == NULL) { 143 if (elements[i] == NULL) {
152 // Loop over all the reaching frames to check whether the element 144 // Loop over all the reaching frames to check whether the element
153 // is synced on all frames, to count the registers it occupies, 145 // is synced on all frames, to count the registers it occupies,
154 // and to compute a merged static type. 146 // and to compute a merged static type.
155 bool is_synced = true; 147 bool is_synced = true;
156 RegisterFile candidate_registers; 148 RegisterFile candidate_registers;
157 int best_count = kMinInt; 149 int best_count = kMinInt;
158 int best_reg_num = RegisterAllocator::kInvalidRegister; 150 int best_reg_num = RegisterAllocator::kInvalidRegister;
159 151
160 StaticType type; // Initially invalid. 152 StaticType type; // Initially invalid.
161 if (direction_ != BIDIRECTIONAL || i < high_water_mark) { 153 if (direction_ != BIDIRECTIONAL) {
162 type = reaching_frames_[0]->elements_[i].static_type(); 154 type = reaching_frames_[0]->elements_[i].static_type();
163 } 155 }
164 156
165 for (int j = 0; j < reaching_frames_.length(); j++) { 157 for (int j = 0; j < reaching_frames_.length(); j++) {
166 FrameElement element = reaching_frames_[j]->elements_[i]; 158 FrameElement element = reaching_frames_[j]->elements_[i];
167 is_synced = is_synced && element.is_synced(); 159 is_synced = is_synced && element.is_synced();
168 if (element.is_register() && !entry_frame_->is_used(element.reg())) { 160 if (element.is_register() && !entry_frame_->is_used(element.reg())) {
169 // Count the register occurrence and remember it if better 161 // Count the register occurrence and remember it if better
170 // than the previous best. 162 // than the previous best.
171 int num = RegisterAllocator::ToNumber(element.reg()); 163 int num = RegisterAllocator::ToNumber(element.reg());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 226
235 227
236 void JumpTarget::Jump(Result* arg) { 228 void JumpTarget::Jump(Result* arg) {
237 ASSERT(cgen()->has_valid_frame()); 229 ASSERT(cgen()->has_valid_frame());
238 230
239 cgen()->frame()->Push(arg); 231 cgen()->frame()->Push(arg);
240 DoJump(); 232 DoJump();
241 } 233 }
242 234
243 235
244 void JumpTarget::Jump(Result* arg0, Result* arg1) {
245 ASSERT(cgen()->has_valid_frame());
246
247 cgen()->frame()->Push(arg0);
248 cgen()->frame()->Push(arg1);
249 DoJump();
250 }
251
252
253 void JumpTarget::Jump(Result* arg0, Result* arg1, Result* arg2) {
254 ASSERT(cgen()->has_valid_frame());
255
256 cgen()->frame()->Push(arg0);
257 cgen()->frame()->Push(arg1);
258 cgen()->frame()->Push(arg2);
259 DoJump();
260 }
261
262
263 void JumpTarget::Branch(Condition cc, Hint hint) { 236 void JumpTarget::Branch(Condition cc, Hint hint) {
264 DoBranch(cc, hint); 237 DoBranch(cc, hint);
265 } 238 }
266 239
267 240
268 #ifdef DEBUG 241 #ifdef DEBUG
269 #define DECLARE_ARGCHECK_VARS(name) \ 242 #define DECLARE_ARGCHECK_VARS(name) \
270 Result::Type name##_type = name->type(); \ 243 Result::Type name##_type = name->type(); \
271 Register name##_reg = name->is_register() ? name->reg() : no_reg 244 Register name##_reg = name->is_register() ? name->reg() : no_reg
272 245
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 cgen()->frame()->Push(arg1); 280 cgen()->frame()->Push(arg1);
308 DoBranch(cc, hint); 281 DoBranch(cc, hint);
309 *arg1 = cgen()->frame()->Pop(); 282 *arg1 = cgen()->frame()->Pop();
310 *arg0 = cgen()->frame()->Pop(); 283 *arg0 = cgen()->frame()->Pop();
311 284
312 ASSERT_ARGCHECK(arg0); 285 ASSERT_ARGCHECK(arg0);
313 ASSERT_ARGCHECK(arg1); 286 ASSERT_ARGCHECK(arg1);
314 } 287 }
315 288
316 289
317 void JumpTarget::Branch(Condition cc,
318 Result* arg0,
319 Result* arg1,
320 Result* arg2,
321 Hint hint) {
322 ASSERT(cgen()->frame() != NULL);
323
324 // We want to check that non-frame registers at the call site stay in
325 // the same registers on the fall-through branch.
326 DECLARE_ARGCHECK_VARS(arg0);
327 DECLARE_ARGCHECK_VARS(arg1);
328 DECLARE_ARGCHECK_VARS(arg2);
329
330 cgen()->frame()->Push(arg0);
331 cgen()->frame()->Push(arg1);
332 cgen()->frame()->Push(arg2);
333 DoBranch(cc, hint);
334 *arg2 = cgen()->frame()->Pop();
335 *arg1 = cgen()->frame()->Pop();
336 *arg0 = cgen()->frame()->Pop();
337
338 ASSERT_ARGCHECK(arg0);
339 ASSERT_ARGCHECK(arg1);
340 ASSERT_ARGCHECK(arg2);
341 }
342
343
344 void JumpTarget::Branch(Condition cc,
345 Result* arg0,
346 Result* arg1,
347 Result* arg2,
348 Result* arg3,
349 Hint hint) {
350 ASSERT(cgen()->frame() != NULL);
351
352 // We want to check that non-frame registers at the call site stay in
353 // the same registers on the fall-through branch.
354 DECLARE_ARGCHECK_VARS(arg0);
355 DECLARE_ARGCHECK_VARS(arg1);
356 DECLARE_ARGCHECK_VARS(arg2);
357 DECLARE_ARGCHECK_VARS(arg3);
358
359 cgen()->frame()->Push(arg0);
360 cgen()->frame()->Push(arg1);
361 cgen()->frame()->Push(arg2);
362 cgen()->frame()->Push(arg3);
363 DoBranch(cc, hint);
364 *arg3 = cgen()->frame()->Pop();
365 *arg2 = cgen()->frame()->Pop();
366 *arg1 = cgen()->frame()->Pop();
367 *arg0 = cgen()->frame()->Pop();
368
369 ASSERT_ARGCHECK(arg0);
370 ASSERT_ARGCHECK(arg1);
371 ASSERT_ARGCHECK(arg2);
372 ASSERT_ARGCHECK(arg3);
373 }
374
375
376 void BreakTarget::Branch(Condition cc, Result* arg, Hint hint) { 290 void BreakTarget::Branch(Condition cc, Result* arg, Hint hint) {
377 ASSERT(cgen()->has_valid_frame()); 291 ASSERT(cgen()->has_valid_frame());
378 292
379 int count = cgen()->frame()->height() - expected_height_; 293 int count = cgen()->frame()->height() - expected_height_;
380 if (count > 0) { 294 if (count > 0) {
381 // We negate and branch here rather than using DoBranch's negate 295 // We negate and branch here rather than using DoBranch's negate
382 // and branch. This gives us a hook to remove statement state 296 // and branch. This gives us a hook to remove statement state
383 // from the frame. 297 // from the frame.
384 JumpTarget fall_through; 298 JumpTarget fall_through;
385 // Branch to fall through will not negate, because it is a 299 // Branch to fall through will not negate, because it is a
386 // forward-only target. 300 // forward-only target.
387 fall_through.Branch(NegateCondition(cc), NegateHint(hint)); 301 fall_through.Branch(NegateCondition(cc), NegateHint(hint));
388 Jump(arg); // May emit merge code here. 302 Jump(arg); // May emit merge code here.
389 fall_through.Bind(); 303 fall_through.Bind();
390 } else { 304 } else {
391 DECLARE_ARGCHECK_VARS(arg); 305 DECLARE_ARGCHECK_VARS(arg);
392 cgen()->frame()->Push(arg); 306 cgen()->frame()->Push(arg);
393 DoBranch(cc, hint); 307 DoBranch(cc, hint);
394 *arg = cgen()->frame()->Pop(); 308 *arg = cgen()->frame()->Pop();
395 ASSERT_ARGCHECK(arg); 309 ASSERT_ARGCHECK(arg);
396 } 310 }
397 } 311 }
398 312
399 #undef DECLARE_ARGCHECK_VARS 313 #undef DECLARE_ARGCHECK_VARS
400 #undef ASSERT_ARGCHECK 314 #undef ASSERT_ARGCHECK
401 315
402 316
403 void JumpTarget::Bind(int mergable_elements) { 317 void JumpTarget::Bind() {
404 DoBind(mergable_elements); 318 DoBind();
405 } 319 }
406 320
407 321
408 void JumpTarget::Bind(Result* arg, int mergable_elements) { 322 void JumpTarget::Bind(Result* arg) {
409 if (cgen()->has_valid_frame()) { 323 if (cgen()->has_valid_frame()) {
410 cgen()->frame()->Push(arg); 324 cgen()->frame()->Push(arg);
411 } 325 }
412 DoBind(mergable_elements); 326 DoBind();
413 *arg = cgen()->frame()->Pop(); 327 *arg = cgen()->frame()->Pop();
414 } 328 }
415 329
416 330
417 void JumpTarget::Bind(Result* arg0, Result* arg1, int mergable_elements) { 331 void JumpTarget::Bind(Result* arg0, Result* arg1) {
418 if (cgen()->has_valid_frame()) { 332 if (cgen()->has_valid_frame()) {
419 cgen()->frame()->Push(arg0); 333 cgen()->frame()->Push(arg0);
420 cgen()->frame()->Push(arg1); 334 cgen()->frame()->Push(arg1);
421 } 335 }
422 DoBind(mergable_elements); 336 DoBind();
423 *arg1 = cgen()->frame()->Pop();
424 *arg0 = cgen()->frame()->Pop();
425 }
426
427
428 void JumpTarget::Bind(Result* arg0,
429 Result* arg1,
430 Result* arg2,
431 int mergable_elements) {
432 if (cgen()->has_valid_frame()) {
433 cgen()->frame()->Push(arg0);
434 cgen()->frame()->Push(arg1);
435 cgen()->frame()->Push(arg2);
436 }
437 DoBind(mergable_elements);
438 *arg2 = cgen()->frame()->Pop();
439 *arg1 = cgen()->frame()->Pop();
440 *arg0 = cgen()->frame()->Pop();
441 }
442
443
444 void JumpTarget::Bind(Result* arg0,
445 Result* arg1,
446 Result* arg2,
447 Result* arg3,
448 int mergable_elements) {
449 if (cgen()->has_valid_frame()) {
450 cgen()->frame()->Push(arg0);
451 cgen()->frame()->Push(arg1);
452 cgen()->frame()->Push(arg2);
453 cgen()->frame()->Push(arg3);
454 }
455 DoBind(mergable_elements);
456 *arg3 = cgen()->frame()->Pop();
457 *arg2 = cgen()->frame()->Pop();
458 *arg1 = cgen()->frame()->Pop(); 337 *arg1 = cgen()->frame()->Pop();
459 *arg0 = cgen()->frame()->Pop(); 338 *arg0 = cgen()->frame()->Pop();
460 } 339 }
461 340
462 341
463 void JumpTarget::AddReachingFrame(VirtualFrame* frame) { 342 void JumpTarget::AddReachingFrame(VirtualFrame* frame) {
464 ASSERT(reaching_frames_.length() == merge_labels_.length()); 343 ASSERT(reaching_frames_.length() == merge_labels_.length());
465 ASSERT(entry_frame_ == NULL); 344 ASSERT(entry_frame_ == NULL);
466 Label fresh; 345 Label fresh;
467 merge_labels_.Add(fresh); 346 merge_labels_.Add(fresh);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 // forward-only target. 403 // forward-only target.
525 fall_through.Branch(NegateCondition(cc), NegateHint(hint)); 404 fall_through.Branch(NegateCondition(cc), NegateHint(hint));
526 Jump(); // May emit merge code here. 405 Jump(); // May emit merge code here.
527 fall_through.Bind(); 406 fall_through.Bind();
528 } else { 407 } else {
529 DoBranch(cc, hint); 408 DoBranch(cc, hint);
530 } 409 }
531 } 410 }
532 411
533 412
534 void BreakTarget::Bind(int mergable_elements) { 413 void BreakTarget::Bind() {
535 #ifdef DEBUG 414 #ifdef DEBUG
536 // All the forward-reaching frames should have been adjusted at the 415 // All the forward-reaching frames should have been adjusted at the
537 // jumps to this target. 416 // jumps to this target.
538 for (int i = 0; i < reaching_frames_.length(); i++) { 417 for (int i = 0; i < reaching_frames_.length(); i++) {
539 ASSERT(reaching_frames_[i] == NULL || 418 ASSERT(reaching_frames_[i] == NULL ||
540 reaching_frames_[i]->height() == expected_height_); 419 reaching_frames_[i]->height() == expected_height_);
541 } 420 }
542 #endif 421 #endif
543 // Drop leftover statement state from the frame before merging, even 422 // Drop leftover statement state from the frame before merging, even
544 // on the fall through. This is so we can bind the return target 423 // on the fall through. This is so we can bind the return target
545 // with state on the frame. 424 // with state on the frame.
546 if (cgen()->has_valid_frame()) { 425 if (cgen()->has_valid_frame()) {
547 int count = cgen()->frame()->height() - expected_height_; 426 int count = cgen()->frame()->height() - expected_height_;
548 cgen()->frame()->ForgetElements(count); 427 cgen()->frame()->ForgetElements(count);
549 } 428 }
550 DoBind(mergable_elements); 429 DoBind();
551 } 430 }
552 431
553 432
554 void BreakTarget::Bind(Result* arg, int mergable_elements) { 433 void BreakTarget::Bind(Result* arg) {
555 #ifdef DEBUG 434 #ifdef DEBUG
556 // All the forward-reaching frames should have been adjusted at the 435 // All the forward-reaching frames should have been adjusted at the
557 // jumps to this target. 436 // jumps to this target.
558 for (int i = 0; i < reaching_frames_.length(); i++) { 437 for (int i = 0; i < reaching_frames_.length(); i++) {
559 ASSERT(reaching_frames_[i] == NULL || 438 ASSERT(reaching_frames_[i] == NULL ||
560 reaching_frames_[i]->height() == expected_height_ + 1); 439 reaching_frames_[i]->height() == expected_height_ + 1);
561 } 440 }
562 #endif 441 #endif
563 // Drop leftover statement state from the frame before merging, even 442 // Drop leftover statement state from the frame before merging, even
564 // on the fall through. This is so we can bind the return target 443 // on the fall through. This is so we can bind the return target
565 // with state on the frame. 444 // with state on the frame.
566 if (cgen()->has_valid_frame()) { 445 if (cgen()->has_valid_frame()) {
567 int count = cgen()->frame()->height() - expected_height_; 446 int count = cgen()->frame()->height() - expected_height_;
568 cgen()->frame()->ForgetElements(count); 447 cgen()->frame()->ForgetElements(count);
569 cgen()->frame()->Push(arg); 448 cgen()->frame()->Push(arg);
570 } 449 }
571 DoBind(mergable_elements); 450 DoBind();
572 *arg = cgen()->frame()->Pop(); 451 *arg = cgen()->frame()->Pop();
573 } 452 }
574 453
575 454
576 // ------------------------------------------------------------------------- 455 // -------------------------------------------------------------------------
577 // ShadowTarget implementation. 456 // ShadowTarget implementation.
578 457
579 ShadowTarget::ShadowTarget(BreakTarget* shadowed) { 458 ShadowTarget::ShadowTarget(BreakTarget* shadowed) {
580 ASSERT(shadowed != NULL); 459 ASSERT(shadowed != NULL);
581 other_target_ = shadowed; 460 other_target_ = shadowed;
(...skipping 22 matching lines...) Expand all
604 temp.CopyTo(this); 483 temp.CopyTo(this);
605 temp.Unuse(); 484 temp.Unuse();
606 485
607 #ifdef DEBUG 486 #ifdef DEBUG
608 is_shadowing_ = false; 487 is_shadowing_ = false;
609 #endif 488 #endif
610 } 489 }
611 490
612 491
613 } } // namespace v8::internal 492 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/jump-target.h ('k') | src/x64/assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698