| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/js-graph.h" | 5 #include "src/compiler/js-graph.h" |
| 6 #include "src/compiler/js-typed-lowering.h" | 6 #include "src/compiler/js-typed-lowering.h" |
| 7 #include "src/compiler/machine-operator.h" | 7 #include "src/compiler/machine-operator.h" |
| 8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
| 9 #include "src/compiler/opcodes.h" | 9 #include "src/compiler/opcodes.h" |
| 10 #include "src/compiler/operator-properties.h" | 10 #include "src/compiler/operator-properties.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 Node* ReduceUnop(const Operator* op, Type* input_type) { | 106 Node* ReduceUnop(const Operator* op, Type* input_type) { |
| 107 return reduce(Unop(op, Parameter(input_type))); | 107 return reduce(Unop(op, Parameter(input_type))); |
| 108 } | 108 } |
| 109 | 109 |
| 110 Node* ReduceBinop(const Operator* op, Type* left_type, Type* right_type) { | 110 Node* ReduceBinop(const Operator* op, Type* left_type, Type* right_type) { |
| 111 return reduce(Binop(op, Parameter(left_type, 0), Parameter(right_type, 1))); | 111 return reduce(Binop(op, Parameter(left_type, 0), Parameter(right_type, 1))); |
| 112 } | 112 } |
| 113 | 113 |
| 114 Node* Binop(const Operator* op, Node* left, Node* right) { | 114 Node* Binop(const Operator* op, Node* left, Node* right) { |
| 115 // JS binops also require context, effect, and control | 115 // JS binops also require context, effect, and control |
| 116 if (OperatorProperties::HasFrameStateInput(op)) { | 116 if (OperatorProperties::GetFrameStateInputCount(op) == 1) { |
| 117 return graph.NewNode(op, left, right, context(), | 117 return graph.NewNode(op, left, right, context(), |
| 118 EmptyFrameState(context()), start(), control()); | 118 EmptyFrameState(context()), start(), control()); |
| 119 } else if (OperatorProperties::GetFrameStateInputCount(op) == 2) { |
| 120 return graph.NewNode(op, left, right, context(), |
| 121 EmptyFrameState(context()), |
| 122 EmptyFrameState(context()), start(), control()); |
| 119 } else { | 123 } else { |
| 120 return graph.NewNode(op, left, right, context(), start(), control()); | 124 return graph.NewNode(op, left, right, context(), start(), control()); |
| 121 } | 125 } |
| 122 } | 126 } |
| 123 | 127 |
| 124 Node* Unop(const Operator* op, Node* input) { | 128 Node* Unop(const Operator* op, Node* input) { |
| 125 // JS unops also require context, effect, and control | 129 // JS unops also require context, effect, and control |
| 126 if (OperatorProperties::HasFrameStateInput(op)) { | 130 if (OperatorProperties::GetFrameStateInputCount(op) > 0) { |
| 131 DCHECK(OperatorProperties::GetFrameStateInputCount(op) == 1); |
| 127 return graph.NewNode(op, input, context(), EmptyFrameState(context()), | 132 return graph.NewNode(op, input, context(), EmptyFrameState(context()), |
| 128 start(), control()); | 133 start(), control()); |
| 129 } else { | 134 } else { |
| 130 return graph.NewNode(op, input, context(), start(), control()); | 135 return graph.NewNode(op, input, context(), start(), control()); |
| 131 } | 136 } |
| 132 } | 137 } |
| 133 | 138 |
| 134 Node* UseForEffect(Node* node) { | 139 Node* UseForEffect(Node* node) { |
| 135 // TODO(titzer): use EffectPhi after fixing EffectCount | 140 // TODO(titzer): use EffectPhi after fixing EffectCount |
| 136 if (OperatorProperties::HasFrameStateInput(javascript.ToNumber())) { | 141 if (OperatorProperties::GetFrameStateInputCount(javascript.ToNumber()) > |
| 142 0) { |
| 143 DCHECK(OperatorProperties::GetFrameStateInputCount( |
| 144 javascript.ToNumber()) == 1); |
| 137 return graph.NewNode(javascript.ToNumber(), node, context(), | 145 return graph.NewNode(javascript.ToNumber(), node, context(), |
| 138 EmptyFrameState(context()), node, control()); | 146 EmptyFrameState(context()), node, control()); |
| 139 } else { | 147 } else { |
| 140 return graph.NewNode(javascript.ToNumber(), node, context(), node, | 148 return graph.NewNode(javascript.ToNumber(), node, context(), node, |
| 141 control()); | 149 control()); |
| 142 } | 150 } |
| 143 } | 151 } |
| 144 | 152 |
| 145 void CheckEffectInput(Node* effect, Node* use) { | 153 void CheckEffectInput(Node* effect, Node* use) { |
| 146 CHECK_EQ(effect, NodeProperties::GetEffectInput(use)); | 154 CHECK_EQ(effect, NodeProperties::GetEffectInput(use)); |
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 | 749 |
| 742 Node* effect_use = NULL; | 750 Node* effect_use = NULL; |
| 743 for (int i = 0; i < 10; i++) { | 751 for (int i = 0; i < 10; i++) { |
| 744 Node* p0 = R.Parameter(Type::Number()); | 752 Node* p0 = R.Parameter(Type::Number()); |
| 745 Node* ton = R.Unop(R.javascript.ToNumber(), p0); | 753 Node* ton = R.Unop(R.javascript.ToNumber(), p0); |
| 746 Node* frame_state = R.EmptyFrameState(R.context()); | 754 Node* frame_state = R.EmptyFrameState(R.context()); |
| 747 effect_use = NULL; | 755 effect_use = NULL; |
| 748 | 756 |
| 749 switch (i) { | 757 switch (i) { |
| 750 case 0: | 758 case 0: |
| 751 // TODO(jarin) Replace with a query of FLAG_turbo_deoptimization. | 759 if (FLAG_turbo_deoptimization) { |
| 752 if (OperatorProperties::HasFrameStateInput(R.javascript.ToNumber())) { | 760 DCHECK(OperatorProperties::GetFrameStateInputCount( |
| 761 R.javascript.ToNumber()) == 1); |
| 753 effect_use = R.graph.NewNode(R.javascript.ToNumber(), p0, R.context(), | 762 effect_use = R.graph.NewNode(R.javascript.ToNumber(), p0, R.context(), |
| 754 frame_state, ton, R.start()); | 763 frame_state, ton, R.start()); |
| 755 } else { | 764 } else { |
| 756 effect_use = R.graph.NewNode(R.javascript.ToNumber(), p0, R.context(), | 765 effect_use = R.graph.NewNode(R.javascript.ToNumber(), p0, R.context(), |
| 757 ton, R.start()); | 766 ton, R.start()); |
| 758 } | 767 } |
| 759 break; | 768 break; |
| 760 case 1: | 769 case 1: |
| 761 // TODO(jarin) Replace with a query of FLAG_turbo_deoptimization. | 770 if (FLAG_turbo_deoptimization) { |
| 762 if (OperatorProperties::HasFrameStateInput(R.javascript.ToNumber())) { | 771 DCHECK(OperatorProperties::GetFrameStateInputCount( |
| 772 R.javascript.ToNumber()) == 1); |
| 763 effect_use = | 773 effect_use = |
| 764 R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), | 774 R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), |
| 765 frame_state, ton, R.start()); | 775 frame_state, ton, R.start()); |
| 766 } else { | 776 } else { |
| 767 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, | 777 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, |
| 768 R.context(), ton, R.start()); | 778 R.context(), ton, R.start()); |
| 769 } | 779 } |
| 770 break; | 780 break; |
| 771 case 2: | 781 case 2: |
| 772 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); | 782 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); |
| 773 case 3: | 783 case 3: |
| 774 effect_use = R.graph.NewNode(R.javascript.Add(), ton, ton, R.context(), | 784 effect_use = R.graph.NewNode(R.javascript.Add(), ton, ton, R.context(), |
| 775 frame_state, ton, R.start()); | 785 frame_state, frame_state, ton, R.start()); |
| 776 break; | 786 break; |
| 777 case 4: | 787 case 4: |
| 778 effect_use = R.graph.NewNode(R.javascript.Add(), p0, p0, R.context(), | 788 effect_use = R.graph.NewNode(R.javascript.Add(), p0, p0, R.context(), |
| 779 frame_state, ton, R.start()); | 789 frame_state, frame_state, ton, R.start()); |
| 780 break; | 790 break; |
| 781 case 5: | 791 case 5: |
| 782 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); | 792 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); |
| 783 break; | 793 break; |
| 784 case 6: | 794 case 6: |
| 785 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); | 795 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); |
| 786 } | 796 } |
| 787 | 797 |
| 788 R.CheckEffectInput(R.start(), ton); | 798 R.CheckEffectInput(R.start(), ton); |
| 789 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); | 799 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1281 CHECK_EQ(p1, r->InputAt(0)); | 1291 CHECK_EQ(p1, r->InputAt(0)); |
| 1282 CHECK_EQ(p0, r->InputAt(1)); | 1292 CHECK_EQ(p0, r->InputAt(1)); |
| 1283 } else { | 1293 } else { |
| 1284 CHECK_EQ(p0, r->InputAt(0)); | 1294 CHECK_EQ(p0, r->InputAt(0)); |
| 1285 CHECK_EQ(p1, r->InputAt(1)); | 1295 CHECK_EQ(p1, r->InputAt(1)); |
| 1286 } | 1296 } |
| 1287 } | 1297 } |
| 1288 } | 1298 } |
| 1289 } | 1299 } |
| 1290 } | 1300 } |
| OLD | NEW |