1// Copyright 2013 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_HYDROGEN_RANGE_ANALYSIS_H_
6#define V8_HYDROGEN_RANGE_ANALYSIS_H_
7
8#include "src/hydrogen.h"
9
10namespace v8 {
11namespace internal {
12
13
14class HRangeAnalysisPhase : public HPhase {
15 public:
16  explicit HRangeAnalysisPhase(HGraph* graph)
17      : HPhase("H_Range analysis", graph), changed_ranges_(16, zone()),
18        in_worklist_(graph->GetMaximumValueID(), zone()),
19        worklist_(32, zone()) {}
20
21  void Run();
22
23 private:
24  void TraceRange(const char* msg, ...);
25  void InferControlFlowRange(HCompareNumericAndBranch* test,
26                             HBasicBlock* dest);
27  void UpdateControlFlowRange(Token::Value op, HValue* value, HValue* other);
28  void InferRange(HValue* value);
29  void RollBackTo(int index);
30  void AddRange(HValue* value, Range* range);
31  void AddToWorklist(HValue* value) {
32    if (in_worklist_.Contains(value->id())) return;
33    in_worklist_.Add(value->id());
34    worklist_.Add(value, zone());
35  }
36  void PropagateMinusZeroChecks(HValue* value);
37  void PoisonRanges();
38
39  ZoneList<HValue*> changed_ranges_;
40
41  BitVector in_worklist_;
42  ZoneList<HValue*> worklist_;
43
44  DISALLOW_COPY_AND_ASSIGN(HRangeAnalysisPhase);
45};
46
47
48} }  // namespace v8::internal
49
50#endif  // V8_HYDROGEN_RANGE_ANALYSIS_H_
51