| OLD | NEW | 
|     1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file |     1 // Copyright (c) 2012, 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/flow_graph_builder.h" |     9 #include "vm/flow_graph_builder.h" | 
|    10 #include "vm/flow_graph_compiler.h" |    10 #include "vm/flow_graph_compiler.h" | 
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   515       if (HasOnlyTwoSmis(ic_data)) { |   515       if (HasOnlyTwoSmis(ic_data)) { | 
|   516         operands_type = kSmiCid; |   516         operands_type = kSmiCid; | 
|   517       } else if (HasTwoMintOrSmi(ic_data) && |   517       } else if (HasTwoMintOrSmi(ic_data) && | 
|   518                  FlowGraphCompiler::SupportsUnboxedMints()) { |   518                  FlowGraphCompiler::SupportsUnboxedMints()) { | 
|   519         operands_type = kMintCid; |   519         operands_type = kMintCid; | 
|   520       } else { |   520       } else { | 
|   521         return false; |   521         return false; | 
|   522       } |   522       } | 
|   523       break; |   523       break; | 
|   524     case Token::kSHR: |   524     case Token::kSHR: | 
 |   525     case Token::kSHL: | 
|   525       if (HasOnlyTwoSmis(ic_data)) { |   526       if (HasOnlyTwoSmis(ic_data)) { | 
|   526         operands_type = kSmiCid; |   527         operands_type = kSmiCid; | 
|   527       } else if (HasTwoMintOrSmi(ic_data) && |   528       } else if (FlowGraphCompiler::SupportsUnboxedMints() && | 
|   528                  FlowGraphCompiler::SupportsUnboxedMints()) { |   529                  HasTwoMintOrSmi(ic_data) && | 
 |   530                  HasOnlyOneSmi(ICData::Handle( | 
 |   531                      ic_data.AsUnaryClassChecksForArgNr(1)))) { | 
 |   532         // Check for smi/mint << smi or smi/mint >> smi. | 
|   529         operands_type = kMintCid; |   533         operands_type = kMintCid; | 
|   530       } else { |   534       } else { | 
|   531         return false; |   535         return false; | 
|   532       } |   536       } | 
|   533       break; |   537       break; | 
|   534     case Token::kTRUNCDIV: |   538     case Token::kTRUNCDIV: | 
|   535     case Token::kSHL: |  | 
|   536       if (HasOnlyTwoSmis(ic_data)) { |   539       if (HasOnlyTwoSmis(ic_data)) { | 
|   537         operands_type = kSmiCid; |   540         operands_type = kSmiCid; | 
|   538       } else { |   541       } else { | 
|   539         return false; |   542         return false; | 
|   540       } |   543       } | 
|   541       break; |   544       break; | 
|   542     default: |   545     default: | 
|   543       UNREACHABLE(); |   546       UNREACHABLE(); | 
|   544   }; |   547   }; | 
|   545  |   548  | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|   557                  call->env(), |   560                  call->env(), | 
|   558                  Definition::kEffect); |   561                  Definition::kEffect); | 
|   559  |   562  | 
|   560     BinaryDoubleOpInstr* double_bin_op = |   563     BinaryDoubleOpInstr* double_bin_op = | 
|   561         new BinaryDoubleOpInstr(op_kind, left->Copy(), right->Copy(), call); |   564         new BinaryDoubleOpInstr(op_kind, left->Copy(), right->Copy(), call); | 
|   562     call->ReplaceWith(double_bin_op, current_iterator()); |   565     call->ReplaceWith(double_bin_op, current_iterator()); | 
|   563     RemovePushArguments(call); |   566     RemovePushArguments(call); | 
|   564   } else if (operands_type == kMintCid) { |   567   } else if (operands_type == kMintCid) { | 
|   565     Value* left = call->ArgumentAt(0)->value(); |   568     Value* left = call->ArgumentAt(0)->value(); | 
|   566     Value* right = call->ArgumentAt(1)->value(); |   569     Value* right = call->ArgumentAt(1)->value(); | 
|   567     if (op_kind == Token::kSHR) { |   570     if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) { | 
|   568       ShiftMintOpInstr* shift_op = |   571       ShiftMintOpInstr* shift_op = | 
|   569           new ShiftMintOpInstr(op_kind, left, right, call); |   572           new ShiftMintOpInstr(op_kind, left, right, call); | 
|   570       call->ReplaceWith(shift_op, current_iterator()); |   573       call->ReplaceWith(shift_op, current_iterator()); | 
|   571     } else { |   574     } else { | 
|   572       BinaryMintOpInstr* bin_op = |   575       BinaryMintOpInstr* bin_op = | 
|   573           new BinaryMintOpInstr(op_kind, left, right, call); |   576           new BinaryMintOpInstr(op_kind, left, right, call); | 
|   574       call->ReplaceWith(bin_op, current_iterator()); |   577       call->ReplaceWith(bin_op, current_iterator()); | 
|   575     } |   578     } | 
|   576     RemovePushArguments(call); |   579     RemovePushArguments(call); | 
|   577   } else if (op_kind == Token::kMOD) { |   580   } else if (op_kind == Token::kMOD) { | 
| (...skipping 2671 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3249  |  3252  | 
|  3250   if (FLAG_trace_constant_propagation) { |  3253   if (FLAG_trace_constant_propagation) { | 
|  3251     OS::Print("\n==== After constant propagation ====\n"); |  3254     OS::Print("\n==== After constant propagation ====\n"); | 
|  3252     FlowGraphPrinter printer(*graph_); |  3255     FlowGraphPrinter printer(*graph_); | 
|  3253     printer.PrintBlocks(); |  3256     printer.PrintBlocks(); | 
|  3254   } |  3257   } | 
|  3255 } |  3258 } | 
|  3256  |  3259  | 
|  3257  |  3260  | 
|  3258 }  // namespace dart |  3261 }  // namespace dart | 
| OLD | NEW |