Index: src/compiler/js-typed-lowering.cc |
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc |
index c0ed7c46797660ca0e036caa012b8e2874703970..628172a3029f3f8a8ee3326b3734799acbc2e41f 100644 |
--- a/src/compiler/js-typed-lowering.cc |
+++ b/src/compiler/js-typed-lowering.cc |
@@ -320,7 +320,8 @@ Reduction JSTypedLowering::ReduceJSAdd(Node* node) { |
// JSAdd(x:number, y:number) => NumberAdd(x, y) |
return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); |
} |
- if (r.NeitherInputCanBe(Type::StringOrReceiver())) { |
+ if (r.NeitherInputCanBe(Type::StringOrReceiver()) && |
+ !is_strong(OpParameter<LanguageMode>(node))) { |
Michael Starzinger
2015/04/30 09:25:56
nit: Please add JSBinopReduction::IsStrong to have
conradw
2015/04/30 09:46:04
Done.
|
// JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y)) |
Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); |
r.ConvertInputsToNumber(frame_state); |
@@ -331,7 +332,9 @@ Reduction JSTypedLowering::ReduceJSAdd(Node* node) { |
// a) The inserted ToString operation screws up valueOf vs. toString order. |
// b) Deoptimization at ToString doesn't have corresponding bailout id. |
// c) Our current StringAddStub is actually non-pure and requires context. |
- if (r.OneInputIs(Type::String())) { |
+ if (r.OneInputIs(Type::String()) && |
+ (!is_strong(OpParameter<LanguageMode>(node)) || |
+ r.BothInputsAre(Type::String()))) { |
// JSAdd(x:string, y:string) => StringAdd(x, y) |
// JSAdd(x:string, y) => StringAdd(x, ToString(y)) |
// JSAdd(x, y:string) => StringAdd(ToString(x), y) |