| Index: runtime/vm/flow_graph_optimizer.cc
|
| ===================================================================
|
| --- runtime/vm/flow_graph_optimizer.cc (revision 13352)
|
| +++ runtime/vm/flow_graph_optimizer.cc (working copy)
|
| @@ -522,17 +522,20 @@
|
| }
|
| break;
|
| case Token::kSHR:
|
| + case Token::kSHL:
|
| if (HasOnlyTwoSmis(ic_data)) {
|
| operands_type = kSmiCid;
|
| - } else if (HasTwoMintOrSmi(ic_data) &&
|
| - FlowGraphCompiler::SupportsUnboxedMints()) {
|
| + } else if (FlowGraphCompiler::SupportsUnboxedMints() &&
|
| + HasTwoMintOrSmi(ic_data) &&
|
| + HasOnlyOneSmi(ICData::Handle(
|
| + ic_data.AsUnaryClassChecksForArgNr(1)))) {
|
| + // Check for smi/mint << smi or smi/mint >> smi.
|
| operands_type = kMintCid;
|
| } else {
|
| return false;
|
| }
|
| break;
|
| case Token::kTRUNCDIV:
|
| - case Token::kSHL:
|
| if (HasOnlyTwoSmis(ic_data)) {
|
| operands_type = kSmiCid;
|
| } else {
|
| @@ -564,7 +567,7 @@
|
| } else if (operands_type == kMintCid) {
|
| Value* left = call->ArgumentAt(0)->value();
|
| Value* right = call->ArgumentAt(1)->value();
|
| - if (op_kind == Token::kSHR) {
|
| + if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
|
| ShiftMintOpInstr* shift_op =
|
| new ShiftMintOpInstr(op_kind, left, right, call);
|
| call->ReplaceWith(shift_op, current_iterator());
|
|
|