| Index: runtime/vm/flow_graph_optimizer.cc
|
| diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
|
| index 7f3796df6c3c9f172b6ecfe2a1c340eb4cba2898..252aa4aa0b375037309d35a82e4b70fdfbf4400f 100644
|
| --- a/runtime/vm/flow_graph_optimizer.cc
|
| +++ b/runtime/vm/flow_graph_optimizer.cc
|
| @@ -612,6 +612,10 @@ void FlowGraphOptimizer::InsertConversion(Representation from,
|
| converted = new(I) UnboxedIntConverterInstr(from, to, use->CopyWithType());
|
| } else if ((from == kUnboxedUint32) && (to == kUnboxedMint)) {
|
| converted = new(I) UnboxedIntConverterInstr(from, to, use->CopyWithType());
|
| + } else if ((from == kTagged) && (to == kUnboxedUint32)) {
|
| + const intptr_t deopt_id = (deopt_target != NULL) ?
|
| + deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
|
| + converted = new UnboxUint32Instr(use->CopyWithType(), deopt_id);
|
| } else if (from == kUnboxedMint && to == kUnboxedDouble) {
|
| ASSERT(CanUnboxDouble());
|
| // Convert by boxing/unboxing.
|
| @@ -3233,6 +3237,16 @@ bool FlowGraphOptimizer::TryInlineInt32x4Constructor(
|
| new(I) Value(call->ArgumentAt(1)), call->deopt_id());
|
| ReplaceCall(call, cast);
|
| return true;
|
| + } else if (recognized_kind == MethodRecognizer::kInt32x4Constructor) {
|
| + Int32x4ConstructorInstr* con =
|
| + new(I) Int32x4ConstructorInstr(
|
| + new(I) Value(call->ArgumentAt(1)),
|
| + new(I) Value(call->ArgumentAt(2)),
|
| + new(I) Value(call->ArgumentAt(3)),
|
| + new(I) Value(call->ArgumentAt(4)),
|
| + call->deopt_id());
|
| + ReplaceCall(call, con);
|
| + return true;
|
| }
|
| return false;
|
| }
|
| @@ -4275,7 +4289,8 @@ void FlowGraphOptimizer::VisitStaticCall(StaticCallInstr* call) {
|
| (recognized_kind == MethodRecognizer::kFloat64x2Splat) ||
|
| (recognized_kind == MethodRecognizer::kFloat64x2FromFloat32x4)) {
|
| TryInlineFloat64x2Constructor(call, recognized_kind);
|
| - } else if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
|
| + } else if ((recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) ||
|
| + (recognized_kind == MethodRecognizer::kInt32x4Constructor)) {
|
| TryInlineInt32x4Constructor(call, recognized_kind);
|
| } else if (recognized_kind == MethodRecognizer::kObjectConstructor) {
|
| // Remove the original push arguments.
|
| @@ -8098,6 +8113,12 @@ void ConstantPropagator::VisitFloat32x4ToInt32x4(
|
| }
|
|
|
|
|
| +void ConstantPropagator::VisitInt32x4Constructor(
|
| + Int32x4ConstructorInstr* instr) {
|
| + SetValue(instr, non_constant_);
|
| +}
|
| +
|
| +
|
| void ConstantPropagator::VisitInt32x4BoolConstructor(
|
| Int32x4BoolConstructorInstr* instr) {
|
| SetValue(instr, non_constant_);
|
|
|