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

Side by Side Diff: runtime/vm/intermediate_language.cc

Issue 14935005: Implement a variation of scalar replacement for non-escaping allocations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address comments Created 7 years, 7 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 | « runtime/vm/intermediate_language.h ('k') | runtime/vm/isolate.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 (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/intermediate_language.h" 5 #include "vm/intermediate_language.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/dart_entry.h" 8 #include "vm/dart_entry.h"
9 #include "vm/flow_graph_allocator.h" 9 #include "vm/flow_graph_allocator.h"
10 #include "vm/flow_graph_builder.h" 10 #include "vm/flow_graph_builder.h"
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 150
151 151
152 EffectSet LoadFieldInstr::Dependencies() const { 152 EffectSet LoadFieldInstr::Dependencies() const {
153 return immutable_ ? EffectSet::None() : EffectSet::All(); 153 return immutable_ ? EffectSet::None() : EffectSet::All();
154 } 154 }
155 155
156 156
157 bool LoadFieldInstr::AttributesEqual(Instruction* other) const { 157 bool LoadFieldInstr::AttributesEqual(Instruction* other) const {
158 LoadFieldInstr* other_load = other->AsLoadField(); 158 LoadFieldInstr* other_load = other->AsLoadField();
159 ASSERT(other_load != NULL); 159 ASSERT(other_load != NULL);
160 ASSERT((offset_in_bytes() != other_load->offset_in_bytes()) || 160 if (field() != NULL) {
161 ((immutable_ == other_load->immutable_))); 161 return (other_load->field() != NULL) &&
162 return offset_in_bytes() == other_load->offset_in_bytes(); 162 (field()->raw() == other_load->field()->raw());
163 }
164 return (other_load->field() == NULL) &&
165 (offset_in_bytes() == other_load->offset_in_bytes());
163 } 166 }
164 167
165 168
166 EffectSet LoadStaticFieldInstr::Dependencies() const { 169 EffectSet LoadStaticFieldInstr::Dependencies() const {
167 return field().is_final() ? EffectSet::None() : EffectSet::All(); 170 return field().is_final() ? EffectSet::None() : EffectSet::All();
168 } 171 }
169 172
170 173
171 bool LoadStaticFieldInstr::AttributesEqual(Instruction* other) const { 174 bool LoadStaticFieldInstr::AttributesEqual(Instruction* other) const {
172 LoadStaticFieldInstr* other_load = other->AsLoadStaticField(); 175 LoadStaticFieldInstr* other_load = other->AsLoadStaticField();
(...skipping 987 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 case kGrowableObjectArrayCid: 1163 case kGrowableObjectArrayCid:
1161 return MethodRecognizer::kGrowableArrayLength; 1164 return MethodRecognizer::kGrowableArrayLength;
1162 default: 1165 default:
1163 UNREACHABLE(); 1166 UNREACHABLE();
1164 return MethodRecognizer::kUnknown; 1167 return MethodRecognizer::kUnknown;
1165 } 1168 }
1166 } 1169 }
1167 1170
1168 1171
1169 bool LoadFieldInstr::IsFixedLengthArrayCid(intptr_t cid) { 1172 bool LoadFieldInstr::IsFixedLengthArrayCid(intptr_t cid) {
1173 if (RawObject::IsTypedDataClassId(cid) ||
1174 RawObject::IsExternalTypedDataClassId(cid)) {
1175 return true;
1176 }
1177
1170 switch (cid) { 1178 switch (cid) {
1171 case kArrayCid: 1179 case kArrayCid:
1172 case kImmutableArrayCid: 1180 case kImmutableArrayCid:
1173 case kTypedDataInt8ArrayCid:
1174 case kTypedDataUint8ArrayCid:
1175 case kTypedDataUint8ClampedArrayCid:
1176 case kTypedDataInt16ArrayCid:
1177 case kTypedDataUint16ArrayCid:
1178 case kTypedDataInt32ArrayCid:
1179 case kTypedDataUint32ArrayCid:
1180 case kTypedDataInt64ArrayCid:
1181 case kTypedDataUint64ArrayCid:
1182 case kTypedDataFloat32ArrayCid:
1183 case kTypedDataFloat64ArrayCid:
1184 case kTypedDataFloat32x4ArrayCid:
1185 return true; 1181 return true;
1186 default: 1182 default:
1187 return false; 1183 return false;
1188 } 1184 }
1189 } 1185 }
1190 1186
1191 1187
1192 Definition* ConstantInstr::Canonicalize(FlowGraph* flow_graph) { 1188 Definition* ConstantInstr::Canonicalize(FlowGraph* flow_graph) {
1193 return HasUses() ? this : NULL; 1189 return HasUses() ? this : NULL;
1194 } 1190 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 comp->InputAt(i)->definition()->representation()) { 1284 comp->InputAt(i)->definition()->representation()) {
1289 return this; 1285 return this;
1290 } 1286 }
1291 } 1287 }
1292 1288
1293 // Replace the comparison if the replacement is used at this branch, 1289 // Replace the comparison if the replacement is used at this branch,
1294 // and has exactly one use. 1290 // and has exactly one use.
1295 Value* use = comp->input_use_list(); 1291 Value* use = comp->input_use_list();
1296 if ((use->instruction() == this) && comp->HasOnlyUse(use)) { 1292 if ((use->instruction() == this) && comp->HasOnlyUse(use)) {
1297 RemoveEnvironment(); 1293 RemoveEnvironment();
1298 InheritDeoptTarget(comp); 1294 flow_graph->CopyDeoptTarget(this, comp);
1299 1295
1300 comp->RemoveFromGraph(); 1296 comp->RemoveFromGraph();
1301 SetComparison(comp); 1297 SetComparison(comp);
1302 if (FLAG_trace_optimization) { 1298 if (FLAG_trace_optimization) {
1303 OS::Print("Merging comparison v%"Pd"\n", comp->ssa_temp_index()); 1299 OS::Print("Merging comparison v%"Pd"\n", comp->ssa_temp_index());
1304 } 1300 }
1305 // Clear the comparison's temp index and ssa temp index since the 1301 // Clear the comparison's temp index and ssa temp index since the
1306 // value of the comparison is not used outside the branch anymore. 1302 // value of the comparison is not used outside the branch anymore.
1307 ASSERT(comp->input_use_list() == NULL); 1303 ASSERT(comp->input_use_list() == NULL);
1308 comp->ClearSSATempIndex(); 1304 comp->ClearSSATempIndex();
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 UNREACHABLE(); 1526 UNREACHABLE();
1531 return NULL; 1527 return NULL;
1532 } 1528 }
1533 1529
1534 1530
1535 void ConstraintInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1531 void ConstraintInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1536 UNREACHABLE(); 1532 UNREACHABLE();
1537 } 1533 }
1538 1534
1539 1535
1536 LocationSummary* MaterializeObjectInstr::MakeLocationSummary() const {
1537 UNREACHABLE();
1538 return NULL;
1539 }
1540
1541
1542 void MaterializeObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1543 UNREACHABLE();
1544 }
1545
1546
1540 LocationSummary* StoreContextInstr::MakeLocationSummary() const { 1547 LocationSummary* StoreContextInstr::MakeLocationSummary() const {
1541 const intptr_t kNumInputs = 1; 1548 const intptr_t kNumInputs = 1;
1542 const intptr_t kNumTemps = 0; 1549 const intptr_t kNumTemps = 0;
1543 LocationSummary* summary = 1550 LocationSummary* summary =
1544 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 1551 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
1545 summary->set_in(0, Location::RegisterLocation(CTX)); 1552 summary->set_in(0, Location::RegisterLocation(CTX));
1546 return summary; 1553 return summary;
1547 } 1554 }
1548 1555
1549 1556
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after
2427 default: 2434 default:
2428 UNREACHABLE(); 2435 UNREACHABLE();
2429 } 2436 }
2430 return kPowRuntimeEntry; 2437 return kPowRuntimeEntry;
2431 } 2438 }
2432 2439
2433 2440
2434 #undef __ 2441 #undef __
2435 2442
2436 } // namespace dart 2443 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698