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

Side by Side Diff: src/hydrogen.cc

Issue 8776048: Fix a bug with deoptimization from inside the default-clause of a switch-statement. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 2738 matching lines...) Expand 10 before | Expand all | Expand 10 after
2749 not_string_block = graph()->CreateBasicBlock(); 2749 not_string_block = graph()->CreateBasicBlock();
2750 2750
2751 string_check->SetSuccessorAt(0, first_test_block); 2751 string_check->SetSuccessorAt(0, first_test_block);
2752 string_check->SetSuccessorAt(1, not_string_block); 2752 string_check->SetSuccessorAt(1, not_string_block);
2753 current_block()->Finish(string_check); 2753 current_block()->Finish(string_check);
2754 2754
2755 set_current_block(first_test_block); 2755 set_current_block(first_test_block);
2756 } 2756 }
2757 2757
2758 // 2. Build all the tests, with dangling true branches 2758 // 2. Build all the tests, with dangling true branches
2759 int default_id = AstNode::kNoNumber;
2759 for (int i = 0; i < clause_count; ++i) { 2760 for (int i = 0; i < clause_count; ++i) {
2760 CaseClause* clause = clauses->at(i); 2761 CaseClause* clause = clauses->at(i);
2761 if (clause->is_default()) continue; 2762 if (clause->is_default()) {
2762 2763 default_id = clause->EntryId();
2764 continue;
2765 }
2763 if (switch_type == SMI_SWITCH) { 2766 if (switch_type == SMI_SWITCH) {
2764 clause->RecordTypeFeedback(oracle()); 2767 clause->RecordTypeFeedback(oracle());
2765 } 2768 }
2766 2769
2767 // Generate a compare and branch. 2770 // Generate a compare and branch.
2768 CHECK_ALIVE(VisitForValue(clause->label())); 2771 CHECK_ALIVE(VisitForValue(clause->label()));
2769 HValue* label_value = Pop(); 2772 HValue* label_value = Pop();
2770 2773
2771 HBasicBlock* next_test_block = graph()->CreateBasicBlock(); 2774 HBasicBlock* next_test_block = graph()->CreateBasicBlock();
2772 HBasicBlock* body_block = graph()->CreateBasicBlock(); 2775 HBasicBlock* body_block = graph()->CreateBasicBlock();
(...skipping 26 matching lines...) Expand all
2799 current_block()->Finish(compare); 2802 current_block()->Finish(compare);
2800 2803
2801 set_current_block(next_test_block); 2804 set_current_block(next_test_block);
2802 } 2805 }
2803 2806
2804 // Save the current block to use for the default or to join with the 2807 // Save the current block to use for the default or to join with the
2805 // exit. This block is NULL if we deoptimized. 2808 // exit. This block is NULL if we deoptimized.
2806 HBasicBlock* last_block = current_block(); 2809 HBasicBlock* last_block = current_block();
2807 2810
2808 if (not_string_block != NULL) { 2811 if (not_string_block != NULL) {
2809 last_block = CreateJoin(last_block, not_string_block, stmt->ExitId()); 2812 int join_id = (default_id != AstNode::kNoNumber)
2813 ? default_id
2814 : stmt->ExitId();
2815 last_block = CreateJoin(last_block, not_string_block, join_id);
2810 } 2816 }
2811 2817
2812 // 3. Loop over the clauses and the linked list of tests in lockstep, 2818 // 3. Loop over the clauses and the linked list of tests in lockstep,
2813 // translating the clause bodies. 2819 // translating the clause bodies.
2814 HBasicBlock* curr_test_block = first_test_block; 2820 HBasicBlock* curr_test_block = first_test_block;
2815 HBasicBlock* fall_through_block = NULL; 2821 HBasicBlock* fall_through_block = NULL;
2816 2822
2817 BreakAndContinueInfo break_info(stmt); 2823 BreakAndContinueInfo break_info(stmt);
2818 { BreakAndContinueScope push(&break_info, this); 2824 { BreakAndContinueScope push(&break_info, this);
2819 for (int i = 0; i < clause_count; ++i) { 2825 for (int i = 0; i < clause_count; ++i) {
(...skipping 4401 matching lines...) Expand 10 before | Expand all | Expand 10 after
7221 } 7227 }
7222 } 7228 }
7223 7229
7224 #ifdef DEBUG 7230 #ifdef DEBUG
7225 if (graph_ != NULL) graph_->Verify(false); // No full verify. 7231 if (graph_ != NULL) graph_->Verify(false); // No full verify.
7226 if (allocator_ != NULL) allocator_->Verify(); 7232 if (allocator_ != NULL) allocator_->Verify();
7227 #endif 7233 #endif
7228 } 7234 }
7229 7235
7230 } } // namespace v8::internal 7236 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698