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/access-builder.h" | 5 #include "src/compiler/access-builder.h" |
6 #include "src/compiler/graph-inl.h" | 6 #include "src/compiler/graph-inl.h" |
7 #include "src/compiler/js-builtin-reducer.h" | 7 #include "src/compiler/js-builtin-reducer.h" |
8 #include "src/compiler/js-typed-lowering.h" | 8 #include "src/compiler/js-typed-lowering.h" |
9 #include "src/compiler/node-aux-data-inl.h" | 9 #include "src/compiler/node-aux-data-inl.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 // Relax the effects of {node} by immediately replacing effect uses of {node} | 23 // Relax the effects of {node} by immediately replacing effect uses of {node} |
24 // with the effect input to {node}. | 24 // with the effect input to {node}. |
25 // TODO(turbofan): replace the effect input to {node} with {graph->start()}. | 25 // TODO(turbofan): replace the effect input to {node} with {graph->start()}. |
26 // TODO(titzer): move into a GraphEditor? | 26 // TODO(titzer): move into a GraphEditor? |
27 static void RelaxEffects(Node* node) { | 27 static void RelaxEffects(Node* node) { |
28 NodeProperties::ReplaceWithValue(node, node, NULL); | 28 NodeProperties::ReplaceWithValue(node, node, NULL); |
29 } | 29 } |
30 | 30 |
31 | 31 |
| 32 JSTypedLowering::JSTypedLowering(JSGraph* jsgraph) |
| 33 : jsgraph_(jsgraph), simplified_(jsgraph->zone()) { |
| 34 Factory* factory = zone()->isolate()->factory(); |
| 35 Handle<Object> zero = factory->NewNumber(0.0); |
| 36 Handle<Object> one = factory->NewNumber(1.0); |
| 37 zero_range_ = Type::Range(zero, zero, zone()); |
| 38 one_range_ = Type::Range(one, one, zone()); |
| 39 } |
| 40 |
| 41 |
32 JSTypedLowering::~JSTypedLowering() {} | 42 JSTypedLowering::~JSTypedLowering() {} |
33 | 43 |
34 | 44 |
35 Reduction JSTypedLowering::ReplaceEagerly(Node* old, Node* node) { | 45 Reduction JSTypedLowering::ReplaceEagerly(Node* old, Node* node) { |
36 NodeProperties::ReplaceWithValue(old, node, node); | 46 NodeProperties::ReplaceWithValue(old, node, node); |
37 return Changed(node); | 47 return Changed(node); |
38 } | 48 } |
39 | 49 |
40 | 50 |
41 // A helper class to simplify the process of reducing a single binop node with a | 51 // A helper class to simplify the process of reducing a single binop node with a |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 // JSAdd(x:string, y) => StringAdd(x, ToString(y)) | 262 // JSAdd(x:string, y) => StringAdd(x, ToString(y)) |
253 // JSAdd(x, y:string) => StringAdd(ToString(x), y) | 263 // JSAdd(x, y:string) => StringAdd(ToString(x), y) |
254 r.ConvertInputsToString(); | 264 r.ConvertInputsToString(); |
255 return r.ChangeToPureOperator(simplified()->StringAdd()); | 265 return r.ChangeToPureOperator(simplified()->StringAdd()); |
256 } | 266 } |
257 #endif | 267 #endif |
258 return NoChange(); | 268 return NoChange(); |
259 } | 269 } |
260 | 270 |
261 | 271 |
| 272 Reduction JSTypedLowering::ReduceJSBitwiseOr(Node* node) { |
| 273 JSBinopReduction r(this, node); |
| 274 if (r.BothInputsAre(Type::Primitive()) || r.OneInputIs(zero_range_)) { |
| 275 // TODO(jarin): Propagate frame state input from non-primitive input node to |
| 276 // JSToNumber node. |
| 277 // TODO(titzer): some Smi bitwise operations don't really require going |
| 278 // all the way to int32, which can save tagging/untagging for some |
| 279 // operations |
| 280 // on some platforms. |
| 281 // TODO(turbofan): make this heuristic configurable for code size. |
| 282 r.ConvertInputsToInt32(true, true); |
| 283 return r.ChangeToPureOperator(machine()->Word32Or()); |
| 284 } |
| 285 return NoChange(); |
| 286 } |
| 287 |
| 288 |
| 289 Reduction JSTypedLowering::ReduceJSMultiply(Node* node) { |
| 290 JSBinopReduction r(this, node); |
| 291 if (r.BothInputsAre(Type::Primitive()) || r.OneInputIs(one_range_)) { |
| 292 // TODO(jarin): Propagate frame state input from non-primitive input node to |
| 293 // JSToNumber node. |
| 294 r.ConvertInputsToNumber(); |
| 295 return r.ChangeToPureOperator(simplified()->NumberMultiply()); |
| 296 } |
| 297 // TODO(turbofan): relax/remove the effects of this operator in other cases. |
| 298 return NoChange(); |
| 299 } |
| 300 |
| 301 |
262 Reduction JSTypedLowering::ReduceNumberBinop(Node* node, | 302 Reduction JSTypedLowering::ReduceNumberBinop(Node* node, |
263 const Operator* numberOp) { | 303 const Operator* numberOp) { |
264 JSBinopReduction r(this, node); | 304 JSBinopReduction r(this, node); |
265 if (r.BothInputsAre(Type::Primitive())) { | 305 if (r.BothInputsAre(Type::Primitive())) { |
266 r.ConvertInputsToNumber(); | 306 r.ConvertInputsToNumber(); |
267 return r.ChangeToPureOperator(numberOp); | 307 return r.ChangeToPureOperator(numberOp); |
268 } | 308 } |
269 #if 0 | 309 #if 0 |
270 // TODO(turbofan): General ToNumber disabled for now because: | 310 // TODO(turbofan): General ToNumber disabled for now because: |
271 // a) The inserted ToNumber operation screws up observability of valueOf. | 311 // a) The inserted ToNumber operation screws up observability of valueOf. |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 case IrOpcode::kJSStrictEqual: | 730 case IrOpcode::kJSStrictEqual: |
691 return ReduceJSStrictEqual(node, false); | 731 return ReduceJSStrictEqual(node, false); |
692 case IrOpcode::kJSStrictNotEqual: | 732 case IrOpcode::kJSStrictNotEqual: |
693 return ReduceJSStrictEqual(node, true); | 733 return ReduceJSStrictEqual(node, true); |
694 case IrOpcode::kJSLessThan: // fall through | 734 case IrOpcode::kJSLessThan: // fall through |
695 case IrOpcode::kJSGreaterThan: // fall through | 735 case IrOpcode::kJSGreaterThan: // fall through |
696 case IrOpcode::kJSLessThanOrEqual: // fall through | 736 case IrOpcode::kJSLessThanOrEqual: // fall through |
697 case IrOpcode::kJSGreaterThanOrEqual: | 737 case IrOpcode::kJSGreaterThanOrEqual: |
698 return ReduceJSComparison(node); | 738 return ReduceJSComparison(node); |
699 case IrOpcode::kJSBitwiseOr: | 739 case IrOpcode::kJSBitwiseOr: |
700 return ReduceI32Binop(node, true, true, machine()->Word32Or()); | 740 return ReduceJSBitwiseOr(node); |
701 case IrOpcode::kJSBitwiseXor: | 741 case IrOpcode::kJSBitwiseXor: |
702 return ReduceI32Binop(node, true, true, machine()->Word32Xor()); | 742 return ReduceI32Binop(node, true, true, machine()->Word32Xor()); |
703 case IrOpcode::kJSBitwiseAnd: | 743 case IrOpcode::kJSBitwiseAnd: |
704 return ReduceI32Binop(node, true, true, machine()->Word32And()); | 744 return ReduceI32Binop(node, true, true, machine()->Word32And()); |
705 case IrOpcode::kJSShiftLeft: | 745 case IrOpcode::kJSShiftLeft: |
706 return ReduceI32Shift(node, true, machine()->Word32Shl()); | 746 return ReduceI32Shift(node, true, machine()->Word32Shl()); |
707 case IrOpcode::kJSShiftRight: | 747 case IrOpcode::kJSShiftRight: |
708 return ReduceI32Shift(node, true, machine()->Word32Sar()); | 748 return ReduceI32Shift(node, true, machine()->Word32Sar()); |
709 case IrOpcode::kJSShiftRightLogical: | 749 case IrOpcode::kJSShiftRightLogical: |
710 return ReduceI32Shift(node, false, machine()->Word32Shr()); | 750 return ReduceI32Shift(node, false, machine()->Word32Shr()); |
711 case IrOpcode::kJSAdd: | 751 case IrOpcode::kJSAdd: |
712 return ReduceJSAdd(node); | 752 return ReduceJSAdd(node); |
713 case IrOpcode::kJSSubtract: | 753 case IrOpcode::kJSSubtract: |
714 return ReduceNumberBinop(node, simplified()->NumberSubtract()); | 754 return ReduceNumberBinop(node, simplified()->NumberSubtract()); |
715 case IrOpcode::kJSMultiply: | 755 case IrOpcode::kJSMultiply: |
716 return ReduceNumberBinop(node, simplified()->NumberMultiply()); | 756 return ReduceJSMultiply(node); |
717 case IrOpcode::kJSDivide: | 757 case IrOpcode::kJSDivide: |
718 return ReduceNumberBinop(node, simplified()->NumberDivide()); | 758 return ReduceNumberBinop(node, simplified()->NumberDivide()); |
719 case IrOpcode::kJSModulus: | 759 case IrOpcode::kJSModulus: |
720 return ReduceNumberBinop(node, simplified()->NumberModulus()); | 760 return ReduceNumberBinop(node, simplified()->NumberModulus()); |
721 case IrOpcode::kJSUnaryNot: { | 761 case IrOpcode::kJSUnaryNot: { |
722 Reduction result = ReduceJSToBooleanInput(node->InputAt(0)); | 762 Reduction result = ReduceJSToBooleanInput(node->InputAt(0)); |
723 Node* value; | 763 Node* value; |
724 if (result.Changed()) { | 764 if (result.Changed()) { |
725 // JSUnaryNot(x:boolean) => BooleanNot(x) | 765 // JSUnaryNot(x:boolean) => BooleanNot(x) |
726 value = | 766 value = |
(...skipping 27 matching lines...) Expand all Loading... |
754 return JSBuiltinReducer(jsgraph()).Reduce(node); | 794 return JSBuiltinReducer(jsgraph()).Reduce(node); |
755 default: | 795 default: |
756 break; | 796 break; |
757 } | 797 } |
758 return NoChange(); | 798 return NoChange(); |
759 } | 799 } |
760 | 800 |
761 } // namespace compiler | 801 } // namespace compiler |
762 } // namespace internal | 802 } // namespace internal |
763 } // namespace v8 | 803 } // namespace v8 |
OLD | NEW |