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

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

Issue 2487873003: Speculate on bitwise operators. (Closed)
Patch Set: . Created 4 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
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/aot_optimizer.h" 5 #include "vm/aot_optimizer.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/branch_optimizer.h" 8 #include "vm/branch_optimizer.h"
9 #include "vm/cha.h" 9 #include "vm/cha.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 // to megamorphic call. 209 // to megamorphic call.
210 return false; 210 return false;
211 } 211 }
212 GrowableArray<intptr_t> class_ids(call->ic_data()->NumArgsTested()); 212 GrowableArray<intptr_t> class_ids(call->ic_data()->NumArgsTested());
213 ASSERT(call->ic_data()->NumArgsTested() <= call->ArgumentCount()); 213 ASSERT(call->ic_data()->NumArgsTested() <= call->ArgumentCount());
214 for (intptr_t i = 0; i < call->ic_data()->NumArgsTested(); i++) { 214 for (intptr_t i = 0; i < call->ic_data()->NumArgsTested(); i++) {
215 class_ids.Add(call->PushArgumentAt(i)->value()->Type()->ToCid()); 215 class_ids.Add(call->PushArgumentAt(i)->value()->Type()->ToCid());
216 } 216 }
217 217
218 const Token::Kind op_kind = call->token_kind(); 218 const Token::Kind op_kind = call->token_kind();
219 if (Token::IsRelationalOperator(op_kind) || 219 if (FLAG_guess_icdata_cid) {
220 Token::IsEqualityOperator(op_kind) || 220 if (Token::IsBinaryBitwiseOperator(op_kind)) {
221 Token::IsBinaryOperator(op_kind)) { 221 class_ids[0] = kSmiCid;
222 // Guess cid: if one of the inputs is a number assume that the other 222 class_ids[1] = kSmiCid;
223 // is a number of same type. 223 }
224 if (FLAG_guess_icdata_cid) { 224 if (Token::IsRelationalOperator(op_kind) ||
225 Token::IsEqualityOperator(op_kind) ||
226 Token::IsBinaryOperator(op_kind)) {
227 // Guess cid: if one of the inputs is a number assume that the other
228 // is a number of same type.
225 const intptr_t cid_0 = class_ids[0]; 229 const intptr_t cid_0 = class_ids[0];
226 const intptr_t cid_1 = class_ids[1]; 230 const intptr_t cid_1 = class_ids[1];
227 if ((cid_0 == kDynamicCid) && (IsNumberCid(cid_1))) { 231 if ((cid_0 == kDynamicCid) && (IsNumberCid(cid_1))) {
228 class_ids[0] = cid_1; 232 class_ids[0] = cid_1;
229 } else if (IsNumberCid(cid_0) && (cid_1 == kDynamicCid)) { 233 } else if (IsNumberCid(cid_0) && (cid_1 == kDynamicCid)) {
230 class_ids[1] = cid_0; 234 class_ids[1] = cid_0;
231 } 235 }
232 } 236 }
233 } 237 }
234 238
(...skipping 1693 matching lines...) Expand 10 before | Expand all | Expand 10 after
1928 CheckedSmiComparisonInstr* smi_op = 1932 CheckedSmiComparisonInstr* smi_op =
1929 new(Z) CheckedSmiComparisonInstr(instr->token_kind(), 1933 new(Z) CheckedSmiComparisonInstr(instr->token_kind(),
1930 new(Z) Value(left), 1934 new(Z) Value(left),
1931 new(Z) Value(right), 1935 new(Z) Value(right),
1932 instr); 1936 instr);
1933 ReplaceCall(instr, smi_op); 1937 ReplaceCall(instr, smi_op);
1934 return; 1938 return;
1935 } 1939 }
1936 break; 1940 break;
1937 } 1941 }
1942 case Token::kSHL:
1943 case Token::kSHR:
1938 case Token::kBIT_OR: 1944 case Token::kBIT_OR:
1939 case Token::kBIT_XOR: 1945 case Token::kBIT_XOR:
1940 case Token::kBIT_AND: 1946 case Token::kBIT_AND:
1941 case Token::kADD: 1947 case Token::kADD:
1942 case Token::kSUB: 1948 case Token::kSUB:
1943 case Token::kMUL: { 1949 case Token::kMUL: {
1944 if (HasOnlyTwoOf(*instr->ic_data(), kSmiCid) || 1950 if (HasOnlyTwoOf(*instr->ic_data(), kSmiCid) ||
1945 HasLikelySmiOperand(instr)) { 1951 HasLikelySmiOperand(instr)) {
1946 Definition* left = instr->ArgumentAt(0); 1952 Definition* left = instr->ArgumentAt(0);
1947 Definition* right = instr->ArgumentAt(1); 1953 Definition* right = instr->ArgumentAt(1);
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
2342 check->env(), FlowGraph::kEffect); 2348 check->env(), FlowGraph::kEffect);
2343 current_iterator()->RemoveCurrentFromGraph(); 2349 current_iterator()->RemoveCurrentFromGraph();
2344 } 2350 }
2345 } 2351 }
2346 } 2352 }
2347 } 2353 }
2348 2354
2349 #endif // DART_PRECOMPILER 2355 #endif // DART_PRECOMPILER
2350 2356
2351 } // namespace dart 2357 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/intermediate_language_arm.cc » ('j') | runtime/vm/intermediate_language_arm.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698