@@ -2837,6 +2837,8 @@ template <Operation kOperation>
28372837ReduceResult MaglevGraphBuilder::VisitBinaryOperation() {
28382838 FeedbackNexus nexus = FeedbackNexusForOperand(1);
28392839 BinaryOperationHint feedback_hint = nexus.GetBinaryOperationFeedback();
2840+ ValueNode* left = LoadRegister(0);
2841+ ValueNode* right = GetAccumulator();
28402842 switch (feedback_hint) {
28412843 case BinaryOperationHint::kNone:
28422844 return EmitUnconditionalDeopt(
@@ -2866,8 +2868,6 @@ ReduceResult MaglevGraphBuilder::VisitBinaryOperation() {
28662868 }
28672869 case BinaryOperationHint::kString:
28682870 if constexpr (kOperation == Operation::kAdd) {
2869- ValueNode* left = LoadRegister(0);
2870- ValueNode* right = GetAccumulator();
28712871 return BuildStringConcat(left, right);
28722872 }
28732873 break;
@@ -2876,8 +2876,6 @@ ReduceResult MaglevGraphBuilder::VisitBinaryOperation() {
28762876 if (broker()
28772877 ->dependencies()
28782878 ->DependOnStringWrapperToPrimitiveProtector()) {
2879- ValueNode* left = LoadRegister(0);
2880- ValueNode* right = GetAccumulator();
28812879 BuildCheckStringOrStringWrapper(left);
28822880 BuildCheckStringOrStringWrapper(right);
28832881 left = BuildUnwrapStringWrapper(left);
@@ -2892,6 +2890,15 @@ ReduceResult MaglevGraphBuilder::VisitBinaryOperation() {
28922890 // Fallback to generic node.
28932891 break;
28942892 }
2893+ if constexpr (kOperation == Operation::kAdd) {
2894+ if (CheckType(left, NodeType::kString)) {
2895+ right = BuildToString(right, ToString::kForAdd);
2896+ return BuildStringConcat(left, right);
2897+ } else if (CheckType(right, NodeType::kString)) {
2898+ left = BuildToString(left, ToString::kForAdd);
2899+ return BuildStringConcat(left, right);
2900+ }
2901+ }
28952902 BuildGenericBinaryOperationNode<kOperation>();
28962903 return ReduceResult::Done();
28972904}
0 commit comments