| 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/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
| 9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
| 10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
| (...skipping 3554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3565 Node* AstGraphBuilder::BuildStoreExternal(ExternalReference reference, | 3565 Node* AstGraphBuilder::BuildStoreExternal(ExternalReference reference, |
| 3566 MachineType type, Node* value) { | 3566 MachineType type, Node* value) { |
| 3567 StoreRepresentation representation(type, kNoWriteBarrier); | 3567 StoreRepresentation representation(type, kNoWriteBarrier); |
| 3568 return NewNode(jsgraph()->machine()->Store(representation), | 3568 return NewNode(jsgraph()->machine()->Store(representation), |
| 3569 jsgraph()->ExternalConstant(reference), | 3569 jsgraph()->ExternalConstant(reference), |
| 3570 jsgraph()->IntPtrConstant(0), value); | 3570 jsgraph()->IntPtrConstant(0), value); |
| 3571 } | 3571 } |
| 3572 | 3572 |
| 3573 | 3573 |
| 3574 Node* AstGraphBuilder::BuildToBoolean(Node* input) { | 3574 Node* AstGraphBuilder::BuildToBoolean(Node* input) { |
| 3575 // TODO(titzer): This should be in a JSOperatorReducer. | 3575 // TODO(bmeurer, mstarzinger): Refactor this into a separate optimization |
| 3576 // method. |
| 3576 switch (input->opcode()) { | 3577 switch (input->opcode()) { |
| 3577 case IrOpcode::kInt32Constant: | |
| 3578 return jsgraph_->BooleanConstant(!Int32Matcher(input).Is(0)); | |
| 3579 case IrOpcode::kFloat64Constant: | |
| 3580 return jsgraph_->BooleanConstant(!Float64Matcher(input).Is(0)); | |
| 3581 case IrOpcode::kNumberConstant: | 3578 case IrOpcode::kNumberConstant: |
| 3582 return jsgraph_->BooleanConstant(!NumberMatcher(input).Is(0)); | 3579 return jsgraph_->BooleanConstant(!NumberMatcher(input).Is(0)); |
| 3583 case IrOpcode::kHeapConstant: { | 3580 case IrOpcode::kHeapConstant: { |
| 3584 Handle<Object> object = HeapObjectMatcher<Object>(input).Value().handle(); | 3581 Handle<Object> object = HeapObjectMatcher<Object>(input).Value().handle(); |
| 3585 return jsgraph_->BooleanConstant(object->BooleanValue()); | 3582 return jsgraph_->BooleanConstant(object->BooleanValue()); |
| 3586 } | 3583 } |
| 3584 case IrOpcode::kJSEqual: |
| 3585 case IrOpcode::kJSNotEqual: |
| 3586 case IrOpcode::kJSStrictEqual: |
| 3587 case IrOpcode::kJSStrictNotEqual: |
| 3588 case IrOpcode::kJSLessThan: |
| 3589 case IrOpcode::kJSLessThanOrEqual: |
| 3590 case IrOpcode::kJSGreaterThan: |
| 3591 case IrOpcode::kJSGreaterThanOrEqual: |
| 3592 case IrOpcode::kJSUnaryNot: |
| 3593 case IrOpcode::kJSToBoolean: |
| 3594 case IrOpcode::kJSDeleteProperty: |
| 3595 case IrOpcode::kJSHasProperty: |
| 3596 case IrOpcode::kJSInstanceOf: |
| 3597 return input; |
| 3587 default: | 3598 default: |
| 3588 break; | 3599 break; |
| 3589 } | 3600 } |
| 3590 if (NodeProperties::IsTyped(input)) { | |
| 3591 Type* upper = NodeProperties::GetBounds(input).upper; | |
| 3592 if (upper->Is(Type::Boolean())) return input; | |
| 3593 } | |
| 3594 | |
| 3595 return NewNode(javascript()->ToBoolean(), input); | 3601 return NewNode(javascript()->ToBoolean(), input); |
| 3596 } | 3602 } |
| 3597 | 3603 |
| 3598 | 3604 |
| 3599 Node* AstGraphBuilder::BuildToName(Node* input, BailoutId bailout_id) { | 3605 Node* AstGraphBuilder::BuildToName(Node* input, BailoutId bailout_id) { |
| 3600 // TODO(turbofan): Possible optimization is to NOP on name constants. But the | 3606 // TODO(turbofan): Possible optimization is to NOP on name constants. But the |
| 3601 // same caveat as with BuildToBoolean applies, and it should be factored out | 3607 // same caveat as with BuildToBoolean applies, and it should be factored out |
| 3602 // into a JSOperatorReducer. | 3608 // into a JSOperatorReducer. |
| 3603 Node* name = NewNode(javascript()->ToName(), input); | 3609 Node* name = NewNode(javascript()->ToName(), input); |
| 3604 PrepareFrameState(name, bailout_id); | 3610 PrepareFrameState(name, bailout_id); |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4061 // Phi does not exist yet, introduce one. | 4067 // Phi does not exist yet, introduce one. |
| 4062 value = NewPhi(inputs, value, control); | 4068 value = NewPhi(inputs, value, control); |
| 4063 value->ReplaceInput(inputs - 1, other); | 4069 value->ReplaceInput(inputs - 1, other); |
| 4064 } | 4070 } |
| 4065 return value; | 4071 return value; |
| 4066 } | 4072 } |
| 4067 | 4073 |
| 4068 } // namespace compiler | 4074 } // namespace compiler |
| 4069 } // namespace internal | 4075 } // namespace internal |
| 4070 } // namespace v8 | 4076 } // namespace v8 |
| OLD | NEW |