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

Side by Side Diff: src/hydrogen.cc

Issue 12226112: Infrastructure classes for evaluating numeric relations between values. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed last comments. Created 7 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 | Annotate | Revision Log
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 dominator_(NULL), 64 dominator_(NULL),
65 dominated_blocks_(4, graph->zone()), 65 dominated_blocks_(4, graph->zone()),
66 last_environment_(NULL), 66 last_environment_(NULL),
67 argument_count_(-1), 67 argument_count_(-1),
68 first_instruction_index_(-1), 68 first_instruction_index_(-1),
69 last_instruction_index_(-1), 69 last_instruction_index_(-1),
70 deleted_phis_(4, graph->zone()), 70 deleted_phis_(4, graph->zone()),
71 parent_loop_header_(NULL), 71 parent_loop_header_(NULL),
72 is_inline_return_target_(false), 72 is_inline_return_target_(false),
73 is_deoptimizing_(false), 73 is_deoptimizing_(false),
74 dominates_loop_successors_(false) { } 74 dominates_loop_successors_(false),
75 is_osr_entry_(false) { }
75 76
76 77
77 void HBasicBlock::AttachLoopInformation() { 78 void HBasicBlock::AttachLoopInformation() {
78 ASSERT(!IsLoopHeader()); 79 ASSERT(!IsLoopHeader());
79 loop_information_ = new(zone()) HLoopInformation(this, zone()); 80 loop_information_ = new(zone()) HLoopInformation(this, zone());
80 } 81 }
81 82
82 83
83 void HBasicBlock::DetachLoopInformation() { 84 void HBasicBlock::DetachLoopInformation() {
84 ASSERT(IsLoopHeader()); 85 ASSERT(IsLoopHeader());
(...skipping 3701 matching lines...) Expand 10 before | Expand all | Expand 10 after
3786 } 3787 }
3787 } 3788 }
3788 } 3789 }
3789 3790
3790 3791
3791 bool HGraph::Optimize(SmartArrayPointer<char>* bailout_reason) { 3792 bool HGraph::Optimize(SmartArrayPointer<char>* bailout_reason) {
3792 *bailout_reason = SmartArrayPointer<char>(); 3793 *bailout_reason = SmartArrayPointer<char>();
3793 OrderBlocks(); 3794 OrderBlocks();
3794 AssignDominators(); 3795 AssignDominators();
3795 3796
3797 // We need to create a HConstant "zero" now so that GVN will fold every
3798 // zero-valued constant in the graph together.
3799 // The constant is needed to make idef-based bounds check work: the pass
3800 // evaluates relations with "zero" and that zero cannot be created after GVN.
3801 GetConstant0();
3802
3796 #ifdef DEBUG 3803 #ifdef DEBUG
3797 // Do a full verify after building the graph and computing dominators. 3804 // Do a full verify after building the graph and computing dominators.
3798 Verify(true); 3805 Verify(true);
3799 #endif 3806 #endif
3800 3807
3801 PropagateDeoptimizingMark(); 3808 PropagateDeoptimizingMark();
3802 if (!CheckConstPhiUses()) { 3809 if (!CheckConstPhiUses()) {
3803 *bailout_reason = SmartArrayPointer<char>(StrDup( 3810 *bailout_reason = SmartArrayPointer<char>(StrDup(
3804 "Unsupported phi use of const variable")); 3811 "Unsupported phi use of const variable"));
3805 return false; 3812 return false;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3863 RestoreActualValues(); 3870 RestoreActualValues();
3864 3871
3865 return true; 3872 return true;
3866 } 3873 }
3867 3874
3868 3875
3869 void HGraph::SetupInformativeDefinitionsInBlock(HBasicBlock* block) { 3876 void HGraph::SetupInformativeDefinitionsInBlock(HBasicBlock* block) {
3870 for (int phi_index = 0; phi_index < block->phis()->length(); phi_index++) { 3877 for (int phi_index = 0; phi_index < block->phis()->length(); phi_index++) {
3871 HPhi* phi = block->phis()->at(phi_index); 3878 HPhi* phi = block->phis()->at(phi_index);
3872 phi->AddInformativeDefinitions(); 3879 phi->AddInformativeDefinitions();
3880 phi->SetFlag(HValue::kIDefsProcessingDone);
3873 // We do not support phis that "redefine just one operand". 3881 // We do not support phis that "redefine just one operand".
3874 ASSERT(!phi->IsInformativeDefinition()); 3882 ASSERT(!phi->IsInformativeDefinition());
3875 } 3883 }
3876 3884
3877 for (HInstruction* i = block->first(); i != NULL; i = i->next()) { 3885 for (HInstruction* i = block->first(); i != NULL; i = i->next()) {
3878 i->AddInformativeDefinitions(); 3886 i->AddInformativeDefinitions();
3887 i->SetFlag(HValue::kIDefsProcessingDone);
3879 i->UpdateRedefinedUsesWhileSettingUpInformativeDefinitions(); 3888 i->UpdateRedefinedUsesWhileSettingUpInformativeDefinitions();
3880 } 3889 }
3881 } 3890 }
3882 3891
3883 3892
3884 // This method is recursive, so if its stack frame is large it could 3893 // This method is recursive, so if its stack frame is large it could
3885 // cause a stack overflow. 3894 // cause a stack overflow.
3886 // To keep the individual stack frames small we do the actual work inside 3895 // To keep the individual stack frames small we do the actual work inside
3887 // SetupInformativeDefinitionsInBlock(); 3896 // SetupInformativeDefinitionsInBlock();
3888 void HGraph::SetupInformativeDefinitionsRecursively(HBasicBlock* block) { 3897 void HGraph::SetupInformativeDefinitionsRecursively(HBasicBlock* block) {
(...skipping 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after
4889 HBasicBlock* non_osr_entry = graph()->CreateBasicBlock(); 4898 HBasicBlock* non_osr_entry = graph()->CreateBasicBlock();
4890 HBasicBlock* osr_entry = graph()->CreateBasicBlock(); 4899 HBasicBlock* osr_entry = graph()->CreateBasicBlock();
4891 HValue* true_value = graph()->GetConstantTrue(); 4900 HValue* true_value = graph()->GetConstantTrue();
4892 HBranch* test = new(zone()) HBranch(true_value, non_osr_entry, osr_entry); 4901 HBranch* test = new(zone()) HBranch(true_value, non_osr_entry, osr_entry);
4893 current_block()->Finish(test); 4902 current_block()->Finish(test);
4894 4903
4895 HBasicBlock* loop_predecessor = graph()->CreateBasicBlock(); 4904 HBasicBlock* loop_predecessor = graph()->CreateBasicBlock();
4896 non_osr_entry->Goto(loop_predecessor); 4905 non_osr_entry->Goto(loop_predecessor);
4897 4906
4898 set_current_block(osr_entry); 4907 set_current_block(osr_entry);
4908 osr_entry->set_osr_entry();
4899 BailoutId osr_entry_id = statement->OsrEntryId(); 4909 BailoutId osr_entry_id = statement->OsrEntryId();
4900 int first_expression_index = environment()->first_expression_index(); 4910 int first_expression_index = environment()->first_expression_index();
4901 int length = environment()->length(); 4911 int length = environment()->length();
4902 ZoneList<HUnknownOSRValue*>* osr_values = 4912 ZoneList<HUnknownOSRValue*>* osr_values =
4903 new(zone()) ZoneList<HUnknownOSRValue*>(length, zone()); 4913 new(zone()) ZoneList<HUnknownOSRValue*>(length, zone());
4904 4914
4905 for (int i = 0; i < first_expression_index; ++i) { 4915 for (int i = 0; i < first_expression_index; ++i) {
4906 HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue; 4916 HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue;
4907 AddInstruction(osr_value); 4917 AddInstruction(osr_value);
4908 environment()->Bind(i, osr_value); 4918 environment()->Bind(i, osr_value);
(...skipping 5721 matching lines...) Expand 10 before | Expand all | Expand 10 after
10630 } 10640 }
10631 } 10641 }
10632 10642
10633 #ifdef DEBUG 10643 #ifdef DEBUG
10634 if (graph_ != NULL) graph_->Verify(false); // No full verify. 10644 if (graph_ != NULL) graph_->Verify(false); // No full verify.
10635 if (allocator_ != NULL) allocator_->Verify(); 10645 if (allocator_ != NULL) allocator_->Verify();
10636 #endif 10646 #endif
10637 } 10647 }
10638 10648
10639 } } // namespace v8::internal 10649 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698