OLD | NEW |
---|---|
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/pipeline.h" | 5 #include "src/compiler/pipeline.h" |
6 | 6 |
7 #include <fstream> // NOLINT(readability/streams) | 7 #include <fstream> // NOLINT(readability/streams) |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "src/base/adapters.h" | 10 #include "src/base/adapters.h" |
11 #include "src/base/platform/elapsed-timer.h" | 11 #include "src/base/platform/elapsed-timer.h" |
12 #include "src/compiler/ast-graph-builder.h" | 12 #include "src/compiler/ast-graph-builder.h" |
13 #include "src/compiler/ast-loop-assignment-analyzer.h" | 13 #include "src/compiler/ast-loop-assignment-analyzer.h" |
14 #include "src/compiler/basic-block-instrumentor.h" | 14 #include "src/compiler/basic-block-instrumentor.h" |
15 #include "src/compiler/branch-elimination.h" | 15 #include "src/compiler/branch-elimination.h" |
16 #include "src/compiler/bytecode-graph-builder.h" | 16 #include "src/compiler/bytecode-graph-builder.h" |
17 #include "src/compiler/change-lowering.h" | 17 #include "src/compiler/change-lowering.h" |
18 #include "src/compiler/code-generator.h" | 18 #include "src/compiler/code-generator.h" |
19 #include "src/compiler/common-operator-reducer.h" | 19 #include "src/compiler/common-operator-reducer.h" |
20 #include "src/compiler/control-flow-optimizer.h" | 20 #include "src/compiler/control-flow-optimizer.h" |
21 #include "src/compiler/dead-code-elimination.h" | 21 #include "src/compiler/dead-code-elimination.h" |
22 #include "src/compiler/effect-control-linearizer.h" | |
22 #include "src/compiler/escape-analysis-reducer.h" | 23 #include "src/compiler/escape-analysis-reducer.h" |
23 #include "src/compiler/escape-analysis.h" | 24 #include "src/compiler/escape-analysis.h" |
24 #include "src/compiler/frame-elider.h" | 25 #include "src/compiler/frame-elider.h" |
25 #include "src/compiler/graph-replay.h" | 26 #include "src/compiler/graph-replay.h" |
26 #include "src/compiler/graph-trimmer.h" | 27 #include "src/compiler/graph-trimmer.h" |
27 #include "src/compiler/graph-visualizer.h" | 28 #include "src/compiler/graph-visualizer.h" |
28 #include "src/compiler/greedy-allocator.h" | 29 #include "src/compiler/greedy-allocator.h" |
29 #include "src/compiler/instruction-selector.h" | 30 #include "src/compiler/instruction-selector.h" |
30 #include "src/compiler/instruction.h" | 31 #include "src/compiler/instruction.h" |
31 #include "src/compiler/js-builtin-reducer.h" | 32 #include "src/compiler/js-builtin-reducer.h" |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
218 void set_type_hint_analysis(TypeHintAnalysis* type_hint_analysis) { | 219 void set_type_hint_analysis(TypeHintAnalysis* type_hint_analysis) { |
219 DCHECK_NULL(type_hint_analysis_); | 220 DCHECK_NULL(type_hint_analysis_); |
220 type_hint_analysis_ = type_hint_analysis; | 221 type_hint_analysis_ = type_hint_analysis; |
221 } | 222 } |
222 | 223 |
223 Schedule* schedule() const { return schedule_; } | 224 Schedule* schedule() const { return schedule_; } |
224 void set_schedule(Schedule* schedule) { | 225 void set_schedule(Schedule* schedule) { |
225 DCHECK(!schedule_); | 226 DCHECK(!schedule_); |
226 schedule_ = schedule; | 227 schedule_ = schedule; |
227 } | 228 } |
229 void reset_schedule() { schedule_ = nullptr; } | |
228 | 230 |
229 Zone* instruction_zone() const { return instruction_zone_; } | 231 Zone* instruction_zone() const { return instruction_zone_; } |
230 InstructionSequence* sequence() const { return sequence_; } | 232 InstructionSequence* sequence() const { return sequence_; } |
231 Frame* frame() const { return frame_; } | 233 Frame* frame() const { return frame_; } |
232 | 234 |
233 Zone* register_allocation_zone() const { return register_allocation_zone_; } | 235 Zone* register_allocation_zone() const { return register_allocation_zone_; } |
234 RegisterAllocationData* register_allocation_data() const { | 236 RegisterAllocationData* register_allocation_data() const { |
235 return register_allocation_data_; | 237 return register_allocation_data_; |
236 } | 238 } |
237 | 239 |
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
792 struct ControlFlowOptimizationPhase { | 794 struct ControlFlowOptimizationPhase { |
793 static const char* phase_name() { return "control flow optimization"; } | 795 static const char* phase_name() { return "control flow optimization"; } |
794 | 796 |
795 void Run(PipelineData* data, Zone* temp_zone) { | 797 void Run(PipelineData* data, Zone* temp_zone) { |
796 ControlFlowOptimizer optimizer(data->graph(), data->common(), | 798 ControlFlowOptimizer optimizer(data->graph(), data->common(), |
797 data->machine(), temp_zone); | 799 data->machine(), temp_zone); |
798 optimizer.Optimize(); | 800 optimizer.Optimize(); |
799 } | 801 } |
800 }; | 802 }; |
801 | 803 |
804 struct FixLowLevelEffectsPhase { | |
Benedikt Meurer
2016/04/18 04:34:18
Can we have a single ControlEffectLinearizationPha
Jarin
2016/04/18 07:53:33
Done.
| |
805 static const char* phase_name() { return "low-level effect wiring"; } | |
806 | |
807 void Run(PipelineData* data, Zone* temp_zone) { | |
808 EffectControlLinearizer introducer(data->jsgraph(), data->schedule(), | |
809 temp_zone); | |
810 introducer.Run(); | |
811 } | |
812 }; | |
802 | 813 |
803 struct ChangeLoweringPhase { | 814 struct ChangeLoweringPhase { |
804 static const char* phase_name() { return "change lowering"; } | 815 static const char* phase_name() { return "change lowering"; } |
805 | 816 |
806 void Run(PipelineData* data, Zone* temp_zone) { | 817 void Run(PipelineData* data, Zone* temp_zone) { |
807 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); | 818 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
808 DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), | 819 DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), |
809 data->common()); | 820 data->common()); |
810 SimplifiedOperatorReducer simple_reducer(data->jsgraph()); | 821 SimplifiedOperatorReducer simple_reducer(data->jsgraph()); |
811 ValueNumberingReducer value_numbering(temp_zone); | 822 ValueNumberingReducer value_numbering(temp_zone); |
812 ChangeLowering lowering(data->jsgraph()); | 823 ChangeLowering lowering(data->jsgraph()); |
813 MachineOperatorReducer machine_reducer(data->jsgraph()); | 824 MachineOperatorReducer machine_reducer(data->jsgraph()); |
814 CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), | 825 CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), |
815 data->common(), data->machine()); | 826 data->common(), data->machine()); |
816 AddReducer(data, &graph_reducer, &dead_code_elimination); | 827 AddReducer(data, &graph_reducer, &dead_code_elimination); |
817 AddReducer(data, &graph_reducer, &simple_reducer); | 828 AddReducer(data, &graph_reducer, &simple_reducer); |
818 AddReducer(data, &graph_reducer, &value_numbering); | 829 AddReducer(data, &graph_reducer, &value_numbering); |
819 AddReducer(data, &graph_reducer, &lowering); | 830 AddReducer(data, &graph_reducer, &lowering); |
820 AddReducer(data, &graph_reducer, &machine_reducer); | 831 AddReducer(data, &graph_reducer, &machine_reducer); |
821 AddReducer(data, &graph_reducer, &common_reducer); | 832 AddReducer(data, &graph_reducer, &common_reducer); |
822 graph_reducer.ReduceGraph(); | 833 graph_reducer.ReduceGraph(); |
823 } | 834 } |
824 }; | 835 }; |
825 | 836 |
837 struct ComputeEffectSchedulePhase { | |
838 static const char* phase_name() { return "effect scheduling"; } | |
839 | |
840 void Run(PipelineData* data, Zone* temp_zone) { | |
841 Schedule* schedule = Scheduler::ComputeSchedule(temp_zone, data->graph(), | |
842 Scheduler::kNoFlags); | |
843 if (FLAG_turbo_verify) ScheduleVerifier::Run(schedule); | |
844 data->set_schedule(schedule); | |
845 } | |
846 }; | |
847 | |
848 struct EffectScheduleTrimmingPhase { | |
Benedikt Meurer
2016/04/18 04:34:18
Can you put a TODO on this guy, that we only need
Jarin
2016/04/18 07:53:33
Done.
| |
849 static const char* phase_name() { return "effect schedule graph trimming"; } | |
850 void Run(PipelineData* data, Zone* temp_zone) { | |
851 GraphTrimmer trimmer(temp_zone, data->graph()); | |
852 NodeVector roots(temp_zone); | |
853 data->jsgraph()->GetCachedNodes(&roots); | |
854 trimmer.TrimGraph(roots.begin(), roots.end()); | |
855 } | |
856 }; | |
826 | 857 |
827 struct EarlyGraphTrimmingPhase { | 858 struct EarlyGraphTrimmingPhase { |
828 static const char* phase_name() { return "early graph trimming"; } | 859 static const char* phase_name() { return "early graph trimming"; } |
829 void Run(PipelineData* data, Zone* temp_zone) { | 860 void Run(PipelineData* data, Zone* temp_zone) { |
830 GraphTrimmer trimmer(temp_zone, data->graph()); | 861 GraphTrimmer trimmer(temp_zone, data->graph()); |
831 NodeVector roots(temp_zone); | 862 NodeVector roots(temp_zone); |
832 data->jsgraph()->GetCachedNodes(&roots); | 863 data->jsgraph()->GetCachedNodes(&roots); |
833 trimmer.TrimGraph(roots.begin(), roots.end()); | 864 trimmer.TrimGraph(roots.begin(), roots.end()); |
834 } | 865 } |
835 }; | 866 }; |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1244 | 1275 |
1245 if (FLAG_turbo_escape) { | 1276 if (FLAG_turbo_escape) { |
1246 Run<EscapeAnalysisPhase>(); | 1277 Run<EscapeAnalysisPhase>(); |
1247 RunPrintAndVerify("Escape Analysed"); | 1278 RunPrintAndVerify("Escape Analysed"); |
1248 } | 1279 } |
1249 | 1280 |
1250 // Lower simplified operators and insert changes. | 1281 // Lower simplified operators and insert changes. |
1251 Run<SimplifiedLoweringPhase>(); | 1282 Run<SimplifiedLoweringPhase>(); |
1252 RunPrintAndVerify("Lowered simplified"); | 1283 RunPrintAndVerify("Lowered simplified"); |
1253 | 1284 |
1285 if (!info()->shared_info()->asm_function()) { | |
Benedikt Meurer
2016/04/18 04:34:18
How bad is this actually for asm.js functions?
| |
1286 // TODO(jarin) Run value numbering for the representation changes. | |
1287 | |
1288 // The scheduler requires the graphs to be trimmed, so trim now. | |
1289 Run<EffectScheduleTrimmingPhase>(); | |
1290 | |
1291 // Schedule the graph without node splitting so that we can | |
1292 // fix the effect and control flow for nodes with low-level side | |
1293 // effects (such as changing representation to tagged or | |
1294 // 'floating' allocation regions.) | |
1295 Run<ComputeEffectSchedulePhase>(); | |
1296 | |
1297 // Post-pass for wiring the control/effects | |
1298 // - connect allocating representation changes into the control&effect | |
1299 // chains and lower them, | |
1300 // - get rid of the region markers, | |
1301 // - introduce effect phis and rewire effects to get SSA again. | |
1302 Run<FixLowLevelEffectsPhase>(); | |
1303 | |
1304 // Get rid of the schedule. | |
1305 // TODO(jarin) We should produce the schedule in a temporary zone. | |
1306 data.reset_schedule(); | |
1307 RunPrintAndVerify("Fixed state flow"); | |
1308 } | |
1309 | |
1254 Run<BranchEliminationPhase>(); | 1310 Run<BranchEliminationPhase>(); |
1255 RunPrintAndVerify("Branch conditions eliminated"); | 1311 RunPrintAndVerify("Branch conditions eliminated"); |
1256 | 1312 |
1257 // Optimize control flow. | 1313 // Optimize control flow. |
1258 if (FLAG_turbo_cf_optimization) { | 1314 if (FLAG_turbo_cf_optimization) { |
1259 Run<ControlFlowOptimizationPhase>(); | 1315 Run<ControlFlowOptimizationPhase>(); |
1260 RunPrintAndVerify("Control flow optimized"); | 1316 RunPrintAndVerify("Control flow optimized"); |
1261 } | 1317 } |
1262 | 1318 |
1263 // Lower changes that have been inserted before. | 1319 // Lower changes that have been inserted before. |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1564 } | 1620 } |
1565 | 1621 |
1566 data->DeleteRegisterAllocationZone(); | 1622 data->DeleteRegisterAllocationZone(); |
1567 } | 1623 } |
1568 | 1624 |
1569 Isolate* Pipeline::isolate() const { return info()->isolate(); } | 1625 Isolate* Pipeline::isolate() const { return info()->isolate(); } |
1570 | 1626 |
1571 } // namespace compiler | 1627 } // namespace compiler |
1572 } // namespace internal | 1628 } // namespace internal |
1573 } // namespace v8 | 1629 } // namespace v8 |
OLD | NEW |