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

Side by Side Diff: src/hydrogen.h

Issue 131363008: A64: Synchronize with r15922. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 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/heap-snapshot-generator.cc ('k') | src/hydrogen.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 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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 int block_id() const { return block_id_; } 62 int block_id() const { return block_id_; }
63 void set_block_id(int id) { block_id_ = id; } 63 void set_block_id(int id) { block_id_ = id; }
64 HGraph* graph() const { return graph_; } 64 HGraph* graph() const { return graph_; }
65 Isolate* isolate() const; 65 Isolate* isolate() const;
66 const ZoneList<HPhi*>* phis() const { return &phis_; } 66 const ZoneList<HPhi*>* phis() const { return &phis_; }
67 HInstruction* first() const { return first_; } 67 HInstruction* first() const { return first_; }
68 HInstruction* last() const { return last_; } 68 HInstruction* last() const { return last_; }
69 void set_last(HInstruction* instr) { last_ = instr; } 69 void set_last(HInstruction* instr) { last_ = instr; }
70 HControlInstruction* end() const { return end_; } 70 HControlInstruction* end() const { return end_; }
71 HLoopInformation* loop_information() const { return loop_information_; } 71 HLoopInformation* loop_information() const { return loop_information_; }
72 HLoopInformation* current_loop() const {
73 return IsLoopHeader() ? loop_information()
74 : (parent_loop_header() != NULL
75 ? parent_loop_header()->loop_information() : NULL);
76 }
72 const ZoneList<HBasicBlock*>* predecessors() const { return &predecessors_; } 77 const ZoneList<HBasicBlock*>* predecessors() const { return &predecessors_; }
73 bool HasPredecessor() const { return predecessors_.length() > 0; } 78 bool HasPredecessor() const { return predecessors_.length() > 0; }
74 const ZoneList<HBasicBlock*>* dominated_blocks() const { 79 const ZoneList<HBasicBlock*>* dominated_blocks() const {
75 return &dominated_blocks_; 80 return &dominated_blocks_;
76 } 81 }
77 const ZoneList<int>* deleted_phis() const { 82 const ZoneList<int>* deleted_phis() const {
78 return &deleted_phis_; 83 return &deleted_phis_;
79 } 84 }
80 void RecordDeletedPhi(int merge_index) { 85 void RecordDeletedPhi(int merge_index) {
81 deleted_phis_.Add(merge_index, zone()); 86 deleted_phis_.Add(merge_index, zone());
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 void Finish(HControlInstruction* last); 135 void Finish(HControlInstruction* last);
131 void FinishExit(HControlInstruction* instruction); 136 void FinishExit(HControlInstruction* instruction);
132 void Goto(HBasicBlock* block, 137 void Goto(HBasicBlock* block,
133 FunctionState* state = NULL, 138 FunctionState* state = NULL,
134 bool add_simulate = true); 139 bool add_simulate = true);
135 void GotoNoSimulate(HBasicBlock* block) { 140 void GotoNoSimulate(HBasicBlock* block) {
136 Goto(block, NULL, false); 141 Goto(block, NULL, false);
137 } 142 }
138 143
139 int PredecessorIndexOf(HBasicBlock* predecessor) const; 144 int PredecessorIndexOf(HBasicBlock* predecessor) const;
140 void AddSimulate(BailoutId ast_id, 145 HSimulate* AddSimulate(BailoutId ast_id,
141 RemovableSimulate removable = FIXED_SIMULATE) { 146 RemovableSimulate removable = FIXED_SIMULATE) {
142 AddInstruction(CreateSimulate(ast_id, removable)); 147 HSimulate* instr = CreateSimulate(ast_id, removable);
148 AddInstruction(instr);
149 return instr;
143 } 150 }
144 void AssignCommonDominator(HBasicBlock* other); 151 void AssignCommonDominator(HBasicBlock* other);
145 void AssignLoopSuccessorDominators(); 152 void AssignLoopSuccessorDominators();
146 153
147 void FinishExitWithDeoptimization(HDeoptimize::UseEnvironment has_uses) {
148 FinishExit(CreateDeoptimize(has_uses));
149 }
150
151 // Add the inlined function exit sequence, adding an HLeaveInlined 154 // Add the inlined function exit sequence, adding an HLeaveInlined
152 // instruction and updating the bailout environment. 155 // instruction and updating the bailout environment.
153 void AddLeaveInlined(HValue* return_value, FunctionState* state); 156 void AddLeaveInlined(HValue* return_value, FunctionState* state);
154 157
155 // If a target block is tagged as an inline function return, all 158 // If a target block is tagged as an inline function return, all
156 // predecessors should contain the inlined exit sequence: 159 // predecessors should contain the inlined exit sequence:
157 // 160 //
158 // LeaveInlined 161 // LeaveInlined
159 // Simulate (caller's environment) 162 // Simulate (caller's environment)
160 // Goto (target block) 163 // Goto (target block)
(...skipping 14 matching lines...) Expand all
175 dominates_loop_successors_ = true; 178 dominates_loop_successors_ = true;
176 } 179 }
177 180
178 inline Zone* zone() const; 181 inline Zone* zone() const;
179 182
180 #ifdef DEBUG 183 #ifdef DEBUG
181 void Verify(); 184 void Verify();
182 #endif 185 #endif
183 186
184 private: 187 private:
188 friend class HGraphBuilder;
189
185 void RegisterPredecessor(HBasicBlock* pred); 190 void RegisterPredecessor(HBasicBlock* pred);
186 void AddDominatedBlock(HBasicBlock* block); 191 void AddDominatedBlock(HBasicBlock* block);
187 192
188 HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable); 193 HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable);
189 HDeoptimize* CreateDeoptimize(HDeoptimize::UseEnvironment has_uses);
190 194
191 int block_id_; 195 int block_id_;
192 HGraph* graph_; 196 HGraph* graph_;
193 ZoneList<HPhi*> phis_; 197 ZoneList<HPhi*> phis_;
194 HInstruction* first_; 198 HInstruction* first_;
195 HInstruction* last_; 199 HInstruction* last_;
196 HControlInstruction* end_; 200 HControlInstruction* end_;
197 HLoopInformation* loop_information_; 201 HLoopInformation* loop_information_;
198 ZoneList<HBasicBlock*> predecessors_; 202 ZoneList<HBasicBlock*> predecessors_;
199 HBasicBlock* dominator_; 203 HBasicBlock* dominator_;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; } 269 const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; }
266 HBasicBlock* loop_header() const { return loop_header_; } 270 HBasicBlock* loop_header() const { return loop_header_; }
267 HBasicBlock* GetLastBackEdge() const; 271 HBasicBlock* GetLastBackEdge() const;
268 void RegisterBackEdge(HBasicBlock* block); 272 void RegisterBackEdge(HBasicBlock* block);
269 273
270 HStackCheck* stack_check() const { return stack_check_; } 274 HStackCheck* stack_check() const { return stack_check_; }
271 void set_stack_check(HStackCheck* stack_check) { 275 void set_stack_check(HStackCheck* stack_check) {
272 stack_check_ = stack_check; 276 stack_check_ = stack_check;
273 } 277 }
274 278
279 bool IsNestedInThisLoop(HLoopInformation* other) {
280 while (other != NULL) {
281 if (other == this) {
282 return true;
283 }
284 other = other->parent_loop();
285 }
286 return false;
287 }
288 HLoopInformation* parent_loop() {
289 HBasicBlock* parent_header = loop_header()->parent_loop_header();
290 return parent_header != NULL ? parent_header->loop_information() : NULL;
291 }
292
275 private: 293 private:
276 void AddBlock(HBasicBlock* block); 294 void AddBlock(HBasicBlock* block);
277 295
278 ZoneList<HBasicBlock*> back_edges_; 296 ZoneList<HBasicBlock*> back_edges_;
279 HBasicBlock* loop_header_; 297 HBasicBlock* loop_header_;
280 ZoneList<HBasicBlock*> blocks_; 298 ZoneList<HBasicBlock*> blocks_;
281 HStackCheck* stack_check_; 299 HStackCheck* stack_check_;
282 }; 300 };
283 301
284 302
285 class BoundsCheckTable; 303 class BoundsCheckTable;
304 class InductionVariableBlocksTable;
286 class HGraph: public ZoneObject { 305 class HGraph: public ZoneObject {
287 public: 306 public:
288 explicit HGraph(CompilationInfo* info); 307 explicit HGraph(CompilationInfo* info);
289 308
290 Isolate* isolate() const { return isolate_; } 309 Isolate* isolate() const { return isolate_; }
291 Zone* zone() const { return zone_; } 310 Zone* zone() const { return zone_; }
292 CompilationInfo* info() const { return info_; } 311 CompilationInfo* info() const { return info_; }
293 312
294 const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; } 313 const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; }
295 const ZoneList<HPhi*>* phi_list() const { return phi_list_; } 314 const ZoneList<HPhi*>* phi_list() const { return phi_list_; }
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 template<class Phase> 461 template<class Phase>
443 void Run() { 462 void Run() {
444 Phase phase(this); 463 Phase phase(this);
445 phase.Run(); 464 phase.Run();
446 } 465 }
447 466
448 void RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi* phi); 467 void RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi* phi);
449 void CheckForBackEdge(HBasicBlock* block, HBasicBlock* successor); 468 void CheckForBackEdge(HBasicBlock* block, HBasicBlock* successor);
450 void SetupInformativeDefinitionsInBlock(HBasicBlock* block); 469 void SetupInformativeDefinitionsInBlock(HBasicBlock* block);
451 void SetupInformativeDefinitionsRecursively(HBasicBlock* block); 470 void SetupInformativeDefinitionsRecursively(HBasicBlock* block);
471 void EliminateRedundantBoundsChecksUsingInductionVariables();
452 472
453 Isolate* isolate_; 473 Isolate* isolate_;
454 int next_block_id_; 474 int next_block_id_;
455 HBasicBlock* entry_block_; 475 HBasicBlock* entry_block_;
456 HEnvironment* start_environment_; 476 HEnvironment* start_environment_;
457 ZoneList<HBasicBlock*> blocks_; 477 ZoneList<HBasicBlock*> blocks_;
458 ZoneList<HValue*> values_; 478 ZoneList<HValue*> values_;
459 ZoneList<HPhi*>* phi_list_; 479 ZoneList<HPhi*>* phi_list_;
460 ZoneList<HInstruction*>* uint32_instructions_; 480 ZoneList<HInstruction*>* uint32_instructions_;
461 SetOncePointer<HConstant> undefined_constant_; 481 SetOncePointer<HConstant> undefined_constant_;
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
1016 new(zone()) I(p1, p2, p3, p4, p5, p6, p7))); 1036 new(zone()) I(p1, p2, p3, p4, p5, p6, p7)));
1017 } 1037 }
1018 1038
1019 template<class I, class P1, class P2, class P3, class P4, 1039 template<class I, class P1, class P2, class P3, class P4,
1020 class P5, class P6, class P7, class P8> 1040 class P5, class P6, class P7, class P8>
1021 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) { 1041 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) {
1022 return static_cast<I*>(AddInstruction( 1042 return static_cast<I*>(AddInstruction(
1023 new(zone()) I(p1, p2, p3, p4, p5, p6, p7, p8))); 1043 new(zone()) I(p1, p2, p3, p4, p5, p6, p7, p8)));
1024 } 1044 }
1025 1045
1026 void AddSimulate(BailoutId id,
1027 RemovableSimulate removable = FIXED_SIMULATE);
1028
1029 HReturn* AddReturn(HValue* value);
1030
1031 void IncrementInNoSideEffectsScope() { 1046 void IncrementInNoSideEffectsScope() {
1032 no_side_effects_scope_count_++; 1047 no_side_effects_scope_count_++;
1033 } 1048 }
1034 1049
1035 void DecrementInNoSideEffectsScope() { 1050 void DecrementInNoSideEffectsScope() {
1036 no_side_effects_scope_count_--; 1051 no_side_effects_scope_count_--;
1037 } 1052 }
1038 1053
1039 protected: 1054 protected:
1040 virtual bool BuildGraph() = 0; 1055 virtual bool BuildGraph() = 0;
1041 1056
1042 HBasicBlock* CreateBasicBlock(HEnvironment* env); 1057 HBasicBlock* CreateBasicBlock(HEnvironment* env);
1043 HBasicBlock* CreateLoopHeaderBlock(); 1058 HBasicBlock* CreateLoopHeaderBlock();
1044 1059
1045 HValue* BuildCheckHeapObject(HValue* object); 1060 HValue* BuildCheckHeapObject(HValue* object);
1046 HValue* BuildCheckMap(HValue* obj, Handle<Map> map); 1061 HValue* BuildCheckMap(HValue* obj, Handle<Map> map);
1062 HValue* BuildWrapReceiver(HValue* object, HValue* function);
1047 1063
1048 // Building common constructs 1064 // Building common constructs
1049 HValue* BuildCheckForCapacityGrow(HValue* object, 1065 HValue* BuildCheckForCapacityGrow(HValue* object,
1050 HValue* elements, 1066 HValue* elements,
1051 ElementsKind kind, 1067 ElementsKind kind,
1052 HValue* length, 1068 HValue* length,
1053 HValue* key, 1069 HValue* key,
1054 bool is_js_array); 1070 bool is_js_array);
1055 1071
1056 HValue* BuildCopyElementsOnWrite(HValue* object, 1072 HValue* BuildCopyElementsOnWrite(HValue* object,
(...skipping 14 matching lines...) Expand all
1071 HCheckMaps* mapcheck, 1087 HCheckMaps* mapcheck,
1072 bool is_js_array, 1088 bool is_js_array,
1073 ElementsKind elements_kind, 1089 ElementsKind elements_kind,
1074 bool is_store, 1090 bool is_store,
1075 LoadKeyedHoleMode load_mode, 1091 LoadKeyedHoleMode load_mode,
1076 KeyedAccessStoreMode store_mode); 1092 KeyedAccessStoreMode store_mode);
1077 1093
1078 HLoadNamedField* AddLoad( 1094 HLoadNamedField* AddLoad(
1079 HValue *object, 1095 HValue *object,
1080 HObjectAccess access, 1096 HObjectAccess access,
1081 HValue *typecheck = NULL, 1097 HValue *typecheck = NULL);
1082 Representation representation = Representation::Tagged());
1083 1098
1084 HLoadNamedField* BuildLoadNamedField( 1099 HLoadNamedField* BuildLoadNamedField(
1085 HValue* object, 1100 HValue* object,
1086 HObjectAccess access, 1101 HObjectAccess access,
1087 Representation representation); 1102 Representation representation);
1088 1103
1089 HInstruction* AddExternalArrayElementAccess( 1104 HInstruction* AddExternalArrayElementAccess(
1090 HValue* external_elements, 1105 HValue* external_elements,
1091 HValue* checked_key, 1106 HValue* checked_key,
1092 HValue* val, 1107 HValue* val,
1093 HValue* dependency, 1108 HValue* dependency,
1094 ElementsKind elements_kind, 1109 ElementsKind elements_kind,
1095 bool is_store); 1110 bool is_store);
1096 1111
1097 HInstruction* AddFastElementAccess( 1112 HInstruction* AddFastElementAccess(
1098 HValue* elements, 1113 HValue* elements,
1099 HValue* checked_key, 1114 HValue* checked_key,
1100 HValue* val, 1115 HValue* val,
1101 HValue* dependency, 1116 HValue* dependency,
1102 ElementsKind elements_kind, 1117 ElementsKind elements_kind,
1103 bool is_store, 1118 bool is_store,
1104 LoadKeyedHoleMode load_mode, 1119 LoadKeyedHoleMode load_mode,
1105 KeyedAccessStoreMode store_mode); 1120 KeyedAccessStoreMode store_mode);
1106 1121
1107 HStoreNamedField* AddStore( 1122 HLoadNamedField* BuildLoadNamedField(HValue* object, HObjectAccess access);
1108 HValue *object, 1123 HStoreNamedField* AddStore(HValue *object, HObjectAccess access, HValue *val);
1109 HObjectAccess access,
1110 HValue *val,
1111 Representation representation = Representation::Tagged());
1112
1113 HStoreNamedField* AddStoreMapConstant(HValue *object, Handle<Map>); 1124 HStoreNamedField* AddStoreMapConstant(HValue *object, Handle<Map>);
1114
1115 HLoadNamedField* AddLoadElements(HValue *object, HValue *typecheck = NULL); 1125 HLoadNamedField* AddLoadElements(HValue *object, HValue *typecheck = NULL);
1116
1117 HLoadNamedField* AddLoadFixedArrayLength(HValue *object); 1126 HLoadNamedField* AddLoadFixedArrayLength(HValue *object);
1118 1127
1119 HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin, HValue* context); 1128 HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin, HValue* context);
1120 1129
1121 enum SoftDeoptimizeMode { 1130 HValue* TruncateToNumber(HValue* value, Handle<Type>* expected);
1122 MUST_EMIT_SOFT_DEOPT,
1123 CAN_OMIT_SOFT_DEOPT
1124 };
1125 1131
1126 void AddSoftDeoptimize(SoftDeoptimizeMode mode = CAN_OMIT_SOFT_DEOPT); 1132 void PushAndAdd(HInstruction* instr);
1133
1134 void FinishExitWithHardDeoptimization(HBasicBlock* continuation);
1127 1135
1128 class IfBuilder { 1136 class IfBuilder {
1129 public: 1137 public:
1130 explicit IfBuilder(HGraphBuilder* builder, 1138 explicit IfBuilder(HGraphBuilder* builder,
1131 int position = RelocInfo::kNoPosition); 1139 int position = RelocInfo::kNoPosition);
1132 IfBuilder(HGraphBuilder* builder, 1140 IfBuilder(HGraphBuilder* builder,
1133 HIfContinuation* continuation); 1141 HIfContinuation* continuation);
1134 1142
1135 ~IfBuilder() { 1143 ~IfBuilder() {
1136 if (!finished_) End(); 1144 if (!finished_) End();
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1221 void CaptureContinuation(HIfContinuation* continuation); 1229 void CaptureContinuation(HIfContinuation* continuation);
1222 1230
1223 void Then(); 1231 void Then();
1224 void Else(); 1232 void Else();
1225 void End(); 1233 void End();
1226 1234
1227 void Deopt(); 1235 void Deopt();
1228 void ElseDeopt() { 1236 void ElseDeopt() {
1229 Else(); 1237 Else();
1230 Deopt(); 1238 Deopt();
1231 End();
1232 } 1239 }
1233 1240
1234 void Return(HValue* value); 1241 void Return(HValue* value);
1235 1242
1236 private: 1243 private:
1237 void AddCompare(HControlInstruction* compare); 1244 void AddCompare(HControlInstruction* compare);
1238 1245
1239 Zone* zone() { return builder_->zone(); } 1246 Zone* zone() { return builder_->zone(); }
1240 1247
1241 HGraphBuilder* builder_; 1248 HGraphBuilder* builder_;
1242 int position_; 1249 int position_;
1243 bool finished_ : 1; 1250 bool finished_ : 1;
1251 bool deopt_then_ : 1;
1252 bool deopt_else_ : 1;
1244 bool did_then_ : 1; 1253 bool did_then_ : 1;
1245 bool did_else_ : 1; 1254 bool did_else_ : 1;
1246 bool did_and_ : 1; 1255 bool did_and_ : 1;
1247 bool did_or_ : 1; 1256 bool did_or_ : 1;
1248 bool captured_ : 1; 1257 bool captured_ : 1;
1249 bool needs_compare_ : 1; 1258 bool needs_compare_ : 1;
1250 HBasicBlock* first_true_block_; 1259 HBasicBlock* first_true_block_;
1251 HBasicBlock* last_true_block_; 1260 HBasicBlock* last_true_block_;
1252 HBasicBlock* first_false_block_; 1261 HBasicBlock* first_false_block_;
1253 HBasicBlock* split_edge_merge_block_; 1262 HBasicBlock* split_edge_merge_block_;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1366 ElementsKind kind, 1375 ElementsKind kind,
1367 HValue* capacity); 1376 HValue* capacity);
1368 1377
1369 // array must have been allocated with enough room for 1378 // array must have been allocated with enough room for
1370 // 1) the JSArray, 2) a AllocationMemento if mode requires it, 1379 // 1) the JSArray, 2) a AllocationMemento if mode requires it,
1371 // 3) a FixedArray or FixedDoubleArray. 1380 // 3) a FixedArray or FixedDoubleArray.
1372 // A pointer to the Fixed(Double)Array is returned. 1381 // A pointer to the Fixed(Double)Array is returned.
1373 HInnerAllocatedObject* BuildJSArrayHeader(HValue* array, 1382 HInnerAllocatedObject* BuildJSArrayHeader(HValue* array,
1374 HValue* array_map, 1383 HValue* array_map,
1375 AllocationSiteMode mode, 1384 AllocationSiteMode mode,
1385 ElementsKind elements_kind,
1376 HValue* allocation_site_payload, 1386 HValue* allocation_site_payload,
1377 HValue* length_field); 1387 HValue* length_field);
1378 1388
1379 HValue* BuildGrowElementsCapacity(HValue* object, 1389 HValue* BuildGrowElementsCapacity(HValue* object,
1380 HValue* elements, 1390 HValue* elements,
1381 ElementsKind kind, 1391 ElementsKind kind,
1382 ElementsKind new_kind, 1392 ElementsKind new_kind,
1383 HValue* length, 1393 HValue* length,
1384 HValue* new_capacity); 1394 HValue* new_capacity);
1385 1395
(...skipping 29 matching lines...) Expand all
1415 1425
1416 HValue* BuildCreateAllocationMemento(HValue* previous_object, 1426 HValue* BuildCreateAllocationMemento(HValue* previous_object,
1417 int previous_object_size, 1427 int previous_object_size,
1418 HValue* payload); 1428 HValue* payload);
1419 1429
1420 HInstruction* BuildGetNativeContext(HValue* context); 1430 HInstruction* BuildGetNativeContext(HValue* context);
1421 HInstruction* BuildGetArrayFunction(HValue* context); 1431 HInstruction* BuildGetArrayFunction(HValue* context);
1422 1432
1423 private: 1433 private:
1424 HGraphBuilder(); 1434 HGraphBuilder();
1435
1436 void PadEnvironmentForContinuation(HBasicBlock* from,
1437 HBasicBlock* continuation);
1438
1425 CompilationInfo* info_; 1439 CompilationInfo* info_;
1426 HGraph* graph_; 1440 HGraph* graph_;
1427 HBasicBlock* current_block_; 1441 HBasicBlock* current_block_;
1428 int no_side_effects_scope_count_; 1442 int no_side_effects_scope_count_;
1429 }; 1443 };
1430 1444
1445
1446 template<>
1447 inline HDeoptimize* HGraphBuilder::Add(Deoptimizer::BailoutType type) {
1448 if (type == Deoptimizer::SOFT) {
1449 isolate()->counters()->soft_deopts_requested()->Increment();
1450 if (FLAG_always_opt) return NULL;
1451 }
1452 if (current_block()->IsDeoptimizing()) return NULL;
1453 HDeoptimize* instr = new(zone()) HDeoptimize(type);
1454 AddInstruction(instr);
1455 if (type == Deoptimizer::SOFT) {
1456 isolate()->counters()->soft_deopts_inserted()->Increment();
1457 graph()->set_has_soft_deoptimize(true);
1458 }
1459 current_block()->MarkAsDeoptimizing();
1460 return instr;
1461 }
1462
1463
1464 template<>
1465 inline HSimulate* HGraphBuilder::Add(BailoutId id,
1466 RemovableSimulate removable) {
1467 HSimulate* instr = current_block()->CreateSimulate(id, removable);
1468 AddInstruction(instr);
1469 return instr;
1470 }
1471
1472
1473 template<>
1474 inline HSimulate* HGraphBuilder::Add(BailoutId id) {
1475 return Add<HSimulate>(id, FIXED_SIMULATE);
1476 }
1477
1478
1479 template<>
1480 inline HReturn* HGraphBuilder::Add(HValue* value) {
1481 HValue* context = environment()->LookupContext();
1482 int num_parameters = graph()->info()->num_parameters();
1483 HValue* params = Add<HConstant>(num_parameters);
1484 HReturn* return_instruction = new(graph()->zone())
1485 HReturn(value, context, params);
1486 current_block()->FinishExit(return_instruction);
1487 return return_instruction;
1488 }
1489
1490
1491 template<>
1492 inline HReturn* HGraphBuilder::Add(HConstant* p1) {
1493 return Add<HReturn>(static_cast<HValue*>(p1));
1494 }
1495
1496
1431 class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor { 1497 class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor {
1432 public: 1498 public:
1433 // A class encapsulating (lazily-allocated) break and continue blocks for 1499 // A class encapsulating (lazily-allocated) break and continue blocks for
1434 // a breakable statement. Separated from BreakAndContinueScope so that it 1500 // a breakable statement. Separated from BreakAndContinueScope so that it
1435 // can have a separate lifetime. 1501 // can have a separate lifetime.
1436 class BreakAndContinueInfo BASE_EMBEDDED { 1502 class BreakAndContinueInfo BASE_EMBEDDED {
1437 public: 1503 public:
1438 explicit BreakAndContinueInfo(BreakableStatement* target, 1504 explicit BreakAndContinueInfo(BreakableStatement* target,
1439 int drop_extra = 0) 1505 int drop_extra = 0)
1440 : target_(target), 1506 : target_(target),
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1659 HBasicBlock* false_block); 1725 HBasicBlock* false_block);
1660 1726
1661 // Visit an argument subexpression and emit a push to the outgoing arguments. 1727 // Visit an argument subexpression and emit a push to the outgoing arguments.
1662 void VisitArgument(Expression* expr); 1728 void VisitArgument(Expression* expr);
1663 1729
1664 void VisitArgumentList(ZoneList<Expression*>* arguments); 1730 void VisitArgumentList(ZoneList<Expression*>* arguments);
1665 1731
1666 // Visit a list of expressions from left to right, each in a value context. 1732 // Visit a list of expressions from left to right, each in a value context.
1667 void VisitExpressions(ZoneList<Expression*>* exprs); 1733 void VisitExpressions(ZoneList<Expression*>* exprs);
1668 1734
1669 void PushAndAdd(HInstruction* instr);
1670
1671 // Remove the arguments from the bailout environment and emit instructions 1735 // Remove the arguments from the bailout environment and emit instructions
1672 // to push them as outgoing parameters. 1736 // to push them as outgoing parameters.
1673 template <class Instruction> HInstruction* PreProcessCall(Instruction* call); 1737 template <class Instruction> HInstruction* PreProcessCall(Instruction* call);
1674 1738
1675 void SetUpScope(Scope* scope); 1739 void SetUpScope(Scope* scope);
1676 virtual void VisitStatements(ZoneList<Statement*>* statements); 1740 virtual void VisitStatements(ZoneList<Statement*>* statements);
1677 1741
1678 #define DECLARE_VISIT(type) virtual void Visit##type(type* node); 1742 #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
1679 AST_NODE_LIST(DECLARE_VISIT) 1743 AST_NODE_LIST(DECLARE_VISIT)
1680 #undef DECLARE_VISIT 1744 #undef DECLARE_VISIT
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
2014 HGraph* graph_; 2078 HGraph* graph_;
2015 2079
2016 DISALLOW_COPY_AND_ASSIGN(HPhase); 2080 DISALLOW_COPY_AND_ASSIGN(HPhase);
2017 }; 2081 };
2018 2082
2019 2083
2020 class HTracer: public Malloced { 2084 class HTracer: public Malloced {
2021 public: 2085 public:
2022 explicit HTracer(int isolate_id) 2086 explicit HTracer(int isolate_id)
2023 : trace_(&string_allocator_), indent_(0) { 2087 : trace_(&string_allocator_), indent_(0) {
2024 OS::SNPrintF(filename_, 2088 if (FLAG_trace_hydrogen_file == NULL) {
2025 "hydrogen-%d-%d.cfg", 2089 OS::SNPrintF(filename_,
2026 OS::GetCurrentProcessId(), 2090 "hydrogen-%d-%d.cfg",
2027 isolate_id); 2091 OS::GetCurrentProcessId(),
2092 isolate_id);
2093 } else {
2094 OS::StrNCpy(filename_, FLAG_trace_hydrogen_file, filename_.length());
2095 }
2028 WriteChars(filename_.start(), "", 0, false); 2096 WriteChars(filename_.start(), "", 0, false);
2029 } 2097 }
2030 2098
2031 void TraceCompilation(CompilationInfo* info); 2099 void TraceCompilation(CompilationInfo* info);
2032 void TraceHydrogen(const char* name, HGraph* graph); 2100 void TraceHydrogen(const char* name, HGraph* graph);
2033 void TraceLithium(const char* name, LChunk* chunk); 2101 void TraceLithium(const char* name, LChunk* chunk);
2034 void TraceLiveRanges(const char* name, LAllocator* allocator); 2102 void TraceLiveRanges(const char* name, LAllocator* allocator);
2035 2103
2036 private: 2104 private:
2037 class Tag BASE_EMBEDDED { 2105 class Tag BASE_EMBEDDED {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2095 EmbeddedVector<char, 64> filename_; 2163 EmbeddedVector<char, 64> filename_;
2096 HeapStringAllocator string_allocator_; 2164 HeapStringAllocator string_allocator_;
2097 StringStream trace_; 2165 StringStream trace_;
2098 int indent_; 2166 int indent_;
2099 }; 2167 };
2100 2168
2101 2169
2102 } } // namespace v8::internal 2170 } } // namespace v8::internal
2103 2171
2104 #endif // V8_HYDROGEN_H_ 2172 #endif // V8_HYDROGEN_H_
OLDNEW
« no previous file with comments | « src/heap-snapshot-generator.cc ('k') | src/hydrogen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698