OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 22 matching lines...) Expand all Loading... |
33 #include "codegen.h" | 33 #include "codegen.h" |
34 #include "full-codegen.h" | 34 #include "full-codegen.h" |
35 #include "hashmap.h" | 35 #include "hashmap.h" |
36 #include "hydrogen-bce.h" | 36 #include "hydrogen-bce.h" |
37 #include "hydrogen-dce.h" | 37 #include "hydrogen-dce.h" |
38 #include "hydrogen-environment-liveness.h" | 38 #include "hydrogen-environment-liveness.h" |
39 #include "hydrogen-escape-analysis.h" | 39 #include "hydrogen-escape-analysis.h" |
40 #include "hydrogen-infer-representation.h" | 40 #include "hydrogen-infer-representation.h" |
41 #include "hydrogen-infer-types.h" | 41 #include "hydrogen-infer-types.h" |
42 #include "hydrogen-gvn.h" | 42 #include "hydrogen-gvn.h" |
| 43 #include "hydrogen-minus-zero.h" |
43 #include "hydrogen-osr.h" | 44 #include "hydrogen-osr.h" |
44 #include "hydrogen-range-analysis.h" | 45 #include "hydrogen-range-analysis.h" |
45 #include "hydrogen-redundant-phi.h" | 46 #include "hydrogen-redundant-phi.h" |
46 #include "hydrogen-representation-changes.h" | 47 #include "hydrogen-representation-changes.h" |
47 #include "hydrogen-sce.h" | 48 #include "hydrogen-sce.h" |
48 #include "hydrogen-uint32-analysis.h" | 49 #include "hydrogen-uint32-analysis.h" |
49 #include "lithium-allocator.h" | 50 #include "lithium-allocator.h" |
50 #include "parser.h" | 51 #include "parser.h" |
51 #include "scopeinfo.h" | 52 #include "scopeinfo.h" |
52 #include "scopes.h" | 53 #include "scopes.h" |
(...skipping 2574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2627 | 2628 |
2628 if (!mergelist.is_empty()) { | 2629 if (!mergelist.is_empty()) { |
2629 // Merge the accumulated simulates at the end of the block. | 2630 // Merge the accumulated simulates at the end of the block. |
2630 HSimulate* last = mergelist.RemoveLast(); | 2631 HSimulate* last = mergelist.RemoveLast(); |
2631 last->MergeWith(&mergelist); | 2632 last->MergeWith(&mergelist); |
2632 } | 2633 } |
2633 } | 2634 } |
2634 } | 2635 } |
2635 | 2636 |
2636 | 2637 |
2637 void HGraph::PropagateMinusZeroChecks(HValue* value, BitVector* visited) { | |
2638 HValue* current = value; | |
2639 while (current != NULL) { | |
2640 if (visited->Contains(current->id())) return; | |
2641 | |
2642 // For phis, we must propagate the check to all of its inputs. | |
2643 if (current->IsPhi()) { | |
2644 visited->Add(current->id()); | |
2645 HPhi* phi = HPhi::cast(current); | |
2646 for (int i = 0; i < phi->OperandCount(); ++i) { | |
2647 PropagateMinusZeroChecks(phi->OperandAt(i), visited); | |
2648 } | |
2649 break; | |
2650 } | |
2651 | |
2652 // For multiplication, division, and Math.min/max(), we must propagate | |
2653 // to the left and the right side. | |
2654 if (current->IsMul()) { | |
2655 HMul* mul = HMul::cast(current); | |
2656 mul->EnsureAndPropagateNotMinusZero(visited); | |
2657 PropagateMinusZeroChecks(mul->left(), visited); | |
2658 PropagateMinusZeroChecks(mul->right(), visited); | |
2659 } else if (current->IsDiv()) { | |
2660 HDiv* div = HDiv::cast(current); | |
2661 div->EnsureAndPropagateNotMinusZero(visited); | |
2662 PropagateMinusZeroChecks(div->left(), visited); | |
2663 PropagateMinusZeroChecks(div->right(), visited); | |
2664 } else if (current->IsMathMinMax()) { | |
2665 HMathMinMax* minmax = HMathMinMax::cast(current); | |
2666 visited->Add(minmax->id()); | |
2667 PropagateMinusZeroChecks(minmax->left(), visited); | |
2668 PropagateMinusZeroChecks(minmax->right(), visited); | |
2669 } | |
2670 | |
2671 current = current->EnsureAndPropagateNotMinusZero(visited); | |
2672 } | |
2673 } | |
2674 | |
2675 | |
2676 void HGraph::RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi* phi) { | 2638 void HGraph::RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi* phi) { |
2677 if (!phi->CheckFlag(HValue::kAllowUndefinedAsNaN)) return; | 2639 if (!phi->CheckFlag(HValue::kAllowUndefinedAsNaN)) return; |
2678 phi->ClearFlag(HValue::kAllowUndefinedAsNaN); | 2640 phi->ClearFlag(HValue::kAllowUndefinedAsNaN); |
2679 for (int i = 0; i < phi->OperandCount(); ++i) { | 2641 for (int i = 0; i < phi->OperandCount(); ++i) { |
2680 HValue* input = phi->OperandAt(i); | 2642 HValue* input = phi->OperandAt(i); |
2681 if (input->IsPhi()) { | 2643 if (input->IsPhi()) { |
2682 RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi::cast(input)); | 2644 RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi::cast(input)); |
2683 } | 2645 } |
2684 } | 2646 } |
2685 } | 2647 } |
(...skipping 12 matching lines...) Expand all Loading... |
2698 HValue* use_value = it.value(); | 2660 HValue* use_value = it.value(); |
2699 if (!use_value->CheckFlag(HValue::kAllowUndefinedAsNaN)) { | 2661 if (!use_value->CheckFlag(HValue::kAllowUndefinedAsNaN)) { |
2700 RecursivelyMarkPhiDeoptimizeOnUndefined(phi); | 2662 RecursivelyMarkPhiDeoptimizeOnUndefined(phi); |
2701 break; | 2663 break; |
2702 } | 2664 } |
2703 } | 2665 } |
2704 } | 2666 } |
2705 } | 2667 } |
2706 | 2668 |
2707 | 2669 |
2708 void HGraph::ComputeMinusZeroChecks() { | |
2709 HPhase phase("H_Compute minus zero checks", this); | |
2710 BitVector visited(GetMaximumValueID(), zone()); | |
2711 for (int i = 0; i < blocks_.length(); ++i) { | |
2712 for (HInstructionIterator it(blocks_[i]); !it.Done(); it.Advance()) { | |
2713 HInstruction* current = it.Current(); | |
2714 if (current->IsChange()) { | |
2715 HChange* change = HChange::cast(current); | |
2716 // Propagate flags for negative zero checks upwards from conversions | |
2717 // int32-to-tagged and int32-to-double. | |
2718 Representation from = change->value()->representation(); | |
2719 ASSERT(from.Equals(change->from())); | |
2720 if (from.IsInteger32()) { | |
2721 ASSERT(change->to().IsTagged() || | |
2722 change->to().IsDouble() || | |
2723 change->to().IsSmi()); | |
2724 ASSERT(visited.IsEmpty()); | |
2725 PropagateMinusZeroChecks(change->value(), &visited); | |
2726 visited.Clear(); | |
2727 } | |
2728 } | |
2729 } | |
2730 } | |
2731 } | |
2732 | |
2733 | |
2734 // Implementation of utility class to encapsulate the translation state for | 2670 // Implementation of utility class to encapsulate the translation state for |
2735 // a (possibly inlined) function. | 2671 // a (possibly inlined) function. |
2736 FunctionState::FunctionState(HOptimizedGraphBuilder* owner, | 2672 FunctionState::FunctionState(HOptimizedGraphBuilder* owner, |
2737 CompilationInfo* info, | 2673 CompilationInfo* info, |
2738 InliningKind inlining_kind) | 2674 InliningKind inlining_kind) |
2739 : owner_(owner), | 2675 : owner_(owner), |
2740 compilation_info_(info), | 2676 compilation_info_(info), |
2741 call_context_(NULL), | 2677 call_context_(NULL), |
2742 inlining_kind_(inlining_kind), | 2678 inlining_kind_(inlining_kind), |
2743 function_return_(NULL), | 2679 function_return_(NULL), |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3214 if (FLAG_opt_safe_uint32_operations) Run<HUint32AnalysisPhase>(); | 3150 if (FLAG_opt_safe_uint32_operations) Run<HUint32AnalysisPhase>(); |
3215 | 3151 |
3216 if (FLAG_use_canonicalizing) Canonicalize(); | 3152 if (FLAG_use_canonicalizing) Canonicalize(); |
3217 | 3153 |
3218 if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>(); | 3154 if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>(); |
3219 | 3155 |
3220 if (FLAG_use_gvn) Run<HGlobalValueNumberingPhase>(); | 3156 if (FLAG_use_gvn) Run<HGlobalValueNumberingPhase>(); |
3221 | 3157 |
3222 if (FLAG_use_range) Run<HRangeAnalysisPhase>(); | 3158 if (FLAG_use_range) Run<HRangeAnalysisPhase>(); |
3223 | 3159 |
3224 ComputeMinusZeroChecks(); | 3160 Run<HComputeMinusZeroChecksPhase>(); |
3225 | 3161 |
3226 // Eliminate redundant stack checks on backwards branches. | 3162 // Eliminate redundant stack checks on backwards branches. |
3227 Run<HStackCheckEliminationPhase>(); | 3163 Run<HStackCheckEliminationPhase>(); |
3228 | 3164 |
3229 if (FLAG_idefs) SetupInformativeDefinitions(); | 3165 if (FLAG_idefs) SetupInformativeDefinitions(); |
3230 if (FLAG_array_bounds_checks_elimination && !FLAG_idefs) { | 3166 if (FLAG_array_bounds_checks_elimination && !FLAG_idefs) { |
3231 Run<HBoundsCheckEliminationPhase>(); | 3167 Run<HBoundsCheckEliminationPhase>(); |
3232 } | 3168 } |
3233 if (FLAG_array_index_dehoisting) DehoistSimpleArrayIndexComputations(); | 3169 if (FLAG_array_index_dehoisting) DehoistSimpleArrayIndexComputations(); |
3234 if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>(); | 3170 if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>(); |
(...skipping 7005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10240 if (ShouldProduceTraceOutput()) { | 10176 if (ShouldProduceTraceOutput()) { |
10241 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 10177 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
10242 } | 10178 } |
10243 | 10179 |
10244 #ifdef DEBUG | 10180 #ifdef DEBUG |
10245 graph_->Verify(false); // No full verify. | 10181 graph_->Verify(false); // No full verify. |
10246 #endif | 10182 #endif |
10247 } | 10183 } |
10248 | 10184 |
10249 } } // namespace v8::internal | 10185 } } // namespace v8::internal |
OLD | NEW |