| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 21 matching lines...) Expand all Loading... |
| 32 #include "v8.h" | 32 #include "v8.h" |
| 33 #include "codegen.h" | 33 #include "codegen.h" |
| 34 #include "full-codegen.h" | 34 #include "full-codegen.h" |
| 35 #include "hashmap.h" | 35 #include "hashmap.h" |
| 36 #include "hydrogen-bce.h" | 36 #include "hydrogen-bce.h" |
| 37 #include "hydrogen-bch.h" | 37 #include "hydrogen-bch.h" |
| 38 #include "hydrogen-canonicalize.h" | 38 #include "hydrogen-canonicalize.h" |
| 39 #include "hydrogen-check-elimination.h" | 39 #include "hydrogen-check-elimination.h" |
| 40 #include "hydrogen-dce.h" | 40 #include "hydrogen-dce.h" |
| 41 #include "hydrogen-dehoist.h" | 41 #include "hydrogen-dehoist.h" |
| 42 #include "hydrogen-deoptimizing-mark.h" | |
| 43 #include "hydrogen-environment-liveness.h" | 42 #include "hydrogen-environment-liveness.h" |
| 44 #include "hydrogen-escape-analysis.h" | 43 #include "hydrogen-escape-analysis.h" |
| 45 #include "hydrogen-infer-representation.h" | 44 #include "hydrogen-infer-representation.h" |
| 46 #include "hydrogen-infer-types.h" | 45 #include "hydrogen-infer-types.h" |
| 47 #include "hydrogen-load-elimination.h" | 46 #include "hydrogen-load-elimination.h" |
| 48 #include "hydrogen-gvn.h" | 47 #include "hydrogen-gvn.h" |
| 49 #include "hydrogen-mark-deoptimize.h" | 48 #include "hydrogen-mark-deoptimize.h" |
| 49 #include "hydrogen-mark-unreachable.h" |
| 50 #include "hydrogen-minus-zero.h" | 50 #include "hydrogen-minus-zero.h" |
| 51 #include "hydrogen-osr.h" | 51 #include "hydrogen-osr.h" |
| 52 #include "hydrogen-range-analysis.h" | 52 #include "hydrogen-range-analysis.h" |
| 53 #include "hydrogen-redundant-phi.h" | 53 #include "hydrogen-redundant-phi.h" |
| 54 #include "hydrogen-removable-simulates.h" | 54 #include "hydrogen-removable-simulates.h" |
| 55 #include "hydrogen-representation-changes.h" | 55 #include "hydrogen-representation-changes.h" |
| 56 #include "hydrogen-sce.h" | 56 #include "hydrogen-sce.h" |
| 57 #include "hydrogen-uint32-analysis.h" | 57 #include "hydrogen-uint32-analysis.h" |
| 58 #include "lithium-allocator.h" | 58 #include "lithium-allocator.h" |
| 59 #include "parser.h" | 59 #include "parser.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 89 dominator_(NULL), | 89 dominator_(NULL), |
| 90 dominated_blocks_(4, graph->zone()), | 90 dominated_blocks_(4, graph->zone()), |
| 91 last_environment_(NULL), | 91 last_environment_(NULL), |
| 92 argument_count_(-1), | 92 argument_count_(-1), |
| 93 first_instruction_index_(-1), | 93 first_instruction_index_(-1), |
| 94 last_instruction_index_(-1), | 94 last_instruction_index_(-1), |
| 95 deleted_phis_(4, graph->zone()), | 95 deleted_phis_(4, graph->zone()), |
| 96 parent_loop_header_(NULL), | 96 parent_loop_header_(NULL), |
| 97 inlined_entry_block_(NULL), | 97 inlined_entry_block_(NULL), |
| 98 is_inline_return_target_(false), | 98 is_inline_return_target_(false), |
| 99 is_deoptimizing_(false), | 99 is_reachable_(true), |
| 100 dominates_loop_successors_(false), | 100 dominates_loop_successors_(false), |
| 101 is_osr_entry_(false) { } | 101 is_osr_entry_(false) { } |
| 102 | 102 |
| 103 | 103 |
| 104 Isolate* HBasicBlock::isolate() const { | 104 Isolate* HBasicBlock::isolate() const { |
| 105 return graph_->isolate(); | 105 return graph_->isolate(); |
| 106 } | 106 } |
| 107 | 107 |
| 108 | 108 |
| 109 void HBasicBlock::MarkUnreachable() { |
| 110 is_reachable_ = false; |
| 111 } |
| 112 |
| 113 |
| 109 void HBasicBlock::AttachLoopInformation() { | 114 void HBasicBlock::AttachLoopInformation() { |
| 110 ASSERT(!IsLoopHeader()); | 115 ASSERT(!IsLoopHeader()); |
| 111 loop_information_ = new(zone()) HLoopInformation(this, zone()); | 116 loop_information_ = new(zone()) HLoopInformation(this, zone()); |
| 112 } | 117 } |
| 113 | 118 |
| 114 | 119 |
| 115 void HBasicBlock::DetachLoopInformation() { | 120 void HBasicBlock::DetachLoopInformation() { |
| 116 ASSERT(IsLoopHeader()); | 121 ASSERT(IsLoopHeader()); |
| 117 loop_information_ = NULL; | 122 loop_information_ = NULL; |
| 118 } | 123 } |
| (...skipping 2157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2276 entry_block_(NULL), | 2281 entry_block_(NULL), |
| 2277 blocks_(8, info->zone()), | 2282 blocks_(8, info->zone()), |
| 2278 values_(16, info->zone()), | 2283 values_(16, info->zone()), |
| 2279 phi_list_(NULL), | 2284 phi_list_(NULL), |
| 2280 uint32_instructions_(NULL), | 2285 uint32_instructions_(NULL), |
| 2281 osr_(NULL), | 2286 osr_(NULL), |
| 2282 info_(info), | 2287 info_(info), |
| 2283 zone_(info->zone()), | 2288 zone_(info->zone()), |
| 2284 is_recursive_(false), | 2289 is_recursive_(false), |
| 2285 use_optimistic_licm_(false), | 2290 use_optimistic_licm_(false), |
| 2286 has_soft_deoptimize_(false), | |
| 2287 depends_on_empty_array_proto_elements_(false), | 2291 depends_on_empty_array_proto_elements_(false), |
| 2288 type_change_checksum_(0), | 2292 type_change_checksum_(0), |
| 2289 maximum_environment_size_(0), | 2293 maximum_environment_size_(0), |
| 2290 no_side_effects_scope_count_(0) { | 2294 no_side_effects_scope_count_(0) { |
| 2291 if (info->IsStub()) { | 2295 if (info->IsStub()) { |
| 2292 HydrogenCodeStub* stub = info->code_stub(); | 2296 HydrogenCodeStub* stub = info->code_stub(); |
| 2293 CodeStubInterfaceDescriptor* descriptor = | 2297 CodeStubInterfaceDescriptor* descriptor = |
| 2294 stub->GetInterfaceDescriptor(isolate_); | 2298 stub->GetInterfaceDescriptor(isolate_); |
| 2295 start_environment_ = | 2299 start_environment_ = |
| 2296 new(zone_) HEnvironment(zone_, descriptor->environment_length()); | 2300 new(zone_) HEnvironment(zone_, descriptor->environment_length()); |
| (...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3123 | 3127 |
| 3124 #ifdef DEBUG | 3128 #ifdef DEBUG |
| 3125 // Do a full verify after building the graph and computing dominators. | 3129 // Do a full verify after building the graph and computing dominators. |
| 3126 Verify(true); | 3130 Verify(true); |
| 3127 #endif | 3131 #endif |
| 3128 | 3132 |
| 3129 if (FLAG_analyze_environment_liveness && maximum_environment_size() != 0) { | 3133 if (FLAG_analyze_environment_liveness && maximum_environment_size() != 0) { |
| 3130 Run<HEnvironmentLivenessAnalysisPhase>(); | 3134 Run<HEnvironmentLivenessAnalysisPhase>(); |
| 3131 } | 3135 } |
| 3132 | 3136 |
| 3133 Run<HPropagateDeoptimizingMarkPhase>(); | |
| 3134 if (!CheckConstPhiUses()) { | 3137 if (!CheckConstPhiUses()) { |
| 3135 *bailout_reason = kUnsupportedPhiUseOfConstVariable; | 3138 *bailout_reason = kUnsupportedPhiUseOfConstVariable; |
| 3136 return false; | 3139 return false; |
| 3137 } | 3140 } |
| 3138 Run<HRedundantPhiEliminationPhase>(); | 3141 Run<HRedundantPhiEliminationPhase>(); |
| 3139 if (!CheckArgumentsPhiUses()) { | 3142 if (!CheckArgumentsPhiUses()) { |
| 3140 *bailout_reason = kUnsupportedPhiUseOfArguments; | 3143 *bailout_reason = kUnsupportedPhiUseOfArguments; |
| 3141 return false; | 3144 return false; |
| 3142 } | 3145 } |
| 3143 | 3146 |
| 3147 // Find and mark unreachable code to simplify optimizations, especially gvn, |
| 3148 // where unreachable code could unnecessarily defeat LICM. |
| 3149 Run<HMarkUnreachableBlocksPhase>(); |
| 3150 |
| 3144 if (FLAG_check_elimination) Run<HCheckEliminationPhase>(); | 3151 if (FLAG_check_elimination) Run<HCheckEliminationPhase>(); |
| 3145 if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>(); | 3152 if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>(); |
| 3146 if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>(); | 3153 if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>(); |
| 3147 | 3154 |
| 3148 if (FLAG_load_elimination) Run<HLoadEliminationPhase>(); | 3155 if (FLAG_load_elimination) Run<HLoadEliminationPhase>(); |
| 3149 | 3156 |
| 3150 CollectPhis(); | 3157 CollectPhis(); |
| 3151 | 3158 |
| 3152 if (has_osr()) osr()->FinishOsrValues(); | 3159 if (has_osr()) osr()->FinishOsrValues(); |
| 3153 | 3160 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 3180 // Eliminate redundant stack checks on backwards branches. | 3187 // Eliminate redundant stack checks on backwards branches. |
| 3181 Run<HStackCheckEliminationPhase>(); | 3188 Run<HStackCheckEliminationPhase>(); |
| 3182 | 3189 |
| 3183 if (FLAG_array_bounds_checks_elimination) Run<HBoundsCheckEliminationPhase>(); | 3190 if (FLAG_array_bounds_checks_elimination) Run<HBoundsCheckEliminationPhase>(); |
| 3184 if (FLAG_array_bounds_checks_hoisting) Run<HBoundsCheckHoistingPhase>(); | 3191 if (FLAG_array_bounds_checks_hoisting) Run<HBoundsCheckHoistingPhase>(); |
| 3185 if (FLAG_array_index_dehoisting) Run<HDehoistIndexComputationsPhase>(); | 3192 if (FLAG_array_index_dehoisting) Run<HDehoistIndexComputationsPhase>(); |
| 3186 if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>(); | 3193 if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>(); |
| 3187 | 3194 |
| 3188 RestoreActualValues(); | 3195 RestoreActualValues(); |
| 3189 | 3196 |
| 3197 // Find unreachable code a second time, GVN and other optimizations may have |
| 3198 // made blocks unreachable that were previously reachable. |
| 3199 Run<HMarkUnreachableBlocksPhase>(); |
| 3200 |
| 3190 return true; | 3201 return true; |
| 3191 } | 3202 } |
| 3192 | 3203 |
| 3193 | 3204 |
| 3194 void HGraph::RestoreActualValues() { | 3205 void HGraph::RestoreActualValues() { |
| 3195 HPhase phase("H_Restore actual values", this); | 3206 HPhase phase("H_Restore actual values", this); |
| 3196 | 3207 |
| 3197 for (int block_index = 0; block_index < blocks()->length(); block_index++) { | 3208 for (int block_index = 0; block_index < blocks()->length(); block_index++) { |
| 3198 HBasicBlock* block = blocks()->at(block_index); | 3209 HBasicBlock* block = blocks()->at(block_index); |
| 3199 | 3210 |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3614 | 3625 |
| 3615 // Identify the block where normal (non-fall-through) control flow | 3626 // Identify the block where normal (non-fall-through) control flow |
| 3616 // goes to. | 3627 // goes to. |
| 3617 HBasicBlock* normal_block = NULL; | 3628 HBasicBlock* normal_block = NULL; |
| 3618 if (clause->is_default()) { | 3629 if (clause->is_default()) { |
| 3619 if (last_block != NULL) { | 3630 if (last_block != NULL) { |
| 3620 normal_block = last_block; | 3631 normal_block = last_block; |
| 3621 last_block = NULL; // Cleared to indicate we've handled it. | 3632 last_block = NULL; // Cleared to indicate we've handled it. |
| 3622 } | 3633 } |
| 3623 } else { | 3634 } else { |
| 3635 // If the current test block is deoptimizing due to an unhandled clause |
| 3636 // of the switch, the test instruction is in the next block since the |
| 3637 // deopt must end the current block. |
| 3638 if (curr_test_block->IsDeoptimizing()) { |
| 3639 ASSERT(curr_test_block->end()->SecondSuccessor() == NULL); |
| 3640 curr_test_block = curr_test_block->end()->FirstSuccessor(); |
| 3641 } |
| 3624 normal_block = curr_test_block->end()->FirstSuccessor(); | 3642 normal_block = curr_test_block->end()->FirstSuccessor(); |
| 3625 curr_test_block = curr_test_block->end()->SecondSuccessor(); | 3643 curr_test_block = curr_test_block->end()->SecondSuccessor(); |
| 3626 } | 3644 } |
| 3627 | 3645 |
| 3628 // Identify a block to emit the body into. | 3646 // Identify a block to emit the body into. |
| 3629 if (normal_block == NULL) { | 3647 if (normal_block == NULL) { |
| 3630 if (fall_through_block == NULL) { | 3648 if (fall_through_block == NULL) { |
| 3631 // (a) Unreachable. | 3649 // (a) Unreachable. |
| 3632 if (clause->is_default()) { | 3650 if (clause->is_default()) { |
| 3633 continue; // Might still be reachable clause bodies. | 3651 continue; // Might still be reachable clause bodies. |
| (...skipping 6195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9829 if (ShouldProduceTraceOutput()) { | 9847 if (ShouldProduceTraceOutput()) { |
| 9830 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9848 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9831 } | 9849 } |
| 9832 | 9850 |
| 9833 #ifdef DEBUG | 9851 #ifdef DEBUG |
| 9834 graph_->Verify(false); // No full verify. | 9852 graph_->Verify(false); // No full verify. |
| 9835 #endif | 9853 #endif |
| 9836 } | 9854 } |
| 9837 | 9855 |
| 9838 } } // namespace v8::internal | 9856 } } // namespace v8::internal |
| OLD | NEW |