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