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

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

Issue 57703004: Constant fold strict comparison based on incoming types: different (exact) types means that the res… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 1 month 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/lib/integers.dart ('k') | runtime/vm/flow_graph_type_propagator.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 (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/flow_graph_optimizer.h" 5 #include "vm/flow_graph_optimizer.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/cha.h" 8 #include "vm/cha.h"
9 #include "vm/dart_entry.h" 9 #include "vm/dart_entry.h"
10 #include "vm/flow_graph_builder.h" 10 #include "vm/flow_graph_builder.h"
(...skipping 6289 matching lines...) Expand 10 before | Expand all | Expand 10 after
6300 } 6300 }
6301 6301
6302 if (IsNonConstant(left) || IsNonConstant(right)) { 6302 if (IsNonConstant(left) || IsNonConstant(right)) {
6303 // TODO(vegorov): incorporate nullability information into the lattice. 6303 // TODO(vegorov): incorporate nullability information into the lattice.
6304 if ((left.IsNull() && instr->right()->Type()->HasDecidableNullability()) || 6304 if ((left.IsNull() && instr->right()->Type()->HasDecidableNullability()) ||
6305 (right.IsNull() && instr->left()->Type()->HasDecidableNullability())) { 6305 (right.IsNull() && instr->left()->Type()->HasDecidableNullability())) {
6306 bool result = left.IsNull() ? instr->right()->Type()->IsNull() 6306 bool result = left.IsNull() ? instr->right()->Type()->IsNull()
6307 : instr->left()->Type()->IsNull(); 6307 : instr->left()->Type()->IsNull();
6308 if (instr->kind() == Token::kNE_STRICT) result = !result; 6308 if (instr->kind() == Token::kNE_STRICT) result = !result;
6309 SetValue(instr, Bool::Get(result)); 6309 SetValue(instr, Bool::Get(result));
6310 } else { 6310 return;
Kevin Millikin (Google) 2013/11/07 11:29:37 If you want the early return, this should be: if
6311 SetValue(instr, non_constant_);
6312 } 6311 }
6313 } else if (IsConstant(left) && IsConstant(right)) { 6312 }
6313 if (IsConstant(left) && IsConstant(right)) {
6314 bool result = (left.raw() == right.raw()); 6314 bool result = (left.raw() == right.raw());
6315 if (instr->kind() == Token::kNE_STRICT) result = !result; 6315 if (instr->kind() == Token::kNE_STRICT) result = !result;
6316 SetValue(instr, Bool::Get(result)); 6316 SetValue(instr, Bool::Get(result));
6317 return;
6317 } 6318 }
6319 const intptr_t left_cid = instr->left()->Type()->ToCid();
6320 const intptr_t right_cid = instr->right()->Type()->ToCid();
6321 if ((left_cid != kDynamicCid) && (right_cid != kDynamicCid)) {
6322 // If exact classes (cids) are known and they differ, the result
6323 // of strict compare can be computed.
6324 if (left_cid != right_cid) {
6325 const bool result = (instr->kind() == Token::kEQ_STRICT) ? false : true;
6326 SetValue(instr, Bool::Get(result));
6327 return;
6328 }
6329 }
6330 SetValue(instr, non_constant_);
Kevin Millikin (Google) 2013/11/07 11:29:37 Abbreviate non-constant by X, constant by C, unkno
6318 } 6331 }
6319 6332
6320 6333
6321 static bool CompareIntegers(Token::Kind kind, 6334 static bool CompareIntegers(Token::Kind kind,
6322 const Integer& left, 6335 const Integer& left,
6323 const Integer& right) { 6336 const Integer& right) {
6324 const int result = left.CompareWith(right); 6337 const int result = left.CompareWith(right);
6325 switch (kind) { 6338 switch (kind) {
6326 case Token::kEQ: return (result == 0); 6339 case Token::kEQ: return (result == 0);
6327 case Token::kNE: return (result != 0); 6340 case Token::kNE: return (result != 0);
(...skipping 1523 matching lines...) Expand 10 before | Expand all | Expand 10 after
7851 } 7864 }
7852 7865
7853 // Insert materializations at environment uses. 7866 // Insert materializations at environment uses.
7854 for (intptr_t i = 0; i < exits.length(); i++) { 7867 for (intptr_t i = 0; i < exits.length(); i++) {
7855 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields); 7868 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields);
7856 } 7869 }
7857 } 7870 }
7858 7871
7859 7872
7860 } // namespace dart 7873 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/lib/integers.dart ('k') | runtime/vm/flow_graph_type_propagator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698